您的位置:程序门 -> 其他开发语言 -> 汇编语言



熟悉win32汇编的快进来帮帮忙呀!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


熟悉win32汇编的快进来帮帮忙呀![已结贴,结贴人:li8433297]
发表于:2007-05-03 15:17:57 楼主
假设下边的一个子程序:
    sub3   proc   _var1,_var2
      mov   eax,_var1
      mov   ebx,_var2
      ret
sub3   endp
然后反汇编之后的程序代码如下:
:00401018   55   push   ebp
:00401019   8bec   mov   ebp,   esp
:0040101b   8b4508   mov   eax,   dword   ptr   [ebp+08]
:0040101e   8b5d0c   mov   ebx,   dword   ptr   [ebp+0c]
:00401021   c9   leave
:00401022   c20800   ret   0008
现在的问题是:我通过这段时间的阅读,这里子程序压栈的顺利是var2、var1、ebp寄存器,假定在压入var2之前esp的地址为0,则var2、var1、esp的存放地址我感觉应当分别为-4、-8、-12。
因此据此我感觉move   eax,var1反汇编之后的代码应当是mov   eax,dword   ptr   [ebp+04],不知道在这里为什么是[ebp+08],有知道的朋友欢迎后面跟贴呀,本人不胜感激!!
发表于:2007-05-03 17:40:451楼 得分:50
push   var2
push   var1
call   sub3   ;   它automatically把返回地址cs:eip压栈,lz应该已经明白了为什么是08,0c,而不是04,08了吧  
;下面是对于函数自身
push   ebp
mov   ebp,esp  
....
发表于:2007-05-03 21:11:592楼 得分:0
假设如此调用:call   sub3   1,2
call指令的功能是这样的:
自右至左,依次压入参数到堆栈,即:
push   1
push   2
push   cs
push   ip

在执行call   sub3   1,2之前esp已经有值了。执行call   sub3   1,2以后,esp=esp-12;压栈esp减小。因此再用esp寻址堆栈中的参数时,要通过[esp+4]、[esp+8]、[esp+0c]等来寻址参数。
发表于:2007-05-03 21:13:273楼 得分:0
更正:
push   1
push   2
为:
push   2
push   1
发表于:2007-05-03 21:37:314楼 得分:0
补充ls的,
1.   win32的flat模式下就压eip(4字节),不是cs,   ip
2.   在子程序里寻找堆栈不是用esp,而是用ebp。
发表于:2007-05-03 21:58:325楼 得分:0
感谢楼上的回答,小弟明白了。


快速检索

最新资讯
热门点击