首页 新闻 搜索 专区 学院

关于CPU中断或调用子程序的一个疑问

0
悬赏园豆:10 [已解决问题] 解决于 2013-09-18 11:34

中断或调用子程序前,CPU会把下一步要执行的指令地址先存放到栈里,拿8086举例就是把指令的地址放到SS:SP指向的栈段了,我的疑问是:如果在子程序或是中断向量所指向的程序中使用了栈,push进去了若干字,改变了SP的值。那么中断结束或子程序返回后,CPU从栈中pop出了的地址里记录的指令岂不是乱套了。

问题补充:

是不是我想错了,哪里想错了呢

会长的主页 会长 | 大侠五级 | 园豆:9032
提问于:2013-09-18 11:11
< >
分享
最佳答案
0

啥叫"调用子程序钱",你说的是调用其他函数吗?

每个函数都要自己保证栈平衡,自己push多少,返回之前pop多少。比如说汇编指令ret后面就可以跟个数字,ret 8就是pop出8个字节后返回。

收获园豆:5
嗷嗷 | 小虾三级 |园豆:557 | 2013-09-18 11:24

钱字写错了,刚改了,应该是“前”。这么说:每个程序都应该保证在结束前把自己放到栈里的东西拿出来,如果是我们编写汇编程序调用push和pop指令,就要确保是成对的?否则算是运行时的错误。

会长 | 园豆:9032 (大侠五级) | 2013-09-18 11:26

调用子程序指的是执行call命令,对,应该是调用子函数

会长 | 园豆:9032 (大侠五级) | 2013-09-18 11:29

如果有人故意想捣乱,编写一段汇编语言,往栈里放了没用的东西,是不是能起到破坏作用

会长 | 园豆:9032 (大侠五级) | 2013-09-18 11:31

@会长: 程序?你这里的意思是指函数吗?

根据函数的声明方式,_stdcall 和_cdecl,他们清理栈的方式也不一样。某个是函数自己清理栈,某个是函数的调用者清理栈。

编译器会根据不同的函数声明方式不同,生成不同的代码。

push和pop不用配对,但是要保证ebp和esp的值平衡。

嗷嗷 | 园豆:557 (小虾三级) | 2013-09-18 11:34

@嗷嗷: 是子函数,写错了。 多谢回答。

会长 | 园豆:9032 (大侠五级) | 2013-09-18 11:37
其他回答(1)
0

先去了解一下堆栈平衡吧。各种编译器实在的方式不同

收获园豆:5
青 蛙 | 园豆:655 (小虾三级) | 2013-09-18 11:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册