单词0在ARM程序集中是什么意思

What does .word 0 mean in ARM assembly?

本文关键字:集中 是什么 意思 程序集 程序 ARM 单词      更新时间:2024-09-23

我正在为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版本的唯一区别是两行.word 0:

vtable for S1:
.word 0
.word 0

这意味着什么,它有什么作用?

这是我上面写的代码的C版本。导螺杆连杆

ARM的C++ABI和GNU C++ABI定义了哪些条目必须出现在虚拟表中。

在您的代码中,前两个条目是vtable顶部的偏移量和typeinfo指针。这些值目前为零,但如果需要,可能会被覆盖(例如:如果生成了进一步的派生类(。

这意味着汇编程序应该输出单词编号0。

汇编程序基本上从上到下遍历文件,对于每条指令,它计算该指令的字节(在ARM上总是4个字节(,并将其写入输出文件。

.word只是告诉它输出一个特定的数字作为4字节。在本例中为0。