标题:对于不同的代码,VC中的栈偏移地址计算方法怎么不统一
取消只看楼主
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
 问题点数:0 回复次数:2 
对于不同的代码,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 模式下编译得到的反汇编代码

模式一.JPG (48.47 KB)


模式二.JPG (51.47 KB)
收到的鲜花
  • cnhanxiao2008-11-03 12:45 送鲜花  30朵  
  • zklhp2008-11-03 12:51 送鲜花  50朵   附言:好文章
搜索更多相关主题的帖子: 栈偏移地址 初始化空间 差异 反汇编 
2008-11-02 17:46
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
回复 3# 的帖子
cch 是中断 向量  3h 入口地址 ,这个中断是VC编译器的模拟中断 还是操作系统也是用这个中断?

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-05 02:52
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
回复 5# 的帖子
现在保护模式下不是使用描述符,没有中断向量地址的概念了!

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-14 19:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-242028-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.072406 second(s), 10 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved