我正在学习 x86 内联汇编编程。
我想写mov ecx, FFFFFFBB,但是编译器无法识别它。像这样的十六进制数字应该如何写在内联汇编代码中?
我正在学习 x86 内联汇编编程。
我想写mov ecx, FFFFFFBB,但是编译器无法识别它。像这样的十六进制数字应该如何写在内联汇编代码中?
这取决于您的汇编程序的风格。
movl $0xFFFFFFBB, %ecxmov ecx, 0FFFFFFBBh仅供参考,AT&T 语法被GNU Assembler等汇编程序使用,而NASM和大多数其他人使用英特尔的。
请参阅x86标记 wiki 以获取汇编器手册和许多其他内容的链接。
不同的 x86 汇编器支持以下一种或两种十六进制常量语法:
0xDEADBEEF:NASM(和兼容)、GNUas、FASM、MSVC 内联汇编(但不是MASM)、emu8086。0DEADBEEFh:NASM(和兼容)、FASM、MASM、TASM、emu8086。DOS/Windows-only 汇编器通常只支持...h语法。
可移植汇编器通常支持0x...语法,或两者兼而有之。
注意前导0:数字常量总是必须以十进制数字开头,以将它们与符号名称区分开来。 (我如何在 masm 代码中编写以字母开头的十六进制数字?专门针对此,用于尾随-h 样式。)
另请注意,汇编器(如 C 编译器)可以在汇编时评估表达式,因此您可以编写foo & 0xF(如果foo是汇编器常量,定义为foo equ 0xABC或其他内容)。您甚至可以从标签中加/减(它们是链接时常量,而不是汇编时),因此诸如mov eax, OFFSET label - 20仍然汇编为mov r32, imm32mov 立即数指令之类的东西,只是使用不同的 32 位立即数。
一些例子(都产生完全相同的代码):
mov ax,200 ; decimal mov ax,0200 ; still decimal mov ax,0200d ; explicitly decimal mov ax,0d200 ; also decimal mov ax,0c8h ; hex mov ax,$0c8 ; hex again: the 0 is required mov ax,0xc8 ; hex yet again mov ax,0hc8 ; still hex mov ax,310q ; octal mov ax,310o ; octal again mov ax,0o310 ; octal yet again mov ax,0q310 ; octal yet again mov ax,11001000b ; binary mov ax,1100_1000b ; same binary constant mov ax,1100_1000y ; same binary constant once more mov ax,0b1100_1000 ; same binary constant yet again mov ax,0y1100_1000 ; same binary constant yet again
大多数汇编器还允许使用字符文字,例如'0'ASCII 零。甚至'0123'对于打包成 32 位整数的四个 ASCII 数字。有些支持转义序列(\n'),有些(如 YASM)不支持。NASM 仅支持反引号内的转义序列,不支持双引号。
其他平台:
ARM汇编程序:0xDEADBEEF有效。
我认为 0x... 是典型的。0...h 主要是 DOS 的东西。
这取决于您的汇编程序,但十六进制文字的常见表示法是0FFFFFFBBh.
十六进制数字通常总是用前导表示0x,所以你会使用0xFFFFFFBB.