Вы ошибочно полагаете, что инструкции add
, sub
принимают только один параметр. Это верно только для mul
, imul
, div
и idiv
. Поэтому измените свой код на
add3 MACRO destination, source1, source2
mov eax, source1
add eax, source2
mov destination, eax
ENDM
sub3 MACRO destination, source1, source2
mov eax, source1
sub eax, source2
mov destination, eax
ENDM
mul3 MACRO destination, source1, source2
mov eax, source1
mul source2
mov destination, eax ; This is only the low 32-bit result of high(EDX):low(EAX)
ENDM
div3 MACRO destination, source1, source2
xor edx, edx ; Clear upper half of input EDX:EAX
mov eax, source1
div source2
mov destination, eax
ENDM
Эти изменения должны исправить некоторые серьезные ошибки вашего кода.
Теперь относительно вашего main
кода:
; Ex1. x = (w + y) * z
mov x, ? ; YOU CANNOT SET a register to an unknown value - it already is. Remove this line instead.
mov y, 1 ; OK
mov z, 2 ; OK
mov w, 3 ; OK
add3 temp, w, y ; temp = w + y
mul3 x, temp, z ; x = temp * z - Here 'x' is replaced with a value
mov eax, x ; Set the parameter EAX to the value 'x'
call WriteInt ; Write the value in EAX and...
call Crlf ; ...proceed to the next line
Я не проверял этот код, но он должен привести к правильному значению 8
.
Также добавьте
main ENDP
инструкция в конце и, при необходимости, main ENDS
в качестве последней строки.