我正在为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链接
2条答案
按热度按时间mzaanser1#
C++ ABI for ARM与GNU C++ ABI定义了哪些条目必须出现在虚拟表中.
在你的代码中,前两个条目是到vtable顶部的偏移量和typeinfo指针。它们现在是零,但是如果需要的话可以被覆盖(例如:如果生成了进一步的派生类)。
b4wnujal2#
这意味着汇编程序应该输出字编号0。
汇编程序基本上是从上到下遍历文件,对于每个指令,它计算该指令的字节数(在ARM上总是4个字节),并将其写入输出文件。
.word
只是告诉它输出一个4字节的特定数字。在本例中为0。