我认为,汇编中一切皆地址。
在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