计算英特尔 8086 的标志值

本文关键字:标志 8086 英特尔 计算 | 更新日期: 2023-09-27 18:36:34

我正在为英特尔 8086 实施一个模拟器,想知道如何计算每个:进位标志、溢出标志、辅助进位标志。

我知道每个代表什么(携带标志以指示是否有来自位 7 的溢出等)。但是,如何使用 C# 实现这一点。

例如,在进位标志和 ADD 指令的情况下,我只需检查加法后的值,如果超过 0xFF则升起标志。但在某些情况下,这会给出不正确的值。

我已经读过一些我应该检查位 7 的地方,如果它在添加前设置并在添加后清除,那么有一个携带。 但这给出了其他指令(如 SUB)的错误值?

谁能清楚地解释实现 3 个标志(携带、交流、OV)的一般规则?

计算英特尔 8086 的标志值

您可以使用 LAHF 指令

将标志寄存器的低 8 位复制到 ah(LAHF 指令不需要参数)AH 现在的部分将是:

(7) 128: Signflag
(6) 64: Equal/Zero-Flag
(5) 32: reserved for future purposes
(4) 16: Auxiliary-Flag
(3) 8: reserved for future purposes
(2) 4: parity-Flag
(1) 2: reserved for future purposes
(0) 1: Carry-Flag

如果要将孔标志寄存器复制到 ax,请使用以下代码:

pushf
pop ax

AX 现在的位将是:

15: reserved for future purposes
14: Nested-Task
13: I/O Privileged Level
12: I/O Privileged Level
11: Overflow-Flag
10: Direction-Flag (see also: STD, CLD)
9: Interrupt enable (see also: STI, CLI)
8: Trap-Flag (Trap mode)
7: Signflag
6: Equal/Zero-Flag
5: reserved for future purposes
4: Auxiliary-Flag
3: reserved for future purposes
2: parity-Flag
1: reserved for future purposes
0: Carry-Flag

要检查单个字节,请使用 TEST 指令(如果您的汇编程序支持 TEST 指令)或使用以下代码:

shr ax, (bitposition) ;replace "bitposition" by the position of the flag (for example 2 for the parity flag)
and ax, 1; If the flag wasn't set, ax will be zero otherwise, if the flag was set, ax will be 1.

或者,如果您使用 LAHF:

shr al, (bitposition)
and al, 1; If the flag wasn't set, al will be zero otherwise, if the flag was set, al will be 1.