【发布时间】:2016-08-26 16:56:39
【问题描述】:
这可能是一个有点愚蠢的语法问题,但是有没有一种方法可以根据变量类型进行条件跳转?我正在尝试编写一个宏(对于一个类),它可以将一个字节、字或双字作为参数并将其写入屏幕。
mWriteInt MACRO integer:REQ
;cmp integer, DWORD
;je dwordOp
movsx eax, word ptr integer
call WriteInt
mov edx, OFFSET endl
call WriteString
; for a DWORD
; dwordOp:
ENDM
所以基本上,执行的代码应该根据传递给宏的变量类型而有所不同。无论我如何尝试执行此操作,都会出现编译器错误。
我试过了:
cmp integer, DWORD
cmp TYPE integer, DWORD
我真的不知道从这里去哪里。我已经查看了我能想到的所有参考资料,但这似乎并不常见
编辑:
mWriteInt MACRO integer:REQ
IF (TYPE integer EQ TYPE DWORD)
call WriteInt
ENDIF
IF (TYPE integer EQ TYPE BYTE)
call WriteInt
ENDIF
IF (TYPE integer EQ TYPE WORD)
movsx eax, word ptr integer
call WriteInt
ENDIF
mov edx, OFFSET endl
call WriteString
ENDM
【问题讨论】:
-
您通常不会使用 CPU 指令进行比较,而是使用像 IF 这样的指令。
-
MASM 中的 IF 指令不像 C 中的 if 语句那样工作。msdn.microsoft.com/en-us/library/4bd8b239.aspx
-
好的,我应该在发布之前用谷歌搜索一下。我再次尝试,没有错误并且它运行,但它似乎没有工作。无论我通过什么类型,代码似乎永远不会执行
-
想想您希望宏生成的指令:
cmp immediate, immediate。没有这样的编码,因为那将是一个无用的指令。无论如何,既然你已经摆脱了那个脑残,你应该将你的答案作为答案发布,而不是作为对问题的编辑。 -
@PeterCordes 感谢您的输入,但我不太明白您所说的立即,立即是什么意思?我还发布了一个编辑,因为代码仍然没有按照预期的方式执行,但是如果我应该将它作为答案发布,我深表歉意