Как работает установка / отмена флагов 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
работать на их оборудовании.