我很好奇-在ARM汇编中定义常量时,.equ和.word指令之间有什么区别?
.equ
.word
k5ifujac1#
**.equ**类似于C中的#define:
#define
#define bob 10 .equ bob, 10
字符串
**.word**类似于C中的unsigned int:
unsigned int
unsigned int ted; ted: .word 0
型或者用一个值初始化:
unsigned int alice = 42; alice: .word 42
型
2lpgd9682#
.word是在该位置中分配字大小的存储空间(存储器)量的指令。它还可以用给定值初始化该位置。.equ更像是一个C预处理器#define语句--它会在任何后续代码中被替换。https://sourceware.org/binutils/docs-2.24/as/Equ.html#Equhttps://sourceware.org/binutils/docs-2.24/as/Word.html#Word这实际上不是特定于ARM的,而是适用于所有气体目标。
iovurdzv3#
正如在接受的答案(由old_timer编写)中提到的,label: .word value就像是为该标签分配一个值。我只是想补充一点,你可以像数组一样为同一个标签分配多个值,如下所示:
label: .word value
g_pfnVectors: .word _estack .word Reset_Handler .word NMI_Handler .word HardFault_Handler .word MemManage_Handler ...
字符串上一个示例摘自STM32 MCU官方启动文件。这正是初始化 NVIC 的机制。所以g_pfnVectors标签有多个值被分配(作为一个数组,其中的值在内存中彼此相邻)。
g_pfnVectors
svujldwt4#
NASM 2.10.09 ELF输出:
其后果:
x:
x
它绝对没有其他副作用。特别地,它不设置符号表条目的st_size字段(例如,int通常== 4字节),这是明智的编译器应该做的事情。您需要使用.size x, 2指令。
st_size
int
.size x, 2
st_shndx == SHN_ABS
.text .equ x, 123 mov $x, %eax /* eax == 123 */ .equ x, 456 mov $x, %eax /* eax == 456 */
字符串现在:
as --32 -o main.o main.S objdump -Sr main.o
型提供:
00000000 <.text>: 0: b8 7b 00 00 00 mov $0x7b,%eax 5: b8 c8 01 00 00 mov $0x1c8,%eax
型这证实了类宏观效应,并且:
readelf -s main.o
型包含:
Num: Value Size Type Bind Vis Ndx Name 4: 000001c8 0 NOTYPE LOCAL DEFAULT ABS x
型这证实了SHN_ABS效应:创建了一个符号,如果它是全局的,则可以通过链接从另一个文件使用它。我已经在https://stackoverflow.com/a/33148242/895245中详细解释了这一点NASM的equ的情况类似,除了NASM版本每个符号只能使用一次。.set和等号=(source)与.equ相同。您还应该查看.equivhttps://sourceware.org/binutils/docs-2.25/as/Equiv.html,它可以防止重定义。
SHN_ABS
equ
.set
=
.equiv
4条答案
按热度按时间k5ifujac1#
**
.equ
**类似于C中的#define
:字符串
**
.word
**类似于C中的unsigned int
:型
或者用一个值初始化:
型
2lpgd9682#
.word是在该位置中分配字大小的存储空间(存储器)量的指令。它还可以用给定值初始化该位置。
.equ更像是一个C预处理器#define语句--它会在任何后续代码中被替换。
https://sourceware.org/binutils/docs-2.24/as/Equ.html#Equ
https://sourceware.org/binutils/docs-2.24/as/Word.html#Word
这实际上不是特定于ARM的,而是适用于所有气体目标。
iovurdzv3#
正如在接受的答案(由old_timer编写)中提到的,
label: .word value
就像是为该标签分配一个值。我只是想补充一点,你可以像数组一样为同一个标签分配多个值,如下所示:字符串
上一个示例摘自STM32 MCU官方启动文件。这正是初始化 NVIC 的机制。
所以
g_pfnVectors
标签有多个值被分配(作为一个数组,其中的值在内存中彼此相邻)。svujldwt4#
NASM 2.10.09 ELF输出:
.word
很简单:它输出2字节到目标文件,无论我们在哪里。其后果:
.word
在符号x:
之后,则x
将指向这些字节.word
在文本段中,则这些字节可能会被执行它绝对没有其他副作用。特别地,它不设置符号表条目的
st_size
字段(例如,int
通常== 4字节),这是明智的编译器应该做的事情。您需要使用.size x, 2
指令。.equ
做了两件事:1.更新类似宏的变量
1.最后一次调用它时,它生成一个带有
st_shndx == SHN_ABS
和给定值的符号示例代码:
字符串
现在:
型
提供:
型
这证实了类宏观效应,并且:
型
包含:
型
这证实了
SHN_ABS
效应:创建了一个符号,如果它是全局的,则可以通过链接从另一个文件使用它。我已经在https://stackoverflow.com/a/33148242/895245中详细解释了这一点NASM的
equ
的情况类似,除了NASM版本每个符号只能使用一次。.set
和等号=
(source)与.equ
相同。您还应该查看
.equiv
https://sourceware.org/binutils/docs-2.25/as/Equiv.html,它可以防止重定义。