我正在寫一個Z80模擬器,並試圖瞭解小數調整指令對某些操作數所做的操作。 這些操作碼在真實Z80上的結果是什麼(在寄存器A & F中)?Z80溢出與DAA
LD A,1h
ADD A,99h
DAA
我的代碼目前在A寄存器中完成了0xA0,並設置了半進位和溢出位。但是它應該返回0嗎?
我正在寫一個Z80模擬器,並試圖瞭解小數調整指令對某些操作數所做的操作。 這些操作碼在真實Z80上的結果是什麼(在寄存器A & F中)?Z80溢出與DAA
LD A,1h
ADD A,99h
DAA
我的代碼目前在A寄存器中完成了0xA0,並設置了半進位和溢出位。但是它應該返回0嗎?
後:
LD A, 1h
ADD A, 99h
A
應該包含9AH。進位,半進位和溢出應全部重置,因爲沒有進位從第3位到第4位或從第7位進位,並且在帶符號的解釋中,您給負數增加了一個正數,因此無法溢出。
然後當您執行時,處理器會發現低半字節的值大於0x9。因此它會決定它將添加0x6來創建一個低位數的合適的十進制數。
鑑於它將向低半字節添加0x9,它會檢查它是否會期望高半字節創建十進制進位。測試是高半字節是否大於0x8。它是。所以DAA也會決定把0x6加到高位。
因此,在總體DAA將決定添加0x66。
(0x9a + 0x66) MOD 0x100 = 0x00
因此,在A
中留下的結果將是0x00。
DAA決定將0x6添加到最高半字節。所以攜帶現在將被設置。
DAA還決定將0x6添加到底部半字節。所以半場進行也將被設定。
符號,零等將根據0x00結果設置。
如果我不得不猜測,它看起來像你的代碼發現低半字節是不正確的,並計劃創建一半進位。但是它不能檢查最高半字節是否會因此而變得不正確(即,是否爲0x8或更大),並且未能計劃創建最高半字節進位。
感謝您的詳細解答。你是對的,問題是我的代碼檢查每個半字節(以正確的順序),並根據半字節和標誌添加6h,60h或66h。我想我需要把它分成6小時和60小時。 –
只有在ADD指令後,在A寄存器中留下兩個BCD數字字節後才執行DAA。
ADD操作員應由兩個打包的BCD數字組成。 DAA指令調整A寄存器以包含正確的兩位數壓縮十進制結果,溢出,進位和零標誌也會受到影響。 如果DAA執行後的結果大於99,則在DAA之後設置進位標誌。
x86 CPU也支持非常接近Z80 DAA指令的DAA指令,因此如果您正在進行仿真,則可以在仿真中使用它x86平臺。
由於懷舊原因,請參閱http://www.worldofspectrum.org/faq/reference/z80reference.htm#DAA – Michael
+1。不知道答案,但檢查這個問題的答案:http://stackoverflow.com/questions/8119577/z80-daa-instruction?rq=1 – 2013-09-30 17:22:02
@Michael偉大的鏈接謝謝。 –