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