asm中的常数.equ

问题描述

假设我在asm中定义了如下常量:

.data
SYS_EXIT = 60

.text
.globl _start
_start:
    mov $SYS_EXIT,%eax
   syscall

汇编程序在运行时是否真的相当于“查找替换”,以将SYS_EXIT的值替换为60?换句话说,该程序在替换后变为以下内容

.text
.globl _start
_start:
    mov $60,%eax
   syscall

如果是这样,是否在定义SYS_EXIT变量的“哪里”有所不同?例如,是否需要将其放在特定的部分,如果不需要,放置在何处的惯例是什么?例如:

.data
SYS_EXIT = 60

------------------------

.rodata
SYS_EXIT = 60

------------------------

(start of file)
SYS_EXIT = 60

最后(也许是一个单独的问题),有没有办法查看gdb中的所有常量?我可以通过了解标签来手动查看标签,但不能进行类似info va的操作:

>>> info va
All defined variables: [empty]
>>> p/d &SYS_EXIT
$1 = 60

解决方法

这是一个数值替换,不是文本替换,但基本上是。

re:定义顺序,请参见Distinguishing memory from constant in GNU as .intel_syntax-在AT&T语法中使用$SYS_EXIT不会产生歧义,即使稍后定义该常量也是如此。对于.intel_syntax,在使用常量的指令之前或之后定义常量很重要。

(这些不是 ,就像C预处理器宏一样,它们更像是标签;您可以从早期代码中引用后来的定义,例如汇编程序的常规用法。)

不,汇编时常量没有一个小节。切换到仅使用foo = number指令的部分会产生误导,请不要这样做。


=定义的值确实会像其他符号一样出现在目标文件的符号表中。 (这就是为什么您可以使用GDB或nm看到它的原因)。如果您使用.globl,则可以看到它们在其他文件中的使用,例如标签地址。

我不确定这是否对任何事情都有用;如果要跨文件使用常量定义,最好.include定义一个文件,而不是让链接程序填充它们。

我不知道为什么GDB的va没有显示它们;可能是因为它们没有.type将其标记为变量。