Программа вычисления выражения - 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

Объяснение кода листинга программы

  1. Значение переменной bx используется для доступа к памяти и предполагается, что она содержит адрес начала выражения.
  2. Значение, расположенное по адресу, указанному в bx, загружается в регистр ax и присваивается переменной a.
  3. Команда cwd выполняет расширение знака в регистре dx, чтобы дополнить знаки чисел, содержащихся в регистрах ax и dx.
  4. Значение, расположенное по адресу bx+2, загружается в регистр ax и добавляется к значению переменной a.
  5. Команда adc выполняет операцию сложения с учетом знака с единицей переноса, присваивая результат переменной dx.
  6. Значение, расположенное по адресу bx+2, загружается в регистр ax и добавляется к значению, полученному на предыдущем шаге.
  7. Команда adc выполняет операцию сложения с учетом знака с единицей переноса, присваивая результат переменной dx.
  8. Значение, расположенное по адресу bx+4, вычитается из регистра ax, и результат присваивается переменной a+2b-3c.
  9. Команда sbb выполняет операцию вычитания с учетом знака с единицей заема, присваивая результат переменной dx.
  10. Значение, расположенное по адресу bx+4, вычитается из регистра ax, и результат присваивается переменной a+2b-3c.
  11. Команда sbb выполняет операцию вычитания с учетом знака с единицей заема, присваивая результат переменной dx.
  12. Значение, расположенное по адресу bx+4, вычитается из регистра ax, и результат присваивается переменной a+2b-3c.
  13. Команда sbb выполняет операцию вычитания с учетом знака с единицей заема, присваивая результат переменной dx.
  14. Значение, расположенное по адресу bx+6, загружается в регистр ax и добавляется к значению, полученному на предыдущем шаге.
  15. Команда adc выполняет операцию сложения с учетом знака с единицей переноса, присваивая результат переменной dx.
  16. Значение в регистре ax сохраняется в памяти по адресу bx+8 и присваивается переменной m.

Оцени полезность:

10   голосов , оценка 3.5 из 5