asm 中的常量 (.equ)

Constant (.equ) in asm

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

.data
SYS_EXIT = 60

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

汇编程序是否真的在 运行 时执行相当于 'find-replace' 的操作,用 60 替换 SYS_EXIT 的值?也就是说,代入后程序变成了下面的?

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

如果是这样,有什么不同 'where' 我定义了 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
 = 60

是数值代换,不是文字代换,但基本上是。

re: 定义顺序,参见 - 在 AT&T 语法中使用 $SYS_EXIT 即使稍后定义常量也没有歧义。对于 .intel_syntax,常量是在使用它的指令之前还是之后定义的很重要。

(这些 像 C 预处理器宏,它们更像标签;您可以从前面的代码中引用后面的定义,就像汇编程序的正常情况一样。)

不,assemble-time 常量没有节。切换到一个部分只是为了使用 foo = number 指令是误导,不要这样做。


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

我不确定这是否有用;如果您想跨文件使用常量,最好 .include 一个常量定义文件,而不是让链接器填充它们。

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