Ассемблер 8086 STATUS FLAG.Нужна помощь очень быстро - PullRequest
0 голосов
/ 12 декабря 2011

Я хочу проверить флаг состояния после команды, но она дает неправильные значения! Например: После добавления 126 с 127 флажком состояния будет FFBA (начальное значение SF - FFFF), НО ... когда я запускаю этот код, он дает 7112:

mov ax, 126
mov bx, 127
PUSHF
MOV dx, 0FFFFh
PUSH dx
POPF
add ax, bx
PUSHF
POP ax
POPF

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Elimantas,

Поскольку GJ ответил вам, вы не можете напрямую вернуться к флагу регистрации, поскольку некоторые из этих флагов являются флагами READ-ONLY, но вместо этого используйте инструкции, нацеленные на некоторые из этих флагов по отдельности.

CLC - Очистить флаг переноса

STC - Установить флаг переноса

CLD - Очистить флаг направления

STD - Установить флаг направления

CLI - ОчиститьФлаг прерывания

STI - Установить флаг прерывания

CMC - Дополнить флаг переноса.Инвертирует значение CF.

LAHF - Загрузка AH с младшими 8 битами флагов регистра:

Бит AH: 7 6 5 4 3 2 1 0

    [SF] [ZF] [0] [AF] [0] [PF] [1] [CF]

SAHF -Храните AH в младших 8 битах флагов регистра:

Бит AH: 7 6 5 4 3 2 1 0

    [SF] [ZF] [0] [AF] [0] [PF] [1] [CF]

Теперь, если вы хотите проверить флаги и предпринять соответствующие действия в ответ настатус этих флагов, лучше использовать «Условный переход», например:

JNZ, JZ,: переход, если нулевые флаги сброшены или установлены соответственно.

JNC, JC: переход, еслиФлаги переноса имеют значение «Очистить» или «Установить» соответственно.

JNO, JO: переход, если флаги переполнения имеют значение «Сброс» или «Установить» соответственно.

JPE, JPO: переход, если флаги четности являются четными или нечетными соответственно.

И другие условные переходы существуют, просто проверьте ссылку на инструкцию 8086.

Еще одна вещь, которую вы должны искать, это набор команд, которые влияют на регистр флагов, а не только инструкция ADD, многие другиеповлиять на этот регистр, вы найдете его в справочном руководстве.

Если вы хотите проверить флаги непосредственно из регистра флагов, просто:

PUSHF

POP AX;AX будет содержать статус регистра Flags

Надеюсь, что это было полезно для вас.

Khilo - АЛЖИР

1 голос
/ 12 декабря 2011

Вы не можете использовать флаги (регистрировать флаги) любое значение, потому что некоторые из них являются системными или зарезервированными!

Флаги, действующие после того, как инструкции ADD имеют значения OF, SF, ZF, AF, PS и CF

БЛОКИ РЕГИСТРАЦИИ ФЛАГА :

    BIT  Flag   NAME
    0    CF     Carry flag  S
    1    1      Reserved     
    2    PF     Parity flag S
    3    0      Reserved     
    4    AF     Adjust flag S
    5    0      Reserved     
    6    ZF     Zero flag   S
    7    SF     Sign flag   S
    8    TF     Trap flag (single step) X
    9    IF     Interrupt enable flag   C
    10   DF     Direction flag  C
    11   OF     Overflow flag   S
    12,13 1,1   I/O privilege level (286+ only) always 1 on 8086 and 186
    14  1       Nested task flag (286+ only) always 1 on 8086 and 186
    15  1       on 8086 and 186, should be 0 above  Reserved
...