Программа вычисления выражения - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д