汇编程序8086状态标志。急需帮助

时间:2011-12-12 16:04:45

标签: assembly status x86-16

我想在命令后检查状态标志但是它给出了错误的值!例如: 添加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 个答案:

答案 0 :(得分:2)

Elimantas,

正如GJ回答你的那样,你不能直接弹回寄存器标志,因为其中一些标志是READ-ONLY标志,而是单独使用针对其中一些标志的指令。

CLC - 清除进位标志

STC - 设置进位标志

CLD - 明确方向标志

STD - 设置方向标志

CLI - 清除中断标志

STI - 设置中断标志

CMC - 补充进位旗帜。反转CF的值。

LAHF - 用低8位寄存器标志加载AH:

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:如果Carry Flags分别为Clear或Set,则跳转。

JNO,JO:如果Overflow Flags分别为Clear或Set,则跳转。

JPE,JPO:如果奇偶校验标志分别为偶数或奇数,则跳转。

存在其他条件跳转,只需检查8086指令参考。

您应该寻找的另一件事是影响Flags寄存器的指令集,不仅是ADD指令,还有许多其他指令影响该寄存器,您可以在指令参考手册中找到它。

很不幸的是,如果你想直接从Flags Register检查标志,只需:

PUSHF

POP AX; AX将包含Flags寄存器的状态

希望这对你有所帮助。

Khilo - ALGERIA

答案 1 :(得分:1)

你不能弹出标志(标志寄存器)任何值,因为它们中的一些是系统的或保留的!

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