我认为,汇编中一切皆地址。
在c/c++使用很多的结构体,在汇编中是如何表示的呢?其实,在汇编中根本就没有什么结构体的概念,结构体本质就是一堆连在一起的数据。只不过有人把他们想象成一个整体,并以此产生结构体的概念,这与结构体中带有变长数组时候的情形一样:
struct Test
{
int x;
char c;
int cnt;
int data[0];
Test()
{
x = 0;
c = 0;
cnt = 0;
}
};
其实上面这个结构体尾部带有的变长数组,data[0]与结构体Test没有任何关系,sizeof(Test)就知道。
结构体在汇编是如何表示的呢?
譬如如何访问Test中的x成员,其实就是采用地址偏移的方式,根据定义的Test对象的起始地址,偏移一定的大小就可以访问结构体中的不同成员了。
测试代码:
struct Test
{
int x;
char pstr;
int c;
Test()
{
x = 0;
pstr = 0;
c = 0;
}
};
int main()
{
struct Test t;
t.x = 3;
t.c = 'x';
return 0;
}
gcc -S xxxx
产生的汇编代码如下:
.file "struct.cpp"
.section .text._ZN4TestC1Ev,"axG",@progbits,_ZN4TestC1Ev,comdat
.align 2
.weak _ZN4TestC1Ev
.type _ZN4TestC1Ev, @function
_ZN4TestC1Ev:
.LFB4:
pushl