Assembly 更改寄回地址,地址为&;T组件

Assembly 更改寄回地址,地址为&;T组件,assembly,x86,Assembly,X86,我在下面有一个汇编函数。由于我试图做的,这个函数返回到C语言中的代码,但是调用我的汇编函数的是代码行,这导致了一个无限循环。以下是我的功能: disableDivideZero: pushl %ebp movl %esp, %ebp call dividebyzero movl %ebp, %esp popl %ebp ret 如何更改返回地址,使其跳过当前返回的指令 在函数返回之前,我尝试

我在下面有一个汇编函数。由于我试图做的,这个函数返回到C语言中的代码,但是调用我的汇编函数的是代码行,这导致了一个无限循环。以下是我的功能:

disableDivideZero:
        pushl %ebp 
        movl %esp, %ebp 
        call dividebyzero
        movl %ebp, %esp 
        popl %ebp 
        ret
如何更改返回地址,使其跳过当前返回的指令

在函数返回之前,我尝试添加$4,4(%ebp)


提前道歉,我是新手。我在x86 32位

上,就在函数返回之前,您已经弹出了前一个函数的帧指针
ebp
。您需要将add放在
popl%ebp
之前,以便
ebp
仍指向此帧


另外,4是添加到返回地址的正确偏移量吗?x86指令的长度可变,因此您需要知道要跳回的指令的长度,而在x86中解码指令长度并不容易。

您知道我如何做到这一点吗?它跳回的指令是:int x=10/0;这不是(机器代码)指令,而是C语言语句。实际上,它是一个带有初始化的C语言声明。一般来说,优化代码中的语句是不可能跳转的,它们都是交错的。如果我在汇编asm(“int$0”)行中跳转,那么仍然不可能获得长度吗?这意味着通常很难获得指令的长度。当然,您可以使用反汇编程序,查看为
10/0
生成了什么指令,并添加该偏移量,也许您还应该确保目标寄存器*ax/*dx将保留一个合理的值。在我看来,更好的方法是使用setjmp/longjmp之类的方法,调用者在代码中提供了一个位置,以便在发生故障后恢复,并收到错误指示,而不是在没有指示的情况下跳过故障指示。为什么要删除代码?如果没有它,你的问题是无法理解的,也无法真正得到回答,除非你说“这不应该发生,所以你把事情搞砸了”/