x86汇编程序,add和sub的奇怪行为

时间:2011-12-09 21:34:00

标签: assembly masm

我有这段代码:

openFileToRead:
sub sp,4
add sp,4
ret

然后我的代码

call openFileToRead

现在我们遇到了问题。这一切都适用于添加之前有一个sub,但当我用这里添加更改sub时:

openFileToRead:
add sp,4
sub sp,4
ret
所有的地狱都破裂了。在ret中他跳到一些奇怪的位置和记忆。这两个标签之间应该没有任何区别,但有。那是为什么?

我使用Intel CPU在windows xp上使用masm编译,我使用16位链接器。

3 个答案:

答案 0 :(得分:3)

有可能在你的add sp,4之后立即服务一个中断 - 比如一个时钟滴答 - 来破坏你的返回值,在那个精确的时刻它似乎是在堆栈的未使用区域(堆栈指针下方)

答案 1 :(得分:3)

add之前,您不应该在堆栈指针前有sub,就像在pop之前不应该有push一样}。

当你add到堆栈时,你基本上是说地址小于堆栈指针所指向的任何东西都是可用的内存。当您从堆栈中sub时,实际上是在分配内存时。堆栈指针从高内存开始,随着内存被推入堆栈,向低内存移动。

在上面的评论中,Hans对中断有所了解。如果在add使用堆栈之后任何获得控制权,它将覆盖您的返回地址。那是因为你通过添加到堆栈指针基本上“解除分配”它。

答案 2 :(得分:1)

我猜这是一个线程/中断问题 - 更改堆栈,线程发生,回来和繁荣。服务你写你的堆栈指针,如:)