assembly 在ARM汇编中,.word 0的含义是什么?

ztigrdn8  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(210)

我正在为Cortex-M4编写一个C状态机。
我使用ARM GCC 11.2.1 (none)
我正在对C和C
输出汇编进行比较。
我有下面的C++代码godbolt链接

struct State
{
    virtual void entry(void) = 0;
    virtual void exit(void) = 0;
    virtual void run(void) = 0;
};

struct S1 : public State
{
    void entry(void)
    {
    }

    void exit(void)
    {
    }

    void run(void)
    {
    }
};

S1 s1;

程序集输出为:

S1::entry():
  bx lr
S1::exit():
  bx lr
S1::run():
  bx lr
vtable for S1:
  .word 0
  .word 0
  .word S1::entry()
  .word S1::exit()
  .word S1::run()
s1:
  .word vtable for S1+8

此代码与C版本的唯一区别是2行.word 0

vtable for S1:
      .word 0
      .word 0

这是什么意思?它有什么作用?
下面是我编写的上面代码的C版本。godbolt链接

mzaanser

mzaanser1#

C++ ABI for ARMGNU C++ ABI定义了哪些条目必须出现在虚拟表中.
在你的代码中,前两个条目是到vtable顶部的偏移量和typeinfo指针。它们现在是零,但是如果需要的话可以被覆盖(例如:如果生成了进一步的派生类)。

b4wnujal

b4wnujal2#

这意味着汇编程序应该输出字编号0。
汇编程序基本上是从上到下遍历文件,对于每个指令,它计算该指令的字节数(在ARM上总是4个字节),并将其写入输出文件。
.word只是告诉它输出一个4字节的特定数字。在本例中为0。

相关问题