Assembly 臂组件中.eq和.word之间的差异?

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

我很好奇-在定义常量时,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

#define bob 10
.equ bob, 10
unsigned int ted;
ted: 
.word 0
或使用以下值初始化:

unsigned int alice = 42;
alice:
.word 42

NASM 2.10.09极低频输出:

  • .word
    很简单:无论我们在哪里,它都会向对象文件输出2个字节

    由此产生的后果:

    • 如果
      .word
      位于符号
      x:
      之后,
      x
      将指向这些字节
    • 如果
      .word
      位于文本段中,则可能会执行这些字节
    它绝对没有其他副作用。特别是,它没有设置符号表条目的
    st_size
    字段(例如
    int
    通常==4字节),这是明智的编译器应该做的事情。为此,您需要
    .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字节的空间吗?