【问题标题】:DCX and Carry flagDCX 和进位标志
【发布时间】:2019-09-08 14:30:40
【问题描述】:

我正在学习 8080 组装,这是我正在学习的课程的一部分。我指的是 Intel 8080-8085 汇编语言编程手册(1977 年)。

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

DCX 将指定寄存器对的内容减一。 DCX 不影响任何条件标志。

相关的例子说:

假设 H 和 L 寄存器包含地址 9800H,当 执行 DCX H 指令。 DCX 考虑了两者的内容 寄存器为单个 16 位值,因此执行借位 从 H 寄存器产生值 97FFH。

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

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

TIA

PV

【问题讨论】:

  • 您的示例中有一个错字:DCX H 应该是 DCX HL。根据@AlexeyFrunze 的回答 - 您的问题的答案在您引用的文档中。不要混淆算术意义上的“进位生成”和 CPU 中的进位标志,永远不要假设后者总是跟随前者。在某些 CPU 架构中(默认情况下)不会通过算术/逻辑操作设置标志,您必须明确“要求”设置它们(例如 ARM)。
  • @tum_:同样重要的是,在 ARM 上,如果有 no 借位,则会设置减法进位标志。与 x86(可能是 8080)相反,它是减法的借用标志。当然在 x86 inc/dec 上不要修改 CF,只修改其他标志。 add/sub 设置CF。所以是的,你必须根据每条指令检查它们是如何设置标志的。
  • @PeterCordes 是的。我认为,在 google.groups 上,我第一次学到了最有效的 ARM Asm sn-p 的即兴竞赛之一(来自一个显然来自 ARM C 编译器开发团队的人,我敢打赌他也是如此) EOR 等不会影响进位标志。来自 z80 世界,我认为它已被清除,直到我实际检查了 ARM 参考。很好的教训。
  • @tum_ 有趣的事实:在 ARM 的 Thumb 模式下,大多数指令的短 16 位编码用于标志设置版本。 (即助记符上的s 后缀)令人惊讶的是,that includes movs for moving an immediate to a register。当您记得 movs 对源操作数进行移位将根据移位/旋转设置标志时,这对于 reg-reg 移动并不那么疯狂,但对于立即数来说这很奇怪。但是,是的,大多数具有标志 reg 的 RISC 都具有可选的标志设置。

标签: assembly intel-8080


【解决方案1】:

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

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

此外,查看 Z80 仿真器的内部结构可能会有所帮助。以下是与我的实现进行比较的相关 sn-ps:

    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

【讨论】:

    【解决方案2】:

    将特定的 CPU 放在一边,只考虑二进制算术,从 9800H 中减去 1 时不会产生借位。但是,将 0FFFF 添加到 9800H 时会产生进位。在这两种情况下,结果的 16 个最低有效位都会得到 97FFH。

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

    它在 5.6.1 数据传输组中说:

    条件标志不受该组中任何指令的影响。

    5.6.2 算术组:

    除非另有说明,否则该组中的所有指令都会根据标准规则影响零、符号、奇​​偶校验、进位和辅助进位标志。

    在 5.6.3 逻辑组中类似:

    除非另有说明,否则该组中的所有指令都会根据标准规则影响零、符号、奇​​偶校验、辅助进位和进位标志。

    5.6.4 分公司:

    条件标志不受该组中任何指令的影响。

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

    除非另有说明,否则条件标志不受该组中任何指令的影响。

    您需要记住常见指令如何影响标志。您可以编写一份简单的备忘单,或者,也许,找一份别人制作的备忘单(一些汇编书籍为了程序员的方便而提供了这些备忘单)。

    如果您对为什么某些指令不影响标志或某些指令以特定方式影响标志感兴趣,这取决于。原因可能会有所不同,具体取决于特定的指令:更便宜的电路、更容易编程常见问题、与早期设计的兼容性或只是简单地继承运行良好的东西而没有多加思考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2013-10-18
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多