<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>
Некоторые флаги можно установить или сбросить напрямую с помощью специальных инструкций:
Для чтения и записи флагов знака, нуля, вспомогательного переноса, четности и переноса вы можете использовать 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 также просты, с / без инвертирования флага. Вы можете использовать инструкции pushf и popf, которые помещают флаги в стек, вы можете их изменять , а затем снимите их.
Если вам нужен только младший байт регистр флагов (который содержит SF, ZF, AF, PF, CF), затем есть нечетная, но удобная инструкция LAHF (ха-ха), которая загружает нижние 8 бит регистра флагов в AH, и ее аналог SAHF для хранения А во флаги.
В частности, для флага переноса x86 предлагает CLC, STC и CMC для очистки, установки и дополнения флага переноса соответственно.