我有这段代码:
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位链接器。
答案 0 :(得分:3)
有可能在你的add sp,4之后立即服务一个中断 - 比如一个时钟滴答 - 来破坏你的返回值,在那个精确的时刻它似乎是在堆栈的未使用区域(堆栈指针下方)
答案 1 :(得分:3)
在add
之前,您不应该在堆栈指针前有sub
,就像在pop
之前不应该有push
一样}。
当你add
到堆栈时,你基本上是说地址小于堆栈指针所指向的任何东西都是可用的内存。当您从堆栈中sub
时,实际上是在分配内存时。堆栈指针从高内存开始,随着内存被推入堆栈,向低内存移动。
在上面的评论中,Hans对中断有所了解。如果在add
和使用堆栈之后任何获得控制权,它将覆盖您的返回地址。那是因为你通过添加到堆栈指针基本上“解除分配”它。
答案 2 :(得分:1)
我猜这是一个线程/中断问题 - 更改堆栈,线程发生,回来和繁荣。服务你写你的堆栈指针,如:)