ARM程序集中.equation和.word之间的区别?

时间:2014-02-07 09:41:42

标签: assembly arm cortex-m3

我很好奇 - 在定义常量时,ARM程序集中.equ.word指令有什么区别?

4 个答案:

答案 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执行两个事情:

    1. 更新类似宏的变量
    2. 您最后一次调用它时,会生成一个带有st_shndx == SHN_ABS和给定值
    3. 的符号

      示例代码:

      .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标签被分配了多个值(作为一个数组,可以说这些值在内存中彼此相邻排列)。