如何在x86汇编编程中表示十六进制值如FFFFFFBB?

Arc*_*toi 7 x86 assembly inline-assembly

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

我想写mov ecx, FFFFFFBB,但编译器没有认识到它.这样的十六进制数应该如何用内联汇编代码编写?

Ben*_*oit 14

这取决于你的汇编程序的味道.

  • AT&T: movl $0xFFFFFFBB, %ecx
  • 英特尔: mov ecx, 0FFFFFFBBh

FYI,AT&T语法由汇编程序(如GNU Assembler)使用,而NASM和大多数其他语言使用Intel的.

  • 事实上,GNU as,FASM和NASM确实支持十六进制常量的`0xffffffbb`语法.(GNU需要`.intel_syntax noprefix`指令使用Intel语法,或`-masm = intel`传递给GCC). (2认同)

Pet*_*des 7

有关汇编程序手册和许多其他内容的链接,请参阅标记wiki.


不同的x86汇编程序支持十六进制常量中的一个或两个语法:

  • 0xDEADBEEF:NASM(和兼容),GNUas,FASM,MSVC内联asm(但不是 MASM)
  • 0DEADBEEFh:NASM(和兼容),FASM,MASM,TASM.

DOS/Windows专用汇编程序通常只支持...h语法.
便携式汇编程序通常支持0x...语法,或两者​​兼而有之.

注意前导0:数字常量总是必须以数字开头,以区别于符号名称.

另请注意,汇编程序(如C编译器)可以在汇编时计算表达式,因此您可以编写foo & 0xF(如果foo是汇编程序常量,使用foo equ 0xABC或者某些东西定义).你甚至可以添加/减去标签(链接时间常数,而不是汇编时间),所以像mov eax, OFFSET label - 20仍然组装的东西mov r32, imm32.


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
Run Code Online (Sandbox Code Playgroud)

大多数汇编程序也允许字符文字,例如'0'ASCII零.或者甚至'0123'将四个ASCII数字打包成32位整数.一些支持转义序列(\n'),一些(如YASM)不支持.NASM仅支持反引号内的转义序列,而不支持双引号.


其他平台:

ARM汇编程序:0xDEADBEEF有效.

我认为0x ......很典型.0 ... h主要是DOS的东西.

  • 我确实确认生成 16 位代码(1993 年发布的 1.52c)的最后一个版本的 VC++ 支持“0x”作为内联汇编的前缀。我使用了最新的 VS 2015 的 _MASM_,但它无法使用“0x”前缀组装程序集文件并因“错误 A2206:表达式中缺少运算符”而中止 (3认同)

Mar*_*c B 1

十六进制数字通常总是用前导 表示0x,因此您可以使用0xFFFFFFBB.

  • 例如,这不适用于 masm、tasm 和 wasm。 (5认同)