Assembly 臂组件中.eq和.word之间的差异?
我很好奇-在定义常量时,ARM汇编中的Assembly 臂组件中.eq和.word之间的差异?,assembly,arm,directive,cortex-m3,Assembly,Arm,Directive,Cortex M3,我很好奇-在定义常量时,ARM汇编中的.eq和.word指令之间有什么区别?.word是在该位置分配单词大小的存储空间(内存)的指令。它还可以使用给定值初始化该位置 .eq更像是一个C预处理器#define语句——它在任何后续代码中都会被替换 这实际上不是特定于ARM的,但适用于所有气体目标。.eq类似于C中的\define: #define bob 10 .equ bob, 10 unsigned int ted; ted: .word 0 .word类似于C中的无符号int: #d
.eq
和.word
指令之间有什么区别?.word是在该位置分配单词大小的存储空间(内存)的指令。它还可以使用给定值初始化该位置
.eq更像是一个C预处理器#define语句——它在任何后续代码中都会被替换
这实际上不是特定于ARM的,但适用于所有气体目标。
.eq
类似于C中的\define
:
#define bob 10
.equ bob, 10
unsigned int ted;
ted:
.word 0
.word
类似于C中的无符号int
:
#define bob 10
.equ bob, 10
unsigned int ted;
ted:
.word 0
或使用以下值初始化:
unsigned int alice = 42;
alice:
.word 42
NASM 2.10.09极低频输出:
很简单:无论我们在哪里,它都会向对象文件输出2个字节 由此产生的后果:.word
- 如果
位于符号.word
之后,x:
将指向这些字节x
- 如果
位于文本段中,则可能会执行这些字节.word
字段(例如st_size
通常==4字节),这是明智的编译器应该做的事情。为此,您需要int
指令.size x,2
- 如果
做两件事:.eq
- 更新类似宏的变量
- 最后一次调用它时,它会生成一个带有
和给定值的符号st_shndx==SHN_ABS
示例代码:
.text
.equ x, 123
mov $x, %eax
/* eax == 123 */
.equ x, 456
mov $x, %eax
/* eax == 456 */
现在:
给出:
00000000 <.text>:
0: b8 7b 00 00 00 mov $0x7b,%eax
5: b8 c8 01 00 00 mov $0x1c8,%eax
包含:
Num: Value Size Type Bind Vis Ndx Name
4: 000001c8 0 NOTYPE LOCAL DEFAULT ABS x
这证实了SHN_ABS的效果:创建了一个符号,如果它是全局的,可以通过链接从另一个文件中使用它。我已经在上一节中详细解释了这一点
这种情况与NASM的eq
类似,只是NASM版本只能在每个符号中使用一次
.set
和等号=
()与.eq
相同
您还应该查看.equiv
,这会阻止重新定义
如公认答案(由老定时器编写)中所述,
标签:
类似于为该标签赋值。我只想补充一点,您可以像数组一样为同一标签分配多个值,如下所示:
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
...
前面的示例取自STM32 MCU官方启动文件。这正是初始化NVIC的机制。因此
g\u pfinvectors
label分配了多个值(作为一个数组,可以说,在内存中,这些值彼此相邻对齐).我只是想澄清一下,你不能用.word
在RAM中初始化变量……你需要在运行时做些什么。这与ARM无关。对于gnu汇编程序和其他汇编程序支持的大多数/所有平台来说,这是正确的,这些汇编程序都有指向性地点击:-)1)不像大多数C编译器那样设置st_size
,它可以在任何地方使用,例如在文本部分生成代码。2) .eq类似于#define
:但它也会生成ABS符号| |更多细节:只是试图与OP可能理解的东西相关,喜欢但不完全一样,相似可能是比相似更好的词?还要注意,.word
不会创建符号。所以它很像malloc()
,imho。它只是在任何地方保留一个匿名空间。如果你想把操作码的位拼凑在一起,你可以用它来生成指令。@Kamajii没有。word总是分配4字节的空间吗?