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