нужна помощь в решении задач, сразу оговорюсь, что разбираюсь в ассемблере плохо
Задание 1
вычислить
y,z –байты, x,v –слова
Наборы:
X=-2h, y=7h, z=3h, v=-1Ah
X=FBEh, y=56h, z=-7Fh, v=2E60h
мой код
Код:
.model small
.stack 100h
.data
var_x dw -2h
var_y db 7h
var_z db 3h
var_v dw ?
.code
prog_a2:
mov ax, @data ;
mov ds, ax ;
mov al, var_z ; копируем z в al
cbw ; преобразование байта al в слово ax
mov bx,3 ;
imul bx ; умножаем 3*z
inc ax ; 3z+1
imul var_x ; x*(3*z+1)
sub bx,bx ; очиищаем
mov bl, var_y ; помещаем значение у
cbw ;
sub ax, bx ; -y+x*(3*z+1)
adc dx,0 ; вычисляем старшее число числителя
mov bx,ax ; копируем значение -y+x*(3*z+1)
mov al, var_z ;
cbw ;
sub ax,2 ; вычитаем z-2
xchg ax,bx ; меняем местами
idiv bx ; делим
mov var_v, ax ;
end prog_a2
проблема тут заключается в том что ответ -1Ah, т.е. FFE6h а у меня получается FFE5h
Задание 2.
Формулировка:
Дана строка из четырех десятичных цифр. Если первая цифра делится на 3, а четвертая нет, то увеличить третью цифру (кроме «9») на 1, иначе поменять местами вторую и четвертую
алгоритм:
Если первая цифра делится на 3, а четвертая нет
То увеличить третью цифру на 1
Если третья цифра равна 9 ничего не делаем
Иначе поменять местами вторую и четвертую
вот что получилось у меня
Код:
.model small
.stack 100h
.data
N db '3321'
.code
prog_a3:
mov ax, @data
mov ds, ax
sub ax,ax
mov al,N[1]; в этом блоке проверяю делимость на 3 первой цифры, если нет остатка значит разделилось
mov bl,3;
idiv bl;
cmp ah,0;
jne X;
mov al,N[4]; проверяем делимость 4-ой цифры
idiv bl
cmp ah,0
je X
mov bl,9; этот блок проверяет является ли эта цифра девяткой
mov bh, N[3]
cmp bl,bh
je X
inc bh
jmp EXIT
X:
mov al,N[2] ; в этом блоке меняем местами 2-ю и 4-ю цифру
mov ah,N[4]
xchg al,ah
jmp EXIT
EXIT:
nop
end prog_a3
тут основная проблема в том, что запутался я в этих командах перехода(
Задание 3.
Даны массивы А и В из 16 байтов. Сосчитать количество равных элементов с одинаковыми порядковыми номерами (и дающих при делении на 3 остаток 2) и скопировать адреса (смещения) таких элементов в массив С
тут вообще у меня глухо...
Задание 4.
Текст для шифрования вводится в командной строке. В тексте – только
прописные латинские буквы и пробелы. Зашифровать текст в соответствии с таблицами (каждая буква заменяется на три строчные буквы: номер строки, номер столбца; пробел кодируется как brd). Пример: слово CRAB заменяется на xpwypcxpuxpv. В программе должны быть одна или две подпрограммы для шифрования символа (или группы символов). Попытаться «угадать» закон, по которому шифруются символы, а не шифровать каждый символ по отдельности.
вот эти 2 таблицы по которым шифруются буквы
Код:
x u v w x
p A B C D
q E F G H
r I J K L
s M N O
Код:
y a b c d
p P Q R S
q T U V W
r X Y Z
s
Код:
у меня есть код похожей программы
текст для шифрования вводится в командной строке. В тексте – только прописные латинские буквы и пробелы. Удалить пробелы, заменить букву ‘J’ на букву ‘I’ и зашифровать текст в соответствии с таблицей.
1 2 3 4 5
1 A B C D E
2 F J H I K
3 L M N O P
4 Q R S T U
5 V W X Y Z
Текст программы:
.MODEL small
.STACK 100h
.DATA
text DB 83 DUP(?)
msg1 DB "No text",0dh,0ah,'$'
msg2 DB "Non allowed symbols",0dh,0ah,'$'
.CODE
;-----------------------------------------------------------
; Подпрограмма шифровки символа
; Вход: AL – код символа
; Выход: AХ – код зашифрованного символа
;-----------------------------------------------------------
encode PROC
cmp al,'A' ; Если код символа не ниже кода ‘A’
jb error
cmp al,'Z' ; и не выше кода ‘Z’,
ja error
cmp al,'J' ; проверить, является ли символ буквой J,
jae z
jmp s
z:cmp al,'J'
je r
dec al
jmp s
r: mov al,'I' ; если является, то заменить его на букву I.
s: sub al,'A' ; Получить код символа, начиная с 0.
;
; Вычисление нового кода по формуле ‘код’/5, в AL – 1-я цифра кода, в AH – 2-я.
mov ah,0
mov bl,5
div bl
mov bx,ax
mov al,bh ; Частное помещаем в AL.
mov ah,bl ; Остаток от деления – в AH.
add ah,'1' ; Увеличиваем на 1 содержание AH
add al,'1' ; и AL.
xchg al,ah ; Меняем местами содержимое AH и AL.
clc ; Нормальное завершение.
ret
error: stc ; На входе символ, отличный от прописной латинской буквы
ret
encode ENDP
start: mov ax,@data
mov ds,ax
; Копирование цифр из хвоста командной строки в строку для обработки
mov cx,0
mov cl,es:[80h] ; Длина хвоста командной строки в CX.
jcxz empty ; Если хвост пустой – на empty.
dec cx ; Не нужно учитывать начальный пробел.
mov si,82h ; Смещение хвоста – в SI.
mov di,OFFSET text ; Указатель для новой строки – в DI.
;
; Цикл обработки элементов строки
n: mov al,es:[si] ; Очередной символ хвоста – в AL
cmp al,' ' ; Если встретился пробел,
je cont ; то пропустить его,
call encode ; а символ – зашифровать
jc no_A_Z ; Переход, если встретился недопустимый символ
mov [di],ax ; Поместить зашифрованный символ в строку-приемник
inc di ; Переместить указатель
inc di ; в строке-приемнике
cont: inc si ; Переместить указатель в исходной строке
loop n
;
; Поместить в строку приемник символы ВК и ПС, а также терминатор
mov word ptr [di],0a0dh
inc di
inc di
mov byte ptr [di],'$'
;
; Вывод итоговой строки на экран
mov dx,OFFSET text
mov ah,9h
int 21h
jmp short fin
;
; Вывод сообщений об ошибках
empty: mov dx,OFFSET msg1
mov ah,9h
int 21h
jmp short fin
no_A_Z: mov dx,OFFSET msg2
mov ah,9h
int 21h
;
; Завершение работы программы
fin: mov ax,4c00h
int 21h
END start