样品装配程序中的错误A2206

时间:2011-11-16 00:39:52

标签: assembly x86 masm

我正在阅读一本通过Visual C ++ Express使用MASM教授装配的书。

本书提供了以下示例程序来测试masm是否正常工作

.386
.model flat, c
.stack 100 h
printf PROTO arg1:Ptr Byte, printlist:VARARG
.data
msg1fmt byte "%s%d",0Ah,0
msg1 byte "The answer is: ",0
num1 sdword ?
num2 sdword ?
.code
main proc
mov num1,5
mov eax,num1
mov num2,eax
INVOKE printf, ADDR msg1fmt, ADDR msg1, num2
ret
main endp
end

问题是,它不起作用,而是我得到错误A2206:表达式中缺少运算符

但是,我看到没有丢失的操作员。我错过了什么或者还有其他问题吗?

1 个答案:

答案 0 :(得分:0)

您似乎使用了不一致的汇编程序表示法。标签可以通过在第1列中,也可以使用尾部冒号来确定:

.386
   .model flat, c
   .stack 100h
printf PROTO arg1:Ptr Byte, printlist:VARARG
   .data
msg1fmt byte "%s%d",0Ah,0
msg1 byte "The answer is: ",0
num1 sdword ?
num2 sdword ?
   .code
main proc
   mov num1,5
   mov eax,num1
   mov num2,eax
   INVOKE printf, ADDR msg1fmt, ADDR msg1, num2
   ret
main endp
end

- 或 -

.386
   .model flat, c
   .stack 100h
printf PROTO arg1:Ptr Byte, printlist:VARARG
   .data
msg1fmt:   byte "%s%d",0Ah,0
msg1:      byte "The answer is: ",0
num1:      sdword ?
num2:      sdword ?
   .code
main proc
   mov num1,5
   mov eax,num1
   mov num2,eax
   INVOKE printf, ADDR msg1fmt, ADDR msg1, num2
   ret
main endp
end

但混合符号会使汇编程序混淆,更重要的是人类。