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

Assembly x86汇编程序,add和sub的奇怪行为,assembly,masm,Assembly,Masm,我有一段代码: openFileToRead: sub sp,4 add sp,4 ret 那么我的代码中有 call openFileToRead 现在我们有一个问题。当添加前有子项时,这一切都有效,但当我使用添加更改子项时,如下图所示: openFileToRead: add sp,4 sub sp,4 ret 万劫不复。在ret中,他跳到了某个奇怪的位置和记忆。这两个标签之间应该没有任何区别,但确实有区别。为什么呢 我在使用英特尔CPU的windows xp上使用masm进行编译,我

我有一段代码:

openFileToRead:
sub sp,4
add sp,4
ret
那么我的代码中有

call openFileToRead
现在我们有一个问题。当添加前有子项时,这一切都有效,但当我使用添加更改子项时,如下图所示:

openFileToRead:
add sp,4
sub sp,4
ret
万劫不复。在ret中,他跳到了某个奇怪的位置和记忆。这两个标签之间应该没有任何区别,但确实有区别。为什么呢


我在使用英特尔CPU的windows xp上使用masm进行编译,我使用16位链接器。

有可能在添加sp 4后立即提供中断(比如时钟滴答声)服务,从而破坏返回值,此时返回值似乎位于堆栈的未使用区域(堆栈指针下方).

我猜这是一个线程/中断问题-更改堆栈、线程发生、返回并启动。为您编写这样的堆栈指针游戏:)

您不应该在
之前向堆栈指针添加
,就像在
推之前不应该有
弹出
一样

当您
向堆栈中添加
时,基本上就是说地址小于堆栈指针所指向地址的任何内容都是可用内存。当您从堆栈中
sub
时,实际上是在分配内存。堆栈指针从高内存开始,并在将内容推送到堆栈上时向低内存移动


在上面的评论中,汉斯对中断有一点看法。如果在
add
之后有任何内容控制并使用堆栈,它将覆盖您的返回地址。这是因为您基本上通过添加到堆栈指针来“解除分配”它。

您确定添加到它时
sp
不会溢出吗?通过调试器运行程序以检查
sp
的值。如果它处于其最高值,那么当添加4时它将溢出。不,这在我的小堆栈中是不可能的,只有200个字,我观察了调试下的行为,sp按预期移动,堆栈上的值只有问题,正如我所说的,只有当有add和sub时,这些代码才会以一种奇怪的方式运行。@user1044110:堆栈指针指向的地址是什么?在call:0186之后、sub:0182之后、add之后和ret:0186Ok之前,但例如,当我想向函数传递一些值时,我认为使用堆栈是一种很好的方法,当处于函数或其他位置时,将它们推到堆栈上,将sp移动到上一个位置并弹出这些值,只需确保sp在ret之前处于正确的位置。@user1044110:在推送之前不要有
pop
,在减去之前不要向堆栈指针添加。