DCX 和进位标志

DCX and Carry flag

我正在学习 8080 汇编作为我正在学习的课程的一部分。我指的是英特尔 8080-8085 汇编语言编程手册(1977 年)。

在手册的第3章指令集中,我看到以下关于DCX的描述:

DCX decrements the contents of the specified register pair by one. DCX affects none of the condition flags.

相关示例说:

Assume that the H and L registers contain the address 9800H when the instruction DCX H is executed. DCX considers the contents of the two registers to be a single 16-bit value and therefore performs a borrow from the H register to produce the value 97FFH.

我自己用二进制补码加法尝试了数学运算,肯定会生成一个进位。

所以我的问题是:进位位只在算术运算的情况下设置吗?

TIA

PV

撇开特殊的CPU不谈,只考虑二进制运算,9800H减1不会产生借位。但是,将 0FFFF 添加到 9800H 时会生成进位。在这两种情况下,您在结果的 16 个最低有效位中得到 97FFH。

无论 CPU 中的设计选择如何,您都需要简单地遵循文档,例如this document, MCS®-80/85 FAMILY USER'S MANUAL.

5.6.1数据传输组中说:

Condition flags are not affected by any instruction in this group.

5.6.2 算术组:

Unless indicated otherwise, all instructions in this group affect the Zero, Sign, Parity, Carry, and Auxiliary Carry flags according to the standard rules.

类似5.6.3逻辑组:

Unless indicated otherwise, all instructions in this group affect the Zero, Sign, Parity, Auxiliary Carry, and Carry flags according to the standard rules.

5.6.4支部群:

Condition flags are not affected by any instruction in this group.

5.6.5 堆栈,I/O,和机器控制组:

Unless otherwise specified, condition flags are not affected by any Instructions in this group.

您需要记住常用指令如何影响标志。你可以编译一个简单的作弊程序 sheet 或者,也许,找一个别人制作的作弊程序(一些汇编书籍有那些是为了程序员的方便)。

如果您对为什么某些指令不影响标志或某些指令以特定方式影响它们感兴趣,那要视情况而定。原因可能不同,具体取决于特定的指令:更便宜的电路、更容易对常见问题进行编程、与早期设计的兼容性或只是简单地发扬行之有效的东西而没有多加考虑。

DCX H 当然是算术指令,但是 16 位递增和递减指令不会改变 i8080 上的任何标志,即使是 8 位指令,例如 DCR HDCR L,做。您可以在英特尔 8080 微型计算机系统用户手册中找到更多详细信息,此处提供:

http://www.nj7p.info/Manuals/PDFs/Intel/9800153B.pdf

此外,查看 Z80 模拟器的内部结构可能会有帮助。以下是与我的实现进行比较的相关片段:

    void on_dec_rp(regp rp) {
        self().on_set_regp(rp, dec16(self().on_get_regp(rp)));
    }

DCX rp

    void on_dec_r(reg r) {
        fast_u8 n = self().on_get_reg(r);
        fast_u8 f = self().on_get_f();
        fast_u8 hf = (n & 0xf) > 0 ? hf_mask : 0;
        n = dec8(n);
        f = (f & (cf_mask | yf_mask | xf_mask | nf_mask)) |
                (n & sf_mask) | zf_ari(n) | hf | pf_log(n);
        self().on_set_reg(r, n);
        self().on_set_f(f);
    }

DCR r