Smart ASM приложения Регистрирайте EFLAGS

32-битовият регистър EFLAGS съдържа някои флагове за състояние на процесора и управление, както и някои системни флагове (вижте фигурата). След инициализацията на процесора, флаговият регистър съдържа стойност 00000002h, неговите битове 1, 3, 5, 15 и 22..31 са запазени и програмите не трябва да ги използват. Някои флагове на регистъра EFLAGS могат да се променят директно с помощта на специални команди (те са описани по-долу). Инструкциите LAHF, SAHF, PUSHF, PUSHFD, POPF и POPFD се използват за зареждане на стойности на флагове в и четене от регистъра EFLAGS. Стойността на всеки флаг винаги може да бъде проверена, за това трябва да запишете съдържанието на регистъра EFLAGS в стека, след това да го поставите в регистър с общо предназначение и да го проверите с командите TEST и BT. Флаговете могат да се променят чрез зареждането им в стека от регистър с общо предназначение, но някои флагове не могат да се променят по този начин (например двубитово IOPL поле в защитен режим). Регистърът EFLAGS автоматично се записва от процесора в стека при далечни повиквания и се възстановява от него при далечни връщания; при превключване на задачи, процесорът съхранява съдържанието на EFLAGS в TSS на старата задача и зарежда стойността от TSS на новата.

Преди въвеждането на 32-битовия процесор Intel386 регистърът на флаговете беше 16-битов и се наричаше FLAGS. Започвайки с процесора Intel386, флаговият регистър е 32-битов и се нарича EFLAGS (Extended FLAGS - разширени ФЛАГОВЕ); в същото време регистърът FLAGS е долната половина на регистъра EFLAGS, всички флагове, които процесорите 8086 и Intel286 използват, се намират в долната половина на EFLAGS (т.е. във FLAGS), така че можете да разглеждате регистъра на флаговете като единичен и да го наричате EFLAGS. Когато говорим за флагове, се използват два терминафлагът е зададен- това означава, че битът, който съответства на този флаг, е получилстойност 1;флагът е изчистен- стойност 0. Флаговете се намират не само в регистъра EFLAGS, в 32-битов процесор има много регистри, състоящи се изцяло или частично от флагове - контролни регистри, отстраняване на грешки, тестване, MSR и т.н., така че термините "нулиране" и "задаване" флагове се използват навсякъде, където става дума за промяна на флагове.

Формат на флаговия регистър EFLAGS

Флаговете за състояние показват резултатите от целочислени аритметични операции (ADD, SUB, MUL и т.н.), тези флагове са битове 0, 2, 4, 6, 7 и 11 от регистъра EFLAGS.

От тези флагове само CF може да се променя директно (с STC, CLC и CMC команди). Също така, този флаг се използва от командите BT, BTS, BTR, BTC, запазвайки резултата в него. Флаговете за състояние се използват от три типа целочислени аритметични инструкции - със знак, без знак и BCD. При преливане индикаторът е:

Инструкциите за условно разклоняване Jcc, SETcc, LOOPcc и CMOVcc използват един или повече флагове за състояние, за да тестват различни условия.

Системни флагове и IOPL поле

Тези флагове са предназначени да се използват на системно ниво и се подразбира, че приложните програми не трябва да променят своите стойности (и в защитен режим не могат).