鱼C论坛

 找回密码
 立即注册
查看: 3353|回复: 6

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

[复制链接]
发表于 2011-12-29 19:58:20 | 显示全部楼层 |阅读模式
4鱼币
1.在8086汇编中 call 用debug查看代码,都可以看到栈中push ip,为何用od反汇编,栈中却看不到call调用子程序时压入栈的ip(如何才能看到?)
2.在子程序中,用随便push 几次,用od查看依然看不到栈中有数据被压栈,更奇怪的是不用pop照样可以正确返回(只有传递参数才会看到压栈数据) 纠结啊,比如:
p  proc  a,b
       push ebx
       push ebx
       push ecx
    ret
endp
:start
      invoke p 1,2
      invoke ExitProcess,0
end start
(如何能看到上面3个push 和 invoke中call的ip压栈)

最佳答案

查看完整内容

;P那是因为不同的压参方式 你的程序首部应该 写了 .386 .model flat,stdcall 这样就说明你的程序是以stdcall的方式压参数 stdcall是windows api的压参数方式--这样恢复堆栈的代码由你调用的函数来恢复 另外还有一些压参方式 比如 cdecl fastcall thiscall nakedcall 那么具体的 lz 可以去搜索下函数调用约定 :lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-29 19:58:21 | 显示全部楼层
;P那是因为不同的压参方式
你的程序首部应该 写了
                        .386
                        .model flat,stdcall
这样就说明你的程序是以stdcall的方式压参数
stdcall是windows api的压参数方式--这样恢复堆栈的代码由你调用的函数来恢复
另外还有一些压参方式
比如
cdecl
fastcall
thiscall
nakedcall
那么具体的  lz 可以去搜索下函数调用约定   :lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-12-30 14:55:21 | 显示全部楼层
:o





.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-12-30 18:32:07 | 显示全部楼层
数据预处理时已经到设置运行后,数据到对应位置了,所以看不到,但是它却在内存中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-12-30 22:03:21 | 显示全部楼层
本帖最后由 linha0 于 2011-12-30 22:13 编辑


                               
登录/注册后可看大图

在寄存器窗口、堆栈窗口有你所需要的信息

不过,需要你单步调试到当前指令处才能看到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2012-8-20 17:58:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2012-8-21 11:30:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 06:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表