Программа вычисления выражения - Assembler
Формулировка задачи:
Приветствую! Написал программу, вроде правильно, но преподаватель говорит, что в последнем действии четырехбайтовая сумма превращается в трехбайтовую. Тут я не понял, т.к. сумма там двухбайтовая. Заранее Спасибо.
Вот задание: Вычислить выражение r=a+2b-3с+d. Операнды – двухбайтные; адресация – базовая.
Вот программа:
.MODEL tiny ; Программа и данные размещены в сегменте кода объемом 64 КБ .CODE ; Начало сегмента кода ; Размещение данных с адреса 500h org 500h a dw +30h b dw +10h c dw +30h d dw +20h r dw 0 ; Команды с адреса программы 100h org 100h begin: ; Метка начала программы mov bx, offset a mov ax,[bx] ; ax <- a add ax,[bx+2] ; ax <- a+b add ax,[bx+2] ; ax <- a+2b sub ax,[bx+4] ; ax <- a+2b-c sub ax,[bx+4] ; ax <- a+2b-2c sub ax,[bx+4] ; ax <- a+2b-3c add ax,[bx+6] ; ax <- a+2b-3c+d mov [bx+8],ax ; m <- a+2b-3c+d mov ah,4ch ; Функция DOS выхода int 21h ; из программы end begin ; Конец программы
Решение задачи: «Программа вычисления выражения»
textual
Листинг программы
mov ax,[bx] ; ax <- a cwd add ax,[bx+2] ; ax <- a+b adc dx, 0 add ax,[bx+2] ; ax <- a+2b adc dx, 0 sub ax,[bx+4] ; ax <- a+2b-c sbb dx, 0 sub ax,[bx+4] ; ax <- a+2b-2c sbb dx, 0 sub ax,[bx+4] ; ax <- a+2b-3c sbb dx, 0 add ax,[bx+6] ; ax <- a+2b-3c+d adc dx, 0 mov [bx+8],ax ; m <- a+2b-3c+d
Объяснение кода листинга программы
- Значение переменной bx используется для доступа к памяти и предполагается, что она содержит адрес начала выражения.
- Значение, расположенное по адресу, указанному в bx, загружается в регистр ax и присваивается переменной
a
. - Команда cwd выполняет расширение знака в регистре dx, чтобы дополнить знаки чисел, содержащихся в регистрах ax и dx.
- Значение, расположенное по адресу bx+2, загружается в регистр ax и добавляется к значению переменной
a
. - Команда adc выполняет операцию сложения с учетом знака с единицей переноса, присваивая результат переменной dx.
- Значение, расположенное по адресу bx+2, загружается в регистр ax и добавляется к значению, полученному на предыдущем шаге.
- Команда adc выполняет операцию сложения с учетом знака с единицей переноса, присваивая результат переменной dx.
- Значение, расположенное по адресу bx+4, вычитается из регистра ax, и результат присваивается переменной
a+2b-3c
. - Команда sbb выполняет операцию вычитания с учетом знака с единицей заема, присваивая результат переменной dx.
- Значение, расположенное по адресу bx+4, вычитается из регистра ax, и результат присваивается переменной
a+2b-3c
. - Команда sbb выполняет операцию вычитания с учетом знака с единицей заема, присваивая результат переменной dx.
- Значение, расположенное по адресу bx+4, вычитается из регистра ax, и результат присваивается переменной
a+2b-3c
. - Команда sbb выполняет операцию вычитания с учетом знака с единицей заема, присваивая результат переменной dx.
- Значение, расположенное по адресу bx+6, загружается в регистр ax и добавляется к значению, полученному на предыдущем шаге.
- Команда adc выполняет операцию сложения с учетом знака с единицей переноса, присваивая результат переменной dx.
- Значение в регистре ax сохраняется в памяти по адресу bx+8 и присваивается переменной
m
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д