assembly ARM汇编中.equ和.word的区别?

zxlwwiss  于 2023-08-06  发布在  其他
关注(0)|答案(4)|浏览(147)

我很好奇-在ARM汇编中定义常量时,.equ.word指令之间有什么区别?

k5ifujac

k5ifujac1#

**.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

2lpgd968

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的,而是适用于所有气体目标。

iovurdzv

iovurdzv3#

正如在接受的答案(由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标签有多个值被分配(作为一个数组,其中的值在内存中彼此相邻)。

svujldwt

svujldwt4#

NASM 2.10.09 ELF输出:

  • .word很简单:它输出2字节到目标文件,无论我们在哪里。

其后果:

  • 如果.word在符号x:之后,则x将指向这些字节
  • 如果.word在文本段中,则这些字节可能会被执行

它绝对没有其他副作用。特别地,它不设置符号表条目的st_size字段(例如,int通常== 4字节),这是明智的编译器应该做的事情。您需要使用.size x, 2指令。

  1. .equ做了两件事:
    1.更新类似宏的变量
    1.最后一次调用它时,它生成一个带有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,它可以防止重定义。

相关问题