我发现自己经常无法立即识别数字是十进制还是十六进制(如果十六进制数字没有前缀或字母)。例如,上一个问题中有一个类似的数字0000000000400078
,但不确定是哪个数字。
有没有一种方法可以在x86_64中明确指定带前缀的十进制数字?例如:
mov %rsp, %rbp
movb $0x16, -1(%rbp)
movb $0d22 -2(%rbp) # <-- something like this
movb $0b10110, -3(%rbp)
我知道这样做是movb $22, -2(%rbx)
可行的,但是有没有一种方法可以明确地给它加上前缀/后缀,以便我们知道它是十进制的?
不,不是针对GAS。https://sourceware.org/binutils/docs/as/Integers.html -十进制整数与非零数字开始,接着是零个或多个数字(0123456789
)。
调试器或objdump输出中屏幕上的十六进制数字有时会省略一个0x
,例如0000000000400078
十六进制。您必须从上下文中知道地址几乎总是以十六进制打印。
在asm源代码中,规则是简单,明确且不依赖上下文的。在GAS源代码中,如果看不到显式的基本替代,则为十进制。这适用于$123
立即数,123(%reg)
位移,.set xyz, 123
汇编程序指令操作数,.long 123
伪指令,以将字节/双字发送到输出中,以及适用于GAS允许您编写数字文字的所有其他上下文。
它也适用于GAS支持的所有ISA-请注意,GAS手册的这一部分不属于一个特定的ISA。对于x86-64,它当然适用于两种.intel_syntax noprefix
模式,也适用于AT&T模式。
不同的汇编器可能支持以不同的基数写数字的不同方式,至少对于非十进制的基数;这个答案是针对GAS(GNU汇编器)的。
有一些汇编程序,特别是讨厌的过时DOS debug.exe
,其中每个数字文字都被当作十六进制。debug.exe根本不支持十进制。正如@old_timer喜欢指出的那样,汇编语法是由汇编程序而不是ISA定义的。
如果没有显式修饰符,大多数x86汇编器(NASM,MASM,GAS,Go-asm)默认为十进制。如果需要,有些可能具有显式十进制语法,但GAS却没有。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句