我很好奇 - 在定义常量时,ARM程序集中.equ
和.word
指令有什么区别?
答案 0 :(得分:12)
.equ
与C中的#define
类似:
#define bob 10
.equ bob, 10
.word
与C中的unsigned int
类似:
unsigned int ted;
ted:
.word 0
或使用值初始化:
unsigned int alice = 42;
alice:
.word 42
答案 1 :(得分:2)
.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的,但适用于所有气体目标。
答案 2 :(得分:0)
NASM 2.10.09 ELF输出:
.word
很简单:无论我们身在何处,它都会向目标文件输出2个字节。
这样的后果:
.word
位于符号x:
之后,x
将指向这些字节.word
在文本段中,则可能会执行这些字节绝对没有其他副作用。特别是,它不设置符号表条目的st_size
字段(例如int
经常== 4个字节),这是合理的编译器应该做的事情。你需要.size x, 2
指令。
.equ
执行两个事情:
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
效果:创建了一个符号,如果它是全局的,可以通过链接从另一个文件中使用它。我在source
这种情况与NASM的equ
类似,不同的是NASM版本每个符号只能使用一次。
.set
和等号=
(https://sourceware.org/binutils/docs-2.25/as/Equiv.html)与.equ
相同。
您还应该查看.equiv
{{3}},这会阻止重新定义。
答案 3 :(得分:0)
如已接受的答案(由old_timer编写)所述,label: .word value
就像为该标签分配一个值。我只想添加,您可以像数组一样将多个值分配给同一标签,如下所示:
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
...
上一个示例取自STM32 MCU官方启动文件。这正是初始化 NVIC 的机制。
因此g_pfnVectors
标签被分配了多个值(作为一个数组,可以说这些值在内存中彼此相邻排列)。