我正在学习 x86 内联汇编编程。
我想写mov ecx, FFFFFFBB
,但是编译器无法识别它。像这样的十六进制数字应该如何写在内联汇编代码中?
我正在学习 x86 内联汇编编程。
我想写mov ecx, FFFFFFBB
,但是编译器无法识别它。像这样的十六进制数字应该如何写在内联汇编代码中?
这取决于您的汇编程序的风格。
movl $0xFFFFFFBB, %ecx
mov 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, imm32
mov 立即数指令之类的东西,只是使用不同的 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
.