在程序集中明确输入十进制数

Enter a decimal number explicitly in assembly

我发现自己经常无法立即识别数字是十进制还是十六进制(如果十六进制数字没有前缀或字母)。例如,从上一个问题中得到一个像 0000000000400078 这样的数字,但不确定它是什么。

有没有办法在x86_64中明确指定带前缀的十进制数?例如:

 mov     %rsp,       %rbp
 movb    [=10=]x16,      -1(%rbp)
 movb    [=10=]d22       -2(%rbp) # <-- something like this
 movb    [=10=]b10110,   -3(%rbp)

我知道 movb , -2(%rbx) 有效,但是有没有办法明确 prefix/suffix 它以便我们知道它是小数?

不,不是 GAS。 https://sourceware.org/binutils/docs/as/Integers.html - 十进制整数以 non-zero 数字开头,后跟零个或多个数字 (0123456789)。

调试器屏幕上的十六进制数字或 objdump 输出有时会省略 0x,例如 0000000000400078,这是十六进制。您必须从上下文中知道地址几乎 总是 以十六进制打印。

在 asm 源代码中,规则简单、明确,而不是 context-sensitive。在 GAS 源代码中,如果您没有看到显式的基重写,它是十进制的。这适用于 3 立即数,123(%reg) 位移,.set xyz, 123 assembler-directive 操作数,.long 123 pseudo-instructions 将字节/双字发送到输出中,以及每个GAS 允许您编写数字文字的其他上下文。

它也适用于 GAS 支持的所有 ISA - 请注意,GAS 手册的这一部分 而不是 在一个特定的 ISA 下。当然,对于 x86-64,它适用于 .intel_syntax noprefix 模式和 AT&T 模式。


不同的汇编器可能支持不同的方式来写不同的基数,at least for non-decimal bases;这个答案是针对 GAS,GNU 汇编程序的。

有一些汇编程序,特别是令人讨厌的过时 DOS debug.exe,其中每个数字文字都被视为十六进制。 debug.exe 根本不支持小数。正如@old_timer 喜欢指出的那样,汇编语法是由汇编程序定义的,而不是由ISA 定义的。

大多数 x86 汇编程序(NASM、MASM、GAS、Go-asm)在没有显式修饰符时默认为十进制。有些可能有 explicit-decimal 语法,你可以根据需要使用,但 GAS 没有。