Как считать и записать, что флаги x86 регистрируются непосредственно?

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <newBooks>
                <xsl:for-each select="books/book">
                        <newBook>
                                <countNo><xsl:value-of select="position()"/></countNo>
                                <title>
                                        <xsl:value-of select="title"/>
                                </title>
                        </newBook>
                </xsl:for-each>
        </newBooks>
    </xsl:template>
</xsl:stylesheet>
19
задан Peter Cordes 19 June 2019 в 01:07
поделиться

3 ответа

Некоторые флаги можно установить или сбросить напрямую с помощью специальных инструкций:

  • CLC , STC и CMC : очистить, установить и дополнить флаг переноса
  • CLI и STI : очистить и установить флаг прерывания (что должно выполняться атомарно)
  • CLD и STD : очистить и установить флаг направления

Для чтения и записи флагов знака, нуля, вспомогательного переноса, четности и переноса вы можете использовать LAHF для загрузки младшие 8 бит (эти 5 флагов плюс 3 неопределенных бита) в регистр AH, и вы можете использовать SAHF для сохранения этих значений из AH обратно в регистр флагов.

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

Обратите внимание, что вы не можете установить флаги VM и RF с помощью POPF - они сохраняют свои предыдущие значения. Точно так же вы можете изменить уровень привилегий ввода-вывода только при выполнении на уровне привилегий 0, а флаг прерывания можно изменить только при выполнении на уровне привилегий, по крайней мере, таком же привилегированном, как и уровень привилегий ввода-вывода.


Сноска 1 :

Обратите внимание, что popf довольно медленный на современных процессорах; см. руководство по оптимизации Агнера Фога и таблицы инструкций. Он микрокодирован, потому что в режиме ядра он s возможность изменять IF и AC, а также уровень привилегий ввода-вывода. Мы страдаем от штрафа независимо от режима на текущих процессорах, потому что декодеры не чувствительны к режиму.

Если возможно, используйте lahf / sahf вместо pushf / popf для повышения производительности или сохраните один важный флаг, например установите , затем добавьте al, 255 , чтобы установить CF = (AL! = 0) . Или setnc al / sub al, 1 или что-то еще. Последовательности для установки или очистки SF или OF на основе регистра 0 или 1 также просты, с / без инвертирования флага.

или сохраните один важный для вас флаг, например setc al , а затем добавьте al, 255 , чтобы установить CF = (AL! = 0) . Или setnc al / sub al, 1 или что-то еще. Последовательности для установки или очистки SF или OF на основе регистра 0 или 1 также просты, с / без инвертирования флага.

или сохраните единственный флаг, который вам нужен, например setc al , затем позже добавьте al, 255 , чтобы установить CF = (AL! = 0) . Или setnc al / sub al, 1 или что-то еще. Последовательности для установки или очистки SF или OF на основе регистра 0 или 1 также просты, с / без инвертирования флага.

30
ответ дан 30 November 2019 в 02:48
поделиться

Вы можете использовать инструкции pushf и popf, которые помещают флаги в стек, вы можете их изменять , а затем снимите их.

8
ответ дан 30 November 2019 в 02:48
поделиться

Если вам нужен только младший байт регистр флагов (который содержит SF, ZF, AF, PF, CF), затем есть нечетная, но удобная инструкция LAHF (ха-ха), которая загружает нижние 8 бит регистра флагов в AH, и ее аналог SAHF для хранения А во флаги.

В частности, для флага переноса x86 предлагает CLC, STC и CMC для очистки, установки и дополнения флага переноса соответственно.

5
ответ дан 30 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: