2016-10-26 37 views
0

讓我們假設累加器包含0AH,並給出以下指令。 MOV D,A; XRA A; 我發現這條指令清除累加器以及D寄存器。 我通過使用'虛擬8085'模擬器證實了這一點。 爲什麼secon指令也清除D寄存器?爲什麼XRA A也會清除其他寄存器?

+0

對不起,這沒有任何意義。 'MOV D,A'會將'D'設置爲'0AH'。然後'XRA A'會將'A'設置爲零,並且淨效應將是'D = 0AH,A = 0'。 –

+0

虛擬8085似乎是越野車。如果您將一個或多個其他寄存器「轉」成「A」,然後對「A」執行按位邏輯(和,或xor)操作,則最終也會修改其他寄存器。 – Michael

回答

4

好吧,我看着Virtual 8085's source code,它確實看起來像我在我的評論中建議的車。

它表示寄存器爲BitArray實例。或者更確切地說,每個寄存器被表示爲具有bits成員的對象,該成員是對BitArray的引用。

現在,作者做什麼來模擬MOVsimply point one register's bits to another register's bits。假設你做了MOV D,A;之後,MOV,D.bits現在指的是與A.bits相同的BitArray
如果您然後執行按位邏輯操作,則直接在A.bits上操作,這也會影響D.bits,因爲它們指的是相同的BitArray。如果你這樣做,這個錯誤不會發生ADDSUB,因爲它們以不同的方式實施並創建全新的BitArray而不是修改現有的。

在我看來,MOV是以破碎的方式實施,應使用Clone,或可能CopyTo,而不是=。如果你想看看它修復了,請在github上提出一個關於這個問題的bug。


TL; DR:XRA A不明確D。虛擬8085是越野車。嘗試聯繫其作者,讓他修復該錯誤,或​​搜索不同的模擬器。

相關問題