我已经完成了在我的Z80核心上实现ADD A,r组操作码.我对我认为已经钉入的进位和溢出标志有点混淆,但我想把它放到社区检查我是对的.
基本上,从我所看到的,Z80中的ALU并不关心有符号/无符号运算,只是添加了位.这意味着如果将两个8位值相加并由于它们的相加而产生9位值,则将设置进位标志.这包括添加两个负二的补数,例如-20(11101100)和-40(11011000),因为虽然结果是-60(11000100),但结果实际上是9位值1 1100 0100.这肯定意味着如果添加两个负二的补码值,即使没有溢出条件,也会始终设置进位标志 - 我是对的吗?
其次,我决定检测此指令中的溢出,我会将两个操作数的第7位异或,如果结果是10000000,那么肯定没有溢出 - 如果结果是00000000那么可能会有溢出这些符号是相同的,因此我将XOR的第7位与任一操作数的第7位相加,如果结果为10000000,则发生溢出,并设置P/V溢出标志.我也在这儿吗?
对于这样一个令人费解的问题我很抱歉,我很确定我是对的但是在我继续根据这个逻辑进行无数更多指令之前我需要知道.非常感谢.
假设A和B是带正号的正整数,则对于A-B,它是使用A+2的的补码计算的B。
例如,在4位二进制系统中,对于有符号整数,我们有
7-3=0111-0011=0111+1101=(1)0100,括号中的1是进位位。根据有符号整数的溢出规则,我们知道没有溢出,因此结果是正确的。
但是,对于无符号整数,如果我们计算会发生什么7-3?如果我们使用上面提到的相同方法:
7-3=0111-0011=0111+1101=(1)0100
Run Code Online (Sandbox Code Playgroud)
然后,根据无符号整数的溢出规则,由于进位而导致溢出。换句话说,这0100是错误的,因为存在溢出。但实际上,我们知道结果0100是正确的。
如果我的分析是正确的,那么使用加法器执行无符号整数减法是不是错误?
我正在读一本书:[xchg rax,rax].以下是本书的0x03片段,我无法理解这一点.
sub rdx,rax
sbb rcx,rcx
and rcx,rdx
add rax,rcx
Run Code Online (Sandbox Code Playgroud)
我一直在工作一周以来(每天几分钟).我研究了一些试图解决它的事情:数字的有符号表示,减法如何工作,减法后CF的作用.根据这个答案和这里给出的清单.除了可能溢出的情况之外,我没有看到减法后检查CF的重点.
在什么情况下检查进位标志在减法后有用?