Assembly 如何在x86汇编编程中表示十六进制值,如FFFFFF BB?

Assembly 如何在x86汇编编程中表示十六进制值,如FFFFFF BB?,assembly,x86,hex,inline-assembly,Assembly,X86,Hex,Inline Assembly,我正在学习x86内联汇编编程 我想写mov-ecx,ffffff-bb,但是编译器无法识别它。像这样的十六进制数应该如何在内联汇编代码中写入?十六进制数通常用前导的0x表示,因此您应该使用0xffffbb 这取决于您的汇编程序,但十六进制文字的常用符号是0ffffbbh这取决于汇编程序的风格 AT&T:movl$0xFFFFFFBB,%ecx 英特尔:mov-ecx,0FFFFFFBBh 仅供参考,AT&T语法由GNU汇编程序等汇编程序使用,而NASM和大多数其他程序使用Intel的语法。有

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


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

十六进制数通常用前导的
0x
表示,因此您应该使用
0xffffbb

这取决于您的汇编程序,但十六进制文字的常用符号是
0ffffbbh

这取决于汇编程序的风格

  • AT&T:
    movl$0xFFFFFFBB,%ecx
  • 英特尔:
    mov-ecx,0FFFFFFBBh
仅供参考,AT&T语法由GNU汇编程序等汇编程序使用,而NASM和大多数其他程序使用Intel的语法。

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


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

  • 0xDEADBEEF
    :(和compat),MSVC内联asm(但不是MASM),emu8086
  • 0DEADBEEFh
    :NASM(和compat)、FASM、TASM、emu8086
仅限DOS/Windows的汇编程序通常只支持
…h
语法。
便携式汇编程序通常支持
0x…
语法,或者两者都支持

注意前面的
0
: 数值常量始终必须以十进制数字开头,以区别于符号名称。
(对于尾随h样式,特别是这一点。)

还请注意,汇编程序,如C编译器,可以在汇编时计算表达式,因此您可以编写
foo&0xF
(如果
foo
是一个汇编程序常量,用
foo eq 0xABC
或其他东西定义)。您甚至可以从标签(链接时间常数,而不是汇编时间)中进行添加/减去,因此像
mov eax、OFFSET label-20
这样的东西仍然可以汇编到
mov r32、imm32
mov immediate指令,只需使用不同的32位immediate即可


从:

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


大多数汇编器也允许字符文本,比如ASCII零的
'0'
。甚至是压缩成32位整数的四个ASCII数字的
'0123'
。有些支持转义序列(
\n'
),有些(比如YASM)不支持。NASM只支持反引号内的转义序列,而不支持双引号


其他平台:

0xDEADBEEF
有效


我想。。。这是典型的。0…h主要是DOS。< /P> IM采用VC++ 10,数字MARS C++ 10和FASM都使用英特尔风格。0ffffbbhin事实上,GNU as、FASM和NASM确实支持十六进制常量的
0xffffbb
语法。(GNU as需要
.intel_syntax noprefix
指令来使用英特尔语法,或者
-masm=intel
传递给GCC)。@Ruslan我不知道GCC中的那个功能!谢谢什么编译器/汇编器?专门针对MASM的另一个版本:MASM汇编器本身不理解0x前缀,即使是在现代版本的Microsoft汇编器上。如果您在VC/VC++中编译内联汇编代码,它应该在
\uu asm
语句中接受它。我不知道权威来源,但这是我多年来使用MASM/Visual C/C++的经验。我确实确认,生成16位代码(1993年发布的1.52c)的上一版本VC++支持将
0x
作为带内联汇编的前缀。我使用了最新的VS 2015的MASM,它未能使用
0x
前缀组装程序集文件,并因
错误A2206:表达式中缺少运算符而中止
@MichaelPetch:感谢您的检查。更新了我的答案,使之不偏向DOS风格的
0…h
所需语法,即使我个人不喜欢它。例如,这对masm、tasm和wasm不起作用。十六进制数字也可能看起来像:
ffffff bbh
,后面是
h
,而不是前导的
0x
    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