/li雷文 发表于 2011-12-29 19:58:20

win32汇编 的 call ret 的实现为何在栈中找不到a ?

1.在8086汇编中 call 用debug查看代码,都可以看到栈中push ip,为何用od反汇编,栈中却看不到call调用子程序时压入栈的ip(如何才能看到?)
2.在子程序中,用随便push 几次,用od查看依然看不到栈中有数据被压栈,更奇怪的是不用pop照样可以正确返回(只有传递参数才会看到压栈数据) 纠结啊,比如:
pproca,b
       push ebx
       push ebx
       push ecx
    ret
endp
:start
      invoke p 1,2
      invoke ExitProcess,0
end start
(如何能看到上面3个push 和 invoke中call的ip压栈)

bingghost 发表于 2011-12-29 19:58:21

;P那是因为不同的压参方式
你的程序首部应该 写了
                        .386
                        .model flat,stdcall
这样就说明你的程序是以stdcall的方式压参数
stdcall是windows api的压参数方式--这样恢复堆栈的代码由你调用的函数来恢复
另外还有一些压参方式
比如
cdecl
fastcall
thiscall
nakedcall
那么具体的lz 可以去搜索下函数调用约定   :lol

bingghost 发表于 2011-12-30 14:55:21

:o





.

游戏人生 发表于 2011-12-30 18:32:07

数据预处理时已经到设置运行后,数据到对应位置了,所以看不到,但是它却在内存中

linha0 发表于 2011-12-30 22:03:21

本帖最后由 linha0 于 2011-12-30 22:13 编辑

http://www.fishc.com/uploads/allimg/110114/1_110114022936_1.gif
在寄存器窗口、堆栈窗口有你所需要的信息

不过,需要你单步调试到当前指令处才能看到

(^o^)/ 发表于 2012-8-20 17:58:25

(^o^)/ 发表于 2012-8-21 11:30:54

页: [1]
查看完整版本: win32汇编 的 call ret 的实现为何在栈中找不到a ?