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
将它们标记为变量。
假设我在 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: 定义顺序,参见 $SYS_EXIT
即使稍后定义常量也没有歧义。对于 .intel_syntax
,常量是在使用它的指令之前还是之后定义的很重要。
(这些 不 像 C 预处理器宏,它们更像标签;您可以从前面的代码中引用后面的定义,就像汇编程序的正常情况一样。)
不,assemble-time 常量没有节。切换到一个部分只是为了使用 foo = number
指令是误导,不要这样做。
用 =
定义的值确实出现在目标文件的符号 table 中,就像其他符号一样。 (这就是为什么你可以用 GDB 或 nm
看到它)。如果您使用 .globl
它们将在其他文件中可见,就像标签地址一样。
我不确定这是否有用;如果您想跨文件使用常量,最好 .include
一个常量定义文件,而不是让链接器填充它们。
我不知道为什么 GDB 的 va
没有显示它们;可能是因为它们没有 .type
将它们标记为变量。