Как обращаться с x86 ASM jc - PullRequest
       8

Как обращаться с x86 ASM jc

1 голос
/ 15 декабря 2010

Во-первых, я хочу отметить, что на самом деле это не x86, а msx88, что является своего рода упрощенной версией x86 для учебных целей.Теперь, чтобы перейти к вопросу, мне нужно сделать функцию, которая проверяет арифметические ошибки (перенос, переполнение), и я знаю, что могу использовать jo и jc для проверки, но проблема возвращается к точке после проверки(Я не хочу использовать call, и я не уверен, что 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 ]

1 голос
/ 15 декабря 2010

Вы должны сохранить флаги перед любой арифметикой. Что-то вроде

  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
0 голосов
/ 15 декабря 2010

Если вы не хотите использовать вызов, вы можете поместить измененный 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
0 голосов
/ 15 декабря 2010

JMP не сохраняет вызывающий адрес.

Если вы не хотите делать CALL, я бы где-то сохранил результат, выполнил другую обработку, а затем сделал бы вызов (илита же функция в текущей процедуре).

Непонятно, почему вы не хотите использовать вызов, но вызов - это лучшая операция, если вы хотите вернуться туда, откуда вы ее вызвали.1005 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...