对于不同的代码,VC中的栈偏移地址计算方法怎么不统一
模式一:使用代码class my_class
{
public :
my_class()
{
m_member = 1;
}
void method(int n)
{
m_member = n;
}
~my_class()
{
m_member = 0;
}
private :
int m_member;
};
int main(char argc, char* argv[])
{
my_class a_class;
a_class.method(10);
return 0;
}
做测试代码时,可以看到他的反汇编代码为(截取部分):
_main PROC NEAR ; COMDAT
; 41 : {
push ebp
mov ebp, esp
push -1
push __ehhandler$_main
mov eax, DWORD PTR fs:__except_list
push eax
mov DWORD PTR fs:__except_list, esp
sub esp, 72 ; 00000048H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-84]
mov ecx, 18 ; 00000012H
mov eax, -858993460 ; ccccccccH
rep stosd
也就是这里的 84 = 72 +3*4,这里的3 是因为考虑了 push ebx,push esi, push edi这三个语句对于栈地址的影响,于是只将剩余的 18*4=72 部分地址进行初始化,而不是整个 84 个字节空间 (见模式一.jpg)
模式二:
使用代码:
#include <stdio.h>
int fun(int a, int b)
{
char var[128] = "A";
a = 0x4455;
b = 0x6677;
return a + b;
}
int main()
{
// int i;
// int p;
// printf("0x%08x\n",i);
fun(0x8899,0x1100);
return 0;
}做测试代码时,
其反汇编代码 (截取部分代码)
_TEXT SEGMENT
_main PROC NEAR ; COMDAT
; 10 : {
push ebp
mov ebp, esp
sub esp, 64 ; 00000040H
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-64]
mov ecx, 16 ; 00000010H
mov eax, -858993460 ; ccccccccH
rep stosd
; 11 : // int i;
; 12 : // int p;
; 13 : // printf("0x%08x\n",i);
; 14 : fun(0x8899,0x1100);
push 4352 ; 00001100H
也就是这里并没有考虑 push ebx,push esi, push edi这三个语句对于栈地址的影响,而是直接将整个 64 个字节空间 进行赋默认 初值 ccccccccH (见模式二.jpg)
注意:以上两个代码均在 VC6.0 DEBUG 模式下编译得到的反汇编代码