堆栈溢出

GGJJyangjinhan 2009-03-29 07:03:00
mian proc
call examplei
exit
mian endp
examplei endp
push 5
push 6
call addtwo
ret
examplei endp

反回地址
6
ESP→5



这段代码为什么会溢出?
上面这个表错了吧,是不是5应该在6的上面?
a proc
push ebp
mov ebp,esp
mov al,【esp+8】
cmp al,“a”
jb l1
cmp al,“z”
ja l1
sub al,32
l1: pop ebp
ret 4
a proc


ret 4为什么是4不是8或12???
...全文
170 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
BAYNPU 2009-03-30
  • 打赏
  • 举报
回复
1、栈定义是DWORD型参数,所以返回必须是ret 4,如果返回RET8或12有可能引起计算机的异常或列机.
2、第二个问题跟第一个问题差不多,在此不嗦哆了.
GGJJyangjinhan 2009-03-30
  • 打赏
  • 举报
回复
这个ret 4为什么是4不是8或12???

和上面这个ret 8为什么是8不是别的
xzdgy 2009-03-30
  • 打赏
  • 举报
回复
帮顶
lili830209 2009-03-30
  • 打赏
  • 举报
回复
帮顶
sizemismatch 2009-03-30
  • 打赏
  • 举报
回复
up
lili830209 2009-03-30
  • 打赏
  • 举报
回复
up
BAYNPU 2009-03-30
  • 打赏
  • 举报
回复
哪道题不明白?
GGJJyangjinhan 2009-03-30
  • 打赏
  • 举报
回复
还是没明白...
GGJJyangjinhan 2009-03-30
  • 打赏
  • 举报
回复
ret不设置没问题吗?
BAYNPU 2009-03-30
  • 打赏
  • 举报
回复
ret返回参数的值是由于汇编编译器根据语言类型来安排。
GGJJyangjinhan 2009-03-30
  • 打赏
  • 举报
回复
我知道会引起异常的,我就是想知道如果我写个这样的程序给返回几??

为什么有的改返回8有的返回的是4.作者如何知道该返回的是8还是4
BAYNPU 2009-03-29
  • 打赏
  • 举报
回复
和上面这个ret 8为什么是8不是别的;这个是语言类型定义的问题有C语言类型:参数传递顺序:从右到左,平衡堆栈是:主程序负责平衡堆栈,后面的是平衡堆栈语句ADD ESP,8.
STDCALL语言类型:平衡堆栈是:子程序负责平衡堆栈,后面的语句是平衡堆栈ret 8.
BAYNPU 2009-03-29
  • 打赏
  • 举报
回复
栈定义是DWORD型参数,所以返回是ret 4,如果返回RET8或12有可能引起程序的异常.
GGJJyangjinhan 2009-03-29
  • 打赏
  • 举报
回复
这我知道主要是下面这个ret 4为什么是4不是8或12???

和上面这个ret 8为什么是8不是别的
cnzdgs 2009-03-29
  • 打赏
  • 举报
回复
上面一段代码,要看addtwo函数采用的是哪种调用约定,如果函数最后用ret 8返回就没有问题,如果用ret返回,调用该函数后需要自己add esp,8。
下面一段代码,ret 4表示调用这个函数要通过栈来传递一个DWORD型参数,函数返回时自动清栈。

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧