Программа вычисления выражения - Assembler

Узнай цену своей работы

Формулировка задачи:

Приветствую! Написал программу, вроде правильно, но преподаватель говорит, что в последнем действии четырехбайтовая сумма превращается в трехбайтовую. Тут я не понял, т.к. сумма там двухбайтовая. Заранее Спасибо. Вот задание: Вычислить выражение r=a+2b-3с+d. Операнды – двухбайтные; адресация – базовая. Вот программа:
Листинг программы
  1. .MODEL tiny ; Программа и данные размещены в сегменте кода объемом 64 КБ
  2. .CODE ; Начало сегмента кода
  3. ; Размещение данных с адреса 500h
  4. org 500h
  5. a dw +30h
  6. b dw +10h
  7. c dw +30h
  8. d dw +20h
  9. r dw 0
  10. ; Команды с адреса программы 100h
  11. org 100h
  12. begin: ; Метка начала программы
  13. mov bx, offset a
  14. mov ax,[bx] ; ax <- a
  15. add ax,[bx+2] ; ax <- a+b
  16. add ax,[bx+2] ; ax <- a+2b
  17. sub ax,[bx+4] ; ax <- a+2b-c
  18. sub ax,[bx+4] ; ax <- a+2b-2c
  19. sub ax,[bx+4] ; ax <- a+2b-3c
  20. add ax,[bx+6] ; ax <- a+2b-3c+d
  21. mov [bx+8],ax ; m <- a+2b-3c+d
  22. mov ah,4ch ; Функция DOS выхода
  23. int 21h ; из программы
  24. end begin ; Конец программы

Решение задачи: «Программа вычисления выражения»

textual
Листинг программы
  1. mov ax,[bx]       ; ax <- a
  2. cwd
  3.  
  4. add ax,[bx+2]        ; ax <- a+b
  5. adc dx, 0
  6.  
  7. add ax,[bx+2]       ; ax <- a+2b
  8. adc dx, 0
  9.  
  10. sub ax,[bx+4]            ;  ax <- a+2b-c
  11. sbb dx, 0
  12.  
  13. sub ax,[bx+4]            ;  ax <- a+2b-2c
  14. sbb dx, 0
  15.  
  16. sub ax,[bx+4]            ;  ax <- a+2b-3c
  17. sbb dx, 0
  18.  
  19. add ax,[bx+6]       ; ax <- a+2b-3c+d
  20. adc dx, 0
  21.  
  22. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут