x86 ASM 关于十六进制数的问题以及如何传输它们

逆向工程 部件 十六进制
2021-06-14 22:54:02

所以我想知道为什么我不能这样做

mov eax, ffffffffh

但我可以这样做:

mov eax, 0ffffffffh

请问有人可以解释一下吗?在这种情况下,我使用的是 Flat Assembler,但我认为这不是特定于汇编程序的。

1个回答

大多数汇编程序要求数字常量以数字开头,这样他们就可以区分它们和标签。

您可以在FASM 基本语法规则中看到它

数字与名称的区别在于,它们要么以十进制数字开头,要么以“$”字符后跟任何十六进制数字开头。这意味着即使令牌不是有效数字,也可以将其视为数字。要成为正确的数字,它必须是以下之一:十进制数(可选地在末尾附加字母“d”)、二进制数后跟字母“b”、八进制数后跟字母“o” " 或 "q",或以 "$" 或 "0x" 开头或后跟字符 "h" 的十六进制数。由于十六进制数的第一个数字可以是字母,因此可能需要在其前面加上数字零以使其可识别为数字。例如,“0Ah”

以及在MASM 手册中:

十六进制数字必须始终以十进制数字 (0–9) 开头。如有必要,添加前导零以区分符号和以字母开头的十六进制数字。

看着0ffffffffh你可以看到 8 个有效的十六进制数字,正如你所期望的那样。这不是唯一的0ffffffffh,另一个数字文字也应该用前导零编写 - 0d1h, 0aah, 0b0h

现在,汇编程序支持0xffffffff语法是很常见的如果您的不是(FLAT 支持),请务必注意前导零,否则十六进制值将被解释为标签或其他符号名称。