8086汇编中的JMP与CALL

时间:2015-03-10 13:12:39

标签: assembly x86 x86-16

我可以像JMPRET一样使用CALLRET从标签跳回来吗?

4 个答案:

答案 0 :(得分:3)

没有。 JMP更改指令指针。 CALL将当前IP压入堆栈并更新指令指针。

如果您使用带有RET的{​​{1}},那么您将根据当时在堆栈上发生的情况返回某个未知位置。

答案 1 :(得分:3)

使用CALL时,指令指针的当前值保存在堆栈中......当相应的RET执行时,它从堆栈中获取地址并跳转到那里。如果您只是JMP而没有在堆栈上保存当前地址,那么相应的RET将不会在预期的地方找到正确的地址。它可能会找到一些数据,然而,它会尝试跳转到这些位所代表的地址。在任何体面的处理器上,这将导致某种形式的违规行为。

只有在模仿CALL指令的作用时,才可以跳转到程序并使用RET返回。

答案 2 :(得分:2)

如果您想使用JMP替换CALL,但仍然使用RET或替换RET,那么这是一个更好的答案:

    PUSH WORD CS:Call_Return
    JMP My_Method
Call_Return:
    ... (cont)

My_Method:
    ...(some code)
    RET

或者

My_Method:
    ...(some code)
    POP DX
    JMP DX

这证明可以通过许多不同的方式做同样的事情。 假设16位寻址(实模式)在这种情况下确实有所不同。在32位/ 64位寻址模式下,您需要相应地更改push,pop和JMP命令。

答案 3 :(得分:1)

也许你使用过这样的东西:

MOV BX,IP
ADD BX,10  ;If I am not mistaken mov=3bytes,add=3bytes jmp=3 bytes,push=1 byte
PUSH BX
JMP

然后:

RET