如何处理x86 ASM jc

时间:2010-12-15 08:01:06

标签: assembly x86

首先,我想指出这不是真正的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

3 个答案:

答案 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