在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个字节之后的位置