10

我正在学习 x86 内联汇编编程。

我想写mov ecx, FFFFFFBB,但是编译器无法识别它。像这样的十六进制数字应该如何写在内联汇编代码中?

4

4 回答 4

20

这取决于您的汇编程序的风格。

  • 美国电话电报公司:movl $0xFFFFFFBB, %ecx
  • 英特尔:mov ecx, 0FFFFFFBBh

仅供参考,AT&T 语法被GNU Assembler等汇编程序使用,而NASM和大多数其他人使用英特尔的。

于 2012-07-31T07:20:39.877 回答
13

请参阅标记 wiki 以获取汇编器手册和许多其他内容的链接。


不同的 x86 汇编器支持以下一种或两种十六进制常量语法:

  • 0xDEADBEEFNASM(和兼容)、GNUasFASM、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 位立即数。


NASM 手册中关于常量的部分

一些例子(都产生完全相同的代码):

    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 的东西。

于 2016-05-11T03:14:23.910 回答
2

这取决于您的汇编程序,但十六进制文字的常见表示法是0FFFFFFBBh.

于 2012-07-31T05:35:28.923 回答
1

十六进制数字通常总是用前导表示0x,所以你会使用0xFFFFFFBB.

于 2012-07-31T05:35:19.087 回答