首页
社区
课程
招聘
反汇编结果中分配给局部变量的空间不够?
发表于: 2004-10-7 15:37 5707

反汇编结果中分配给局部变量的空间不够?

2004-10-7 15:37
5707
一个简单的窗口程序如下:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("chap231") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;

     if (!RegisterClass (&wndclass))
          return 0 ;
     .............
     return msg.wParam ;
}

对应的反汇编代码:
:00401000 83EC44                  sub esp, 00000044
:00401003 56                      push esi
:00401004 8B74244C                mov esi, dword ptr [esp+4C]
:00401008 68007F0000              push 00007F00
:0040100D 6A00                    push 00000000
:0040100F C744242803000000        mov [esp+28], 00000003
:00401017 C744242C20114000        mov [esp+2C], 00401120
:0040101F C744243000000000        mov [esp+30], 00000000
:00401027 C744243400000000        mov [esp+34], 00000000
:0040102F 89742438                mov dword ptr [esp+38], esi

* Reference To: USER32.LoadIconA, Ord:019Eh
                                  |
:00401033 FF15B4404000            Call dword ptr [004040B4]
:00401039 68007F0000              push 00007F00
:0040103E 6A00                    push 00000000
:00401040 8944243C                mov dword ptr [esp+3C], eax

* Reference To: USER32.LoadCursorA, Ord:019Ah
                                  |
:00401044 FF15B8404000            Call dword ptr [004040B8]
:0040104A 6A00                    push 00000000
:0040104C 8944243C                mov dword ptr [esp+3C], eax

* Reference To: GDI32.GetStockObject, Ord:015Fh
                                  |
:00401050 FF1500404000            Call dword ptr [00404000]
:00401056 C744244000000000        mov [esp+40], 00000000

* Possible StringData Ref from Data Obj ->"chap231"
                                  |
:0040105E C744244430504000        mov [esp+44], 00405030
:00401066 8944243C                mov dword ptr [esp+3C], eax
:0040106A 8D442420                lea eax, dword ptr [esp+20]  ;*****
:0040106E 50                      push eax

* Reference To: USER32.RegisterClassA, Ord:01F2h
                                  |
:0040106F FF15BC404000            Call dword ptr [004040BC]

问题如下:

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (10)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
下面是我的分析及我的问题:

:00401000 83EC44                  sub esp, 00000044      ;首行
假设执行完这条指令后esp=k

那么, 到达后面注星号(****)的这行时, esp=k-4, 即 esp+20h= k+1ch =wndclass 首地址. 就是说在wndclass之前应该有1ch 字节的空间留给之前的局部变量. 然而MSG就有26字节, 加上szAppName, hwnd; 共34= 22h. 比1ch多了6h字节. 这是怎么回事?

The msg variable is a structure of type MSG, which is defined in the WINUSER.H header file like this:

typedef struct tagMSG
{
     HWND   hwnd ;
     UINT   message ;
     WPARAM wParam ;
     LPARAM lParam ;
     DWORD  time ;
     POINT  pt ;
}
MSG, * PMSG ;

The POINT data type is yet another structure, defined in the WINDEF.H header file like this:

typedef struct tagPOINT
{
     LONG  x ;
     LONG  y ;
}
POINT, * PPOINT;

这样看来, 分配的空间岂不是不够?
2004-10-7 15:47
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
并不是什么深奥的问题, 怎么没人理我呢?
2004-10-7 19:06
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
4
因为太长了。不想看。另外水平也不够阿。
2004-10-7 19:20
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
知道了.

static TCHAR szAppName[] = TEXT ("chap231") ;
HWND         hwnd ;

这两个家伙被编译器优化掉了, 根本没分配内存给他们.
szAppName 直接用目的地址代替了.
hwnd 则放入esi

先前我以为MSG中的message是16b的, 原来还是32b. (Petzold好像没说清楚)
这样算来, sizeof(MSG)= 28= 1ch

正好. ^_^
2004-10-7 19:32
0
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
static TCHAR szAppName[] = TEXT ("chap231") 是静态变量,不会储存在堆栈的,只会得到一个指针可以,静态变量从来也不会放在堆栈里,静态局部变量其实是放在全局变量那的,不过只是具用局部的可见性而已(我指C),而且上面的代码也不长,太普通,没什么好研究的,这段代码,我默写的输入过几十编,(应试教育的后果,喜欢背东西,无聊的行为)
2004-10-7 21:23
0
雪    币: 7
活跃值: (30)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
:D :D
2004-10-8 09:22
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
To 云重:
    只要你能告诉我最普通的HelloWin的每一行反汇编代码(包括启动部分的那几千行指令)的意义, 我愿意拜你为师.
2004-10-8 11:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
字符串常量都是存放在静态区的
2004-10-8 14:28
0
雪    币: 7
活跃值: (30)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
10
最初由 dislimit 发布
To 云重:
只要你能告诉我最普通的HelloWin的每一行反汇编代码(包括启动部分的那几千行指令)的意义, 我愿意拜你为师.


:D :D
2004-10-8 15:24
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
11
云重兄很刻苦的。我想达到这一点不是不可能的。
2004-10-8 15:44
0
游客
登录 | 注册 方可回帖
返回
//