在程序集中明确输入十进制数
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 没有。
我发现自己经常无法立即识别数字是十进制还是十六进制(如果十六进制数字没有前缀或字母)。例如,从上一个问题中得到一个像 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 没有。