为了账号安全,请及时绑定邮箱和手机立即绑定

Z80上的溢出和进位标志

Z80上的溢出和进位标志

三国纷争 2019-12-03 16:23:57
我已经在Z80内核上实现了ADD A,r组操作码。我对我认为已经钉上的进位标志和溢出标志感到有些困惑,但是我想将其发布给社区,以检查我是否正确。基本上,从我所看到的来看,Z80中的ALU并不关心有符号/无符号操作,它只是添加一些位。这意味着,如果将两个8位值相加并导致9位值相加,则进位标志将被置位。这包括将两个负的二进制补码相加,例如-20(11101100)和-40(11011000),尽管结果为-60(11000100),结果实际上是9位值1 11000100。这肯定意味着如果将两个负的二进制补码值相加,即使没有溢出条件,进位标志也将始终置位-是吗?其次,我决定要检测该指令中的溢出,我将两个操作数的位7进行XOR,如果结果为10000000,则绝对没有溢出-如果结果为00000000,则可能存在溢出这些符号相同,因此我将加法运算结果的第7位与任一操作数的第7位进行XOR运算,如果运算结果为10000000,则发生了溢出,并设置了P / V溢出标志。我也是在这里吗?很抱歉遇到这样一个令人费解的问题,我很确定我是对的,但是在基于此逻辑继续进行更多的说明之前,我需要知道。非常感谢。
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超5个赞

另一种查看方式可能更容易理解。执行总和时:

  • 符号始终设置为结果的第7位

  • 如果结果为0x00,则设置为零

  • 当操作数的右半字节和溢出时设置半进位

  • 当两个操作数均为正且有符号和为负或两个操作数均为负且有符号和为正时,将设置溢出

  • 添加/订阅被重置

  • 如果无符号和溢出0xFF,则进位被设置


查看完整回答
反对 回复 2019-12-03
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

这确实很准确。我通过这样做找出了半进位标志halfCarryOut = carryIn ? ((a & 0x0F) >= 0x0F - (a & 0x0F)) : ((a & 0x0F) > 0x0F - (a & 0x0F)); halfCarryOut = ((res ^ a ^ b) >> 4) ^ halfCarryOut;,应该是正确的。

查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 673 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信