2014-11-15 2 views
-2

Я очень смущен, когда дело доходит до флажков состояния. Может ли кто-нибудь помочь мне через пример и шаги, которые мне нужно предпринять, чтобы проверить, как ведут себя флаги?Состояние Флаги при сравнении двух значений

mov ah, 21
mov al, -21
cmp ah,al

Может кто-то помочь мне определить поведение КВС, ZF, SF и OF?

Благодаря

+1

Там есть приложение - эм - руководство для этого. –

+0

См. Также [этот вопрос] (http://stackoverflow.com/questions/26423548/68000-assembly-language-cmpi-b/26425658). В то время как для 68k логика для 4 флагов (с 'N' =' SF' и 'V' =' OF') одинакова на x86, за исключением того, что второй операнд вычитается из первого. – Jester

+0

['cmp' - это просто' sub'] (http://stackoverflow.com/questions/7261535/why-does-cmp-0x84-0x30-trigger-the-overflow-flag), за исключением того, что его операнды не затрагиваются , только регистр флагов. –

ответ

0

Вы можете посмотреть на eflags регистра в отладчике (например, GDB). Существует много доступной документации о eflags, но по существу биты в регистре равны 0 или 1 в зависимости от того, установлены ли определенные флаги состояния.

Если этого не достаточно, чтобы просто увидеть значения в отладчике, и вам нужно сделать что-то с ними:

  1. вы можете нажать eflags на стек (pushfl работает для меня), а затем поп стек в регистр общего назначения.

  2. Вы можете использовать jc, jz, jo и js инструкции, которые прыгают к указанной метке, если перенос, ноль, переполнение или знак флаги (соответственно) устанавливаются.

Например:

clc      # clear carry flag (set CF = 0) 
    addl eax, 0xffffffff # some operation that might change status flags 
    jc label1    # if the carry flag is set, jump to label 

    ...      # instructions to execute if carry not set (CF = 0) 

    jmp label2 

label1: 

    ...      # instructions to execute if carry set (CF = 0) 

label2: 

    ...      # resume execution which does not depend on CF 
Смежные вопросы