我已經在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條經驗 獲得超6個贊
另一種查看方式可能更容易理解。執行總和時:
符號始終設置為結果的第7位
如果結果為0x00,則設置為零
當操作數的右半字節和溢出時設置半進位
當兩個操作數均為正且有符號和為負或兩個操作數均為負且有符號和為正時,將設置溢出
添加/訂閱被重置
如果無符號和溢出0xFF,則進位被設置

哆啦的時光機
TA貢獻1779條經驗 獲得超6個贊
這確實很準確。我通過這樣做找出了半進位標志halfCarryOut = carryIn ? ((a & 0x0F) >= 0x0F - (a & 0x0F)) : ((a & 0x0F) > 0x0F - (a & 0x0F)); halfCarryOut = ((res ^ a ^ b) >> 4) ^ halfCarryOut;
,應該是正確的。
- 3 回答
- 0 關注
- 787 瀏覽
添加回答
舉報
0/150
提交
取消