2017-07-30 128 views
0

在爲我的6502/NES仿真器創建指令函數時,我陷入了理解6502中的帶符號字節和2的補碼的概念。顯然,諸如BMI的分支指令在內存中使用帶符號字節來執行向前/向後分支,有些指令允許使用負數進行算術運算。負標誌也檢測累加器的第7位。 (二的補碼)6502存儲器中存儲的字節是有符號還是無符號?

這是否意味着內存中的所有字節都有符號,我可以將內存初始化爲int8_t CPUMEMORY[0x10000];而不是uint8_t CPUMEMORY[0x10000]

雖然困擾我的事情是,當運算結果超過無符號8位限制(即255)時,進位標誌被設置。但是,如果所有字節都被簽名,這應該不是127? (溢出標誌是這樣做的,但是進入標誌有什麼意義?)

回答

3

內存中的字節只是字節:它們既沒有簽名也沒有未簽名。然而,一個字節的值可以被解釋爲有符號數(int8_t)或無符號數(uint8_t)。兩個連續字節(int16_t或uint16_t)的值和四個連續字節(int32_t或uint32_t)的值相同。

要處理這些字節,您有幾條6502指令,允許您對簽名和未簽名解釋執行多個操作。你只需要使用正確的指令,並使用正確的標誌(攜帶,溢出,負面...)來做你需要做的事情。

+0

ADC和SBC是否將字節解釋爲無符號和有符號的指令示例?或者還有其他的嗎? –

+1

事實上,你可以將加法或減法的操作數/結果解釋爲有符號或無符號。 –

+0

只是爲了完整:**一些**指令甚至可以將字節解釋爲6502上的BCD。 –

1

進位用於多字節算術(除其他外)。

這些主題已經寫了大約數百次,所以我只會引用good source。二進制補碼

1.2 REVIEW(簽名)NUMBERS

存在用於一個字節256個可能值;在十六進制中,它們是:$ 00到 $ FF。一個8位無符號數的範圍是0($ 00)到255($ FF)。 16位無符號數的範圍是0($ 0000)至65535($ FFFF), 依此類推。它們被稱爲無符號數,因爲它們是零或更大,即沒有(減號)符號。另一手牌上的有號碼可以是負值或正值(或零)。術語「帶符號的數字」 在下面用於表示二進制補碼(儘管有其他表示有符號數字的方式)。 8位 有符號數的範圍是-128到127.值-128到-1分別是十六進制 $ 80到$ FF。值0到127分別是 $ 00到$ 7F。因此,有簽字號碼 的最小值是$ 80,簽名號碼的最大值是$ 7F。 16位有符號數的範圍是-32768($ 8000)到32767($ 7FFF)($ 8000到 $ FFFF是負數),依此類推。這看起來像是一種處理負數的奇怪方式,但這種方法有幾個有用的屬性。

首先,0-127(8位有符號範圍和 無符號數的範圍的重疊)在十六進制中爲$ 00到$ 7F,而不管 數是有符號還是無符號。其次,當數字是非負數(0到127)時,最高有效位(對於8位數的第7位)爲零 ,並且當數字是 負數時爲0。事實上,這就是6502的N(負)標記如何得到它的名字 。 (注意N標誌,當受指令影響時, 反映該指令結果的第7位)另外一個注意事項:在 數學中,零不是正數或負數,而是在 計算機世界中,事情不那麼正式;術語「正數」 通常包括零,因爲(a)其最高有效位爲零的有符號數的所有其他可能值 都是正數 數,以及(b)無符號的所有其他可能值 數字是正數。

三,審議補充如下:

CLC 
LDA #$FF 
ADC#$01 

結果(在累加器)爲$ 00,進位設置。另外,在無符號數字中,是:255 + 1 = 256(記住,進位 被設置)。在有符號數字中,加法是-1 + 1 = 0.在其他 單詞中,添加(和減去)有符號數與完全相同,即 添加(和減去)無符號數。

6502.org也有關於sign and the overflow flag的詳細討論。