溢出標誌指示號碼的符號何時改變不正確。所以如果你添加兩個正數並得到一個負值就會出現溢出。如果添加兩個負數並獲得肯定結果,也會出現溢出。
添加兩個不同符號的數字時不能溢出,因爲範圍不允許。最小的正值加上最大的負值是0 +(-128),它適合於很好的0,加上8比特的任何東西都明顯適合8比特。最小的負數加上最大的正數是-1 + 127 = 126。哪個適合。
(編輯:甚至與進位,0 + -128 + 1 = -127,這適合,和-1 + 127 + 1 = 127,其適合)
所以溢流設定如果兩個具有輸入同一個符號會產生一個不同符號的結果。否則很明顯。
您可以將其表示爲對符號位進行簡單的按位運算。假設你有一個+ b = c。
a^b
如果符號不同,符號位將有1。你想知道相反的。因此:
~(a^b)
如果符號相同,則在符號位中給出1。這是涵蓋測試的第一部分。假設a和b具有相同的符號,您可以對其中任何一個進行測試。這個時候你要測試的差異,因此這只是:
a^c
您需要的測試位在測試的兩個部分進行設置,這樣你就可以將那些具有二進制和(留下很多括號在鏈接的文字推理):
(~(a^b))&(a^c)
你只需要符號位,所以屏蔽掉的是:
(~(a^b))&(a^c)&0x80
這會對其進行評估,以0x00
如果溢出標誌應該是CL耳朵和0x80
如果應該設置。所以只需轉移到位。 (另一方面:儘管在6502批量的指令集標誌中只有一個暴露了狀態寄存器,所以仿真器經常將標誌分開保存在任何方便的表格中,並按需組成狀態寄存器,在這種情況下,您不會麻煩轉移和撰寫,你只是存儲該結果)
http://www.righto.com/2012/12/the-6502-overflow-flag-explained.html – arcy
謝謝。我撇清了這個事情,因爲我現在沒有時間詳細閱讀它,而這正是我所理解的。基本上,我對運載是正確的。如果結果高於255,則有進位。當有一個加法並且數字是負數,或者有一個減法並且數字是正數時,會出現溢出(使用8位有符號字節時)。這是正確的,還是我錯過了什麼?無論如何,謝謝,明天我會更加註意。 – ZimZim
IMO,如果您沒有時間詳細閱讀它,那麼您沒有時間對仿真器進行編程。模擬器是關於細節的,它是單調乏味且耗時的,沒有任何大的捷徑。 – arcy