从反汇编的角度来看,C++中函数的参数值到底占用了内存的几个字节

在32位模式下
有一个 void fun(char) 函数
当你调用它,并且传入一个参数’A’ 即 void fun(‘A’)
会为A分配几个字节?
考察知识点:

  • 运行时堆栈:是一个内存数组,由ESP寄存器直接对其进行管理,ESP寄存器存放的是堆栈中某个位置的32位偏移量
  • 当调用过程时,输入的数值称为参数,通过将其压入堆栈实现参数的传递
  • 也就是说,'A’是被压入了运行时堆栈来实现了传递
  • PUSH指令减少ESP的值的大小取决于操作数的大小,操作数是16位,ESP减2;操作数是32位,ESP减4
  • 下图是我在Visual Studio2013中反汇编得到的结果
  • 我们可以看到参数a是通过movzx指令助记符移动到了eax中
  • 然后进行了push eax这个操作,eax是32位寄存器,所以ESP会减4

在这里插入图片描述

  • 解释一下ESP减4的意义:ESP存储的是地址偏移量,一个地址偏移量是对应一个字节的内存单元,ESP减4,就是说其下一个值的地址是在前一个值的4个字节之后的位置
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值