Как работает установка / отмена флагов MASM - PullRequest
0 голосов
/ 05 июля 2018

Установить означает flag value = 1 и Сбросить означает 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 ]

0 голосов
/ 05 июля 2018

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

Так, например, вы можете вести обратный отсчет от 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 инструкции.
0 голосов
/ 05 июля 2018

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

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

SF = ((signed)result < 0);

ZF = (result == 0);

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

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


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

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


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

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

...