首先,我想指出这不是真正的x86,它是msx88,它是一种用于学习目的的x86的简化版本。现在,继续讨论这个问题,我需要创建一个检查算术错误的函数(进位,溢出),我知道我可以使用jo和jc进行检查,但问题是返回到检查后的点(我不想使用呼叫,我不确定是否跳转存储IP,所以我不知道我是否可以使用ret)。如何修改我的代码以便我可以执行JO,如果它进行了跳转,那么它会在JO(JC)之后返回到下一条指令?
ORG 3000H
ArithmeticError: MOV AX, 0
JO overflow
JC carry
RET ;Return
overflow: ADD AX, 1
carry: ADD AX, 2
;If overflow AX=1, if carry AX=2, if overflow and carry AX=3, else AX=0
ORG 2000H
CALL ArithmeticError
END
答案 0 :(得分:1)
您应该在任何算术之前保存标志。像
这样的东西 MOV AX,0 ; NB not XOR to keep flags intact!
JNO no_overflow
PUSHF ; save flags
INC AX
POPF ; restore them back for the second check
no_overflow:
JNC no_carry
ADD AX,2
no_carry:
; if AX is zero, we have no error
TST AX
JZ out
CALL ArithmeticError
out:
RET
答案 1 :(得分:0)
JMP不保留呼叫地址。
如果您不想进行CALL,我会将结果存储在某处,进行其他处理,然后进行调用(或在当前过程中执行相同的功能)。
目前尚不清楚为什么你不想使用电话,但是如果你想回到你叫它的地方,呼叫是最好的操作。
答案 2 :(得分:0)
如果您不想使用呼叫,可以将修改后的IP推送到堆栈,使用JMP然后使用RET。下面是伪代码:
PUSH [IP] +x ; [where x is the size which would evaluate to instruction just after POP IP]
JO OVERFLOW
ADD SP, y ; y is size of address. if jump was not taken
XOR EAX,EAX ;the IP of this instruction minus orginal IP would be x
OVERFLOW:
; program instructions
RET