Вычисление выражения - Assembler (223181)

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

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

Здравствуйте, мне нужно составить программу, которая посчитает выражение r3 = b + c * a^2. Есть код, который считает r2 = a - b * 10 - c
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. a DWORD 100
  5. b DWORD 4
  6. d DWORD 10
  7. r2 DWORD ?
  8. .code
  9. .386
  10. main PROC
  11. mov ax, @data
  12. mov ds, ax
  13. mov ebx, a
  14. mov ecx, b
  15. mov edx, d
  16. call EvaluationExpression
  17. mov r2, eax
  18. mov ax, 4C00h
  19. int 21h
  20. main ENDP
  21. EvaluationExpression PROC USES ebx ecx edx
  22. CLC
  23. mov eax, ecx
  24. mov ecx, 10
  25. mul ecx
  26. mov ecx, eax
  27. mov eax, ebx
  28. sub eax, ecx
  29. sub eax, edx
  30. ret
  31. EvaluationExpression ENDP
  32. end main
Я пытался его переделать под свой вариант, вот что получилось
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4. a DWORD 100
  5. b DWORD 4
  6. d DWORD 10
  7. r2 DWORD ?
  8. .code
  9. .386
  10. main PROC
  11. mov ax, @data
  12. mov ds, ax
  13. mov ebx, a
  14. mov ecx, b
  15. mov edx, d
  16. call EvaluationExpression
  17. mov r2, eax
  18. mov ax, 4C00h
  19. int 21h
  20. main ENDP
  21. EvaluationExpression PROC USES ebx ecx edx
  22. CLC
  23. mov eax, ebx
  24. mul ebx
  25. mul edx
  26. mov ebx, eax
  27. add ebx, ecx
  28. ret
  29. EvaluationExpression ENDP
  30. end main
И потом через codeview смотрел на регистр AX (там должен быть ответ), но не совпало с тем, что посчитал я. Буду рад если поможете. Спасибо

Решение задачи: «Вычисление выражения»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4.     av DWORD 100
  5.     bv DWORD 4
  6.     cv DWORD 10     ;cv, а не c - т.к. компилятор выдаёт ошибку компиляции
  7.     r3 DWORD ?
  8. .code
  9. .386
  10. main PROC
  11.     mov ax, @data
  12.     mov ds, ax
  13.  
  14.     mov ebx, av
  15.     mov ecx, bv
  16.     mov edx, cv
  17.     call EvaluationExpression
  18.     mov r3, eax
  19.  
  20.     mov ax, 4C00h
  21.     int 21h
  22. main ENDP
  23.  
  24. EvaluationExpression PROC USES ebx ecx edx
  25.     mov esi, edx
  26.     mov eax, ebx
  27.     mul ebx     ;eax:=a^2
  28.     mul esi     ;eax:=(a^2)*c
  29.     add eax, ecx
  30.     ret
  31. EvaluationExpression ENDP
  32. end main

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

  1. Создаётся программа с моделью small и размером стека 100h.
  2. В секции .data объявляются переменные:
    • av с значением DWORD 100,
    • bv с значением DWORD 4,
    • cv с значением DWORD 10,
    • r3, неинициализированной переменной типа DWORD.
  3. В секции .code указывается использование 386-ого набора команд.
  4. В процедуре main происходит следующее:
    • Копируется адрес сегмента данных в регистр ax.
    • Затем значение ax перемещается в регистр ds.
    • Значение переменных av, bv и cv загружаются в регистры ebx, ecx и edx соответственно.
    • Вызывается процедура EvaluationExpression.
    • Результат процедуры (значение в регистре eax) сохраняется в переменной r3.
    • Происходит выход из программы.
  5. Процедура EvaluationExpression принимает аргументы через стек:
    • Значение cv (в регистре edx) копируется в регистр esi.
    • Значение av перемещается в регистр eax.
    • Выполняется умножение eax на ebx (результат в eax - это квадрат av).
    • Умножается eax на esi (результат в eax).
    • К eax прибавляется значение ecx.
    • Производится возврат из процедуры с результатом в eax.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

15   голосов , оценка 3.933 из 5

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

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

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