Вычисление выражения - Assembler (223181)
Формулировка задачи:
Здравствуйте, мне нужно составить программу, которая посчитает выражение r3 = b + c * a^2. Есть код, который считает r2 = a - b * 10 - c
Я пытался его переделать под свой вариант, вот что получилось
И потом через codeview смотрел на регистр AX (там должен быть ответ), но не совпало с тем, что посчитал я. Буду рад если поможете. Спасибо
Листинг программы
- .model small
- .stack 100h
- .data
- a DWORD 100
- b DWORD 4
- d DWORD 10
- r2 DWORD ?
- .code
- .386
- main PROC
- mov ax, @data
- mov ds, ax
- mov ebx, a
- mov ecx, b
- mov edx, d
- call EvaluationExpression
- mov r2, eax
- mov ax, 4C00h
- int 21h
- main ENDP
- EvaluationExpression PROC USES ebx ecx edx
- CLC
- mov eax, ecx
- mov ecx, 10
- mul ecx
- mov ecx, eax
- mov eax, ebx
- sub eax, ecx
- sub eax, edx
- ret
- EvaluationExpression ENDP
- end main
Листинг программы
- .model small
- .stack 100h
- .data
- a DWORD 100
- b DWORD 4
- d DWORD 10
- r2 DWORD ?
- .code
- .386
- main PROC
- mov ax, @data
- mov ds, ax
- mov ebx, a
- mov ecx, b
- mov edx, d
- call EvaluationExpression
- mov r2, eax
- mov ax, 4C00h
- int 21h
- main ENDP
- EvaluationExpression PROC USES ebx ecx edx
- CLC
- mov eax, ebx
- mul ebx
- mul edx
- mov ebx, eax
- add ebx, ecx
- ret
- EvaluationExpression ENDP
- end main
Решение задачи: «Вычисление выражения»
textual
Листинг программы
- .model small
- .stack 100h
- .data
- av DWORD 100
- bv DWORD 4
- cv DWORD 10 ;cv, а не c - т.к. компилятор выдаёт ошибку компиляции
- r3 DWORD ?
- .code
- .386
- main PROC
- mov ax, @data
- mov ds, ax
- mov ebx, av
- mov ecx, bv
- mov edx, cv
- call EvaluationExpression
- mov r3, eax
- mov ax, 4C00h
- int 21h
- main ENDP
- EvaluationExpression PROC USES ebx ecx edx
- mov esi, edx
- mov eax, ebx
- mul ebx ;eax:=a^2
- mul esi ;eax:=(a^2)*c
- add eax, ecx
- ret
- EvaluationExpression ENDP
- end main
Объяснение кода листинга программы
- Создаётся программа с моделью
small
и размером стека 100h. - В секции .data объявляются переменные:
av
с значением DWORD 100,bv
с значением DWORD 4,cv
с значением DWORD 10,r3
, неинициализированной переменной типа DWORD.
- В секции .code указывается использование 386-ого набора команд.
- В процедуре
main
происходит следующее:- Копируется адрес сегмента данных в регистр
ax
. - Затем значение
ax
перемещается в регистрds
. - Значение переменных
av
,bv
иcv
загружаются в регистрыebx
,ecx
иedx
соответственно. - Вызывается процедура
EvaluationExpression
. - Результат процедуры (значение в регистре
eax
) сохраняется в переменнойr3
. - Происходит выход из программы.
- Копируется адрес сегмента данных в регистр
- Процедура
EvaluationExpression
принимает аргументы через стек:- Значение
cv
(в регистреedx
) копируется в регистрesi
. - Значение
av
перемещается в регистрeax
. - Выполняется умножение
eax
наebx
(результат вeax
- это квадратav
). - Умножается
eax
наesi
(результат вeax
). - К
eax
прибавляется значениеecx
. - Производится возврат из процедуры с результатом в
eax
.
- Значение
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д