Assembly 如何在x86汇编编程中表示十六进制值,如FFFFFF BB?
我正在学习x86内联汇编编程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的语法。有
我想写
mov-ecx,ffffff-bb
,但是编译器无法识别它。像这样的十六进制数应该如何在内联汇编代码中写入?十六进制数通常用前导的0x
表示,因此您应该使用0xffffbb
这取决于您的汇编程序,但十六进制文字的常用符号是0ffffbbh
这取决于汇编程序的风格
- AT&T:
movl$0xFFFFFFBB,%ecx
- 英特尔:
mov-ecx,0FFFFFFBBh
不同的x86汇编器支持十六进制常量的一种或两种语法:
:(和compat),MSVC内联asm(但不是MASM),emu80860xDEADBEEF
:NASM(和compat)、FASM、TASM、emu80860DEADBEEFh
…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