【问题标题】:Enter a decimal number explicitly in assembly在汇编中明确输入一个十进制数
【发布时间】:2020-08-23 21:01:23
【问题描述】:

我发现自己经常无法立即识别数字是十进制还是十六进制(如果十六进制数字没有前缀或字母)。例如,从上一个问题中得到一个像 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) 有效,但有没有办法明确地为它添加前缀/后缀,以便我们知道它是小数?

【问题讨论】:

  • sourceware.org/binutils/docs/as/Integers.html - 十进制整数以一个非零数字开头,后跟零个或多个数字 (0123456789)。
  • @old_timer 你能澄清一下吗?您希望我在问题或标签或其他内容中添加更多信息吗?
  • @samuelbrody1249 x86 有多个汇编程序。它们都有略微不同的语法规则。所以重要的是要知道你正在为什么汇编程序编程。 Peter Cordes 为您标记了“GNU assembler”(gas),因为这似乎是您使用的。如果需要,请edit您的问题进行更正。
  • @fuz -- 哦,我现在明白了。感谢您的澄清。我会在以后的问题上补充。

标签: assembly x86-64 gnu-assembler att immediate-operand


【解决方案1】:

不,不适用于 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 模式。


不同的汇编器可能支持不同的方式以不同的基数写入数字,at least for non-decimal bases;此答案适用于 GAS,即 GNU 汇编程序。

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

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

【讨论】:

    猜你喜欢
    • 2016-08-21
    • 2014-03-19
    • 2017-05-18
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多