Как работает установка / отмена флагов MASM

Установить средства flag value = 1 и Unset означает flag value = 0

Теперь я понимаю, что есть несколько способов установить и снять флаги в MASM, а именно:

test al,0 ; set Zero flag
and al,0 ; set Zero flag
or al,1 ; clear Zero flag

То же самое касается Sign flag:

or al,80h ; set Sign flag
and al,7Fh ; clear Sign flag

Чтобы установить Carry flagмы используем инструкцию STC; чтобы очистить флаг Carry, мы используем CLC:

stc ; set Carry flag
clc ; clear Carry flag

Чтобы установить Overflow flagмы добавляем два положительных значения, которые дают отрицательную сумму. Очистить Overflow flagмы ИЛИ операнд с 0:

mov al,7Fh ; AL = +127
inc al ; AL = 80h (-128), OF=1
or eax,0 ; clear Overflow flag

Overflow а также Carry Операции с флагами понятны и просты для понимания, но мне трудно понять математику, стоящую за установкой Zero/Sign флаги. Любая помощь приветствуется!

Спасибо!

2 ответа

Решение

Весь смысл использования флагов заключается в том, что они являются побочным эффектом других операций - и вы можете проверить результат после выполнения операции.

Так, например, вы можете отсчитывать от 10 в 0 без явного тестирования на ноль:

       mov cx, 10
Again:
       ; Do some stuff, not changing cx
       dec cx
       jnz Again ; Go back to Again if not zero

"Делай что-нибудь" происходит десять раз, потому что dec влияет на Z флаг.

Причина того, что stc а также clc существует, чтобы помочь с многозначной арифметикой. C Флаг используется для отслеживания "Carries" из предыдущей арифметики, так что вы можете включить их в будущие операции:

op1 dd  0x12345678 ; 32-bit value
op2 dd  0x9abcdef0 ; 32-bit value

    mov ax,[op1+0] ; Get low word of op1
    mov dx,[op1+2] ; Get high word of op1

    add ax,[op2+0] ; Add in low word of op2
    adc dx,[op2+2] ; Add in high word of op2 - WITH CARRY!

Из-за такого рода операций может потребоваться предварительная загрузка C с 0 или же 1 перед запуском по алгоритму. следовательно clc а также stc - и почему никакие другие (арифметические) флаги не имеют "установленный" или "чистый" код операции.

Обратите внимание, что есть и другие неарифметические флаги:

  • D (направление) флаг управляет направлением строковых инструкций, таких как STOS а также MOVS, Таким образом, есть cld а также std инструкции.
  • I Флаг (прерывания) определяет, включены ли прерывания или нет. Таким образом, есть cli а также sti инструкции.

SF и ZF устанавливаются на основе только результата, а не входов.

SF является старшим битом результата, поэтому (для интерпретации битового шаблона с добавлением 2) это означает, что результат отрицательный.

SF = ((signed)result < 0);

ZF = (result == 0);

Можно также сказать, что ZF - это горизонтальное ИЛИ всех битов, инвертированных. (Это очищается, если есть один установленный бит).

Конечно result составляет 8, 16, 32 или 64 бита, в зависимости от размера операнда. Флаги устанавливаются на основе старшего бита и нуля фактического вывода, а не полного регистра, частью которого он является, для такой инструкции, как neg al,


Конечно, не все инструкции устанавливают все флаги, например inc / dec классно оставить CF неизменным, устанавливая другие обычным способом, делая его пригодным для использования внутри adc петли.

Поворачивает только установленный CF и (для неявного кода операции shift-by-1) также OF. SF/ZF/PF остаются неизмененными, в отличие от регулярных некруглых сдвигов. Если счетчик сдвигов не равен нулю, в этом случае все флаги не изменяются. Это проблематично для неупорядоченного выполнения сдвигов и поворотов (флаги являются дополнительной зависимостью для сдвигов / поворотов с переменным счетом), поэтому BMI2 shlx / shrx быстрее на Intel. А также rol / ror лишние мопы.


BSF / BSR устанавливает ZF на основе ввода (не результата) и оставляет регистр вывода неизмененным, если вход был нулевым.

Документы Intel говорят "неопределенный" в этом случае, но AMD документирует неизменное поведение, которое фактически реализует все оборудование. Я думаю, что маловероятно, что Intel когда-либо создаст оборудование, которое не реализует неизмененное поведение, особенно сейчас, когда BMI1 lzcnt / tzcnt дать нам альтернативу без ложной зависимости. ИДК, почему они не просто документально, как bsf / bsr работать на их оборудовании.

Другие вопросы по тегам