Арифметические операции в ассемблере

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
NNNG7
Сообщения: 1
Зарегистрирован: 07 сен 2013, 18:25

07 сен 2013, 18:27

Здравствуйте ! Нуждаюсь в Вашей помощи .
Пытаюсь 1-ый раз написать программу на ассемблере .
Посмотрите , пожалуйста , так ли я решаю задание , есть ли ошибки ? И правильные ли комментарии ? Я немного запутался уже что и куда сохраняется , так как новичок совсем .
Не могу понять на счёт деления , остатка . Если сможете , объясните, как с ним работать .

Буду очень благодарен Вашим ответам !


;найти (b-d*e)/(a-c)
;a=6
;b=22
;c=95
;d=2410
;e=1995


title Proga1
.386
.model flat
.data ;определение данных
a db 5
b db 22
c db 95
d dw 2410
e dw 1995
res dw 0 ;результат


.code ;начало сегмента команд
Begin:
mov ax, d
mul ax,e ; умножение d*e , результат сохраняется в регистре ax

mov ebx, b ; помещаем в регистр ebx значение b
sub ebx,ax ; вычитание b-d*e, результат сохраняется в регистре ebx

mov bx, a ;помещаем в регистр bx значение a
sub bx,c ;вычитаем a-c , результат сохраняется в регистре bx
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

08 сен 2013, 19:20

1) После произведения D*E результат явно выходит за границы 16 бит и в регистре AX будет только младшая часть результата. Старшие 16 бит будут в DX
2) Инструкция mov ebx, b недопустима, т.к. размеры операндов разные (32 и 8 бит). Если требуется беззнаковая загрузка, то нужно использовать movzx ebx, b
3) Иструкция sub ebx, ax неверна по той же причине (32 бита и 16 бит), к тому же в AX только часть произведения
4) mov bx, a - тоже самое, нужно использовать movzx
5) sub bx, c - неверный размер операндов (16 бит и 8 бит)
6) DS не указывает на .data, не хватает assume. Все операции с переменными будут производится по неверным адресам (с другими ячейками памяти)
It's a long way to the top if you wanna rock'n'roll
Ответить