C 语言函数返回结构体汇编分析

      为检验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&

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值