Ирвин ч10. Трехоперандные инструкции с использованием макроса в MASM - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь сделать 4 макроса и пытаюсь вычислить 4 операции с ним.Но синтаксическая ошибка возникает, когда я собираю код

Я использую VS2017, и я написал код, основываясь на инструкциях книги.

add3 MACRO destination, source1, source2
mov eax, source1
add source2
mov destination, eax
ENDM

sub3 MACRO destination, source1, source2
mov eax, source1
sub source2
mov destination, eax
ENDM

mul3 MACRO destination, source1, source2
mov eax, source1
mul source2
mov destination, eax
ENDM

div3 MACRO destination, source1, source2
mov eax, source1
div source2
mov destination, source1
ENDM

.data
temp DWORD 0
x   DWORD ?
y   DWORD ?
z   DWORD ?

.code
main PROC

; Ex1. x = (w + y) * z
mov x, ?
mov y, 1
mov z, 2
mov w, 3
add3 temp, w, y     ; temp = w + y
mul3 x, temp, z     ; x = temp * z
mov eax, x
call    WriteInt
call    Crlf

Полученное сообщение об ошибке, как показано ниже,При отладке моей программы возникает много синтаксических ошибок.

13_4.asm(45): error A2008: syntax error : in instruction
1>13_4.asm(56): error A2008: syntax error : ,
1>13_4.asm(57): error A2008: syntax error : ,
1>13_4.asm(67): error A2008: syntax error : ,
1>13_4.asm(68): error A2008: syntax error : ,
1>13_4.asm(78): error A2008: syntax error : ,
1>13_4.asm(79): error A2008: syntax error : ,
1>13_4.asm(41): error A2009: syntax error in expression
1>13_4.asm(44): error A2006: undefined symbol : w
1>13_4.asm(45): error A2006: undefined symbol : w
1>13_4.asm(52): error A2009: syntax error in expression
1>13_4.asm(55): error A2006: undefined symbol : w
1>13_4.asm(58): error A2006: undefined symbol : w
1>13_4.asm(65): error A2009: syntax error in expression
1>13_4.asm(66): error A2006: undefined symbol : w
1>13_4.asm(75): error A2009: syntax error in expression
1>13_4.asm(77): error A2006: undefined symbol : w

1 Ответ

1 голос
/ 03 июня 2019

Вы ошибочно полагаете, что инструкции 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 в качестве последней строки.

...