【问题标题】:Calculate values of flags for Intel 8086计算 Intel 8086 的标志值
【发布时间】:2013-10-22 14:50:26
【问题描述】:

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

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

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

我已经阅读了一些我应该检查第 7 位的地方,如果它在加法之前设置并在加法之后清除,那么就有进位。但这会给其他指令(如 SUB)提供错误的值?

任何人都可以清楚地解释实现 3 个标志(进位、AC、OV)的一般规则吗?

【问题讨论】:

  • 您找到答案了吗?如果没有,请尝试阅读此teaching.idallen.com/dat2343/10f/notes/040_overflow.txt
  • 在尝试解决这个问题之前,你应该先教育自己,什么时候应该在句子中使用逗号或句号,为什么我们每个句子都以大写字母开头等等。这通常会帮助你理解,为什么人们对你的问题投了反对票(至少是那些不喜欢垃圾问题和懒惰作家的人)。

标签: c# flags x86-16


【解决方案1】:

您可以使用 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.

【讨论】:

  • 这似乎不是 OP 所要求的答案。我正在阅读它的方式,他要求定义何时设置标志,而不是如何获取标志值。
猜你喜欢
  • 2011-03-04
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多