在汇编中明确输入一个十进制数字

问题描述

我发现自己经常无法立即识别数字是十进制还是十六进制(如果十六进制数字没有前缀或字母)。例如,从上一个问题开始,某个数字类似21:54:47:385714000 NAME TYPE DATA AGE 21:54:47:393145000 sh.helm.release.v1.example.v1 helm.sh/release.v1 1 0s 21:54:47:719864000 sh.helm.release.v1.example.v1 helm.sh/release.v1 1 0s 21:54:51:182609000 understood-squid-redis Opaque 1 0s 21:54:52:001031000 understood-squid-redis Opaque 1 0s -> 21:54:55:686461000 example-binding Opaque 6 0s ,但不确定是哪个数字。

是否有一种方法可以在x86_64中明确指定带前缀的十进制数字?例如:

0000000000400078

我知道执行 mov %rsp,%rbp movb $0x16,-1(%rbp) movb $0d22 -2(%rbp) # <-- something like this movb $0b10110,-3(%rbp) 是可行的,但是有没有一种方法可以明确地给它加上前缀/后缀,以便我们知道它是十进制的?

解决方法

否,不是针对GAS。 https://sourceware.org/binutils/docs/as/Integers.html-十进制整数以一个非零数字开头,然后是零个或多个数字(0123456789)。

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

在asm源代码中,规则简单,明确且不依赖上下文。在GAS源代码中,如果看不到显式基本替代,则为十进制。这适用于$123的立即数,123(%reg)的位移,.set xyz,123汇编程序指令操作数,.long 123伪指令以将字节/ dword发出到输出中,以及GAS所处的所有其他上下文可让您编写数字文字。

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


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

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

在没有显式修饰符的情况下,大多数x86汇编程序(NASM,MASM,GAS,Go-asm)默认为十进制。如果需要,某些人可能会使用显式十进制语法,但GAS却没有。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...