我可以像JMP
和RET
一样使用CALL
和RET
从标签跳回来吗?
答案 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