为检验VC默认设置下结构的对齐情况,特定义结构如下:
1: typedef struct _CTest
2: {
3: char aCharacter;
4: int iNumber1;
5: char bCharacter;
6: char cCharacter;
7: int iNumber2;
8: }CTest,*PCTest;
9:
GetData()函数返回上面定义的结构,由此可观察 c 语言中返回结构时的细节
10: CTest GetData()
11: {
00401000 >/$ 55 PUSH EBP
00401001 |. 8BEC MOV EBP,ESP
00401003 |. 83EC 10 SUB ESP,10 -->为 tem 分配空间,共16个字节, 即下图栈中 28H--34H 的空间
此时栈的情况:
+-------------------------+
(64) | 调用 main 函数前的EBP
+--------------------------
(60) +
+--------------------------
(5C) +
+--------------------------
(58) +
+--------------------------
(54) +
+--------------------------
(50) +
+--------------------------
(4C) +
+--------------------------
(48) +
+--------------------------
(44) +
+--------------------------
(40) + GetData() 返回时所用临时变量的首地址
+--------------------------
(44) + GetData() 返回地址
+--------------------------
EBP-->| 调用 GetData 函数前的EBP
+--------------------------
(34) +
+--------------------------
(30) +
+--------------------------
(2C) +
+--------------------------
ESP-->+
+--------------------------
12: CTest tem;
13: printf( "run in GetData/n");
00401006 |. 68 40804000 PUSH test.00408040 ; /format = "run in GetData"
0040100B |. E8 93000000 CALL test.printf ; /printf
00401010 |. 83C4 04 ADD ESP,4
14: tem.aCharacter = 'a';
00401013 |. C645 F0 61 MOV BYTE PTR SS:[EBP-10],61
15: tem.bCharacter = 'b';
00401017 |. C645 F8 62 MOV BYTE PTR SS:[EBP-8],62
16: tem.cCharacter = 'c';
0040101B |. C645 F9 63 MOV BYTE PTR SS:[EBP-7],63
17: tem.iNumber1 = 1;
0040101F |. C745 F4 010000&