【问题标题】:Constant (.equ) in asmasm 中的常量 (.equ)
【发布时间】:2020-09-16 20:16:28
【问题描述】:

假设我在 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

【问题讨论】:

    标签: assembly x86 gnu-assembler


    【解决方案1】:

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

    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 将它们标记为变量。

    【讨论】:

    • 从技术上讲,它们位于绝对部分。也就是说,它们不在任何部分。
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多