我正在学习8080组装,这是我所修课程的一部分。我指的是《英特尔8080-8085汇编语言编程手册》(日期为1977年)。
在手册的第3章指令集中,我看到了有关DCX的以下描述:
DCX将指定寄存器对的内容减1。 DCX 不影响任何条件标志。
相关示例说:
假设当寄存器H和L包含地址9800H时, 指令DCX H被执行。 DCX考虑了两者的内容 寄存器为单个16位值,因此执行借位 从H寄存器中产生值97FFH。
我自己用二进制补码加法尝试了数学运算,肯定产生了进位。
所以我的问题是:是否仅在算术运算的情况下设置进位位?
TIA
PV
答案 0 :(得分: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和机器控制组:
除非另有说明,否则条件标志不受该组中任何指令的影响。
您需要记住常用指令如何影响标志。您可以编写一个简单的备忘单,或者找到其他人制作的备忘单(某些汇编书中有那些供程序员使用)。
如果您对某些说明为什么不影响标志或某些以特定方式影响标志的原因感兴趣,则视情况而定。原因可能有所不同,具体取决于特定的指令:更便宜的电路,更容易编写常见问题的程序,与早期设计的兼容性或者只是简单地发扬了行之有效的方法而未加考虑。
答案 1 :(得分:2)
DCX H
当然是一种算术指令,但是即使8位标志(例如DCR H
和DCR L
,i8080上的16位增减指令也不会更改任何标志。 ,做。您可以在以下位置找到更多详细信息:《英特尔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)));
}
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);
}