2014-10-06 56 views
1

我有一個號碼1f存儲在地址00,我有另一個號碼1e存儲在地址01。現在我想把1f分成1f001e分成001e,然後把它們加起來得到1f1e。我該怎麼做呢?我知道指令asllsr處理這個問題,但我是一個6502初學者,所以我真的很感激有人可以告訴我它是如何有效地完成(最少的週期)。6502彙編移位位

+7

由於6502是一個8位機,你不能直接與16位數字的工作。你可以分別操縱兩個半部分,不需要輪班。 – Jester 2014-10-06 21:00:23

+0

@Jester你的意思是說,如果我想把東西存儲到'1f1e'中,我需要使用'sta($ 00),y'? – Meteorite 2014-10-06 21:02:28

+3

是的,但請記住,6502是小端,所以要獲得'1f1e',您需要交換兩個字節。你當然也可以使用'sta($ 00,x)',假設'x'爲零。 – Jester 2014-10-06 21:23:00

回答

2

如果您使用的是16位數量,則需要確保您的變量爲16位或2個字節寬。

您可能想要使用6502 little-endian順序,特別是如果您的變量可以用作地址。這意味着的低字節,高字節的順序。

我公司擁有一批1F存儲在地址00,我有另一個號碼1E存儲在地址01

你真的想保存在地址$ 00- $ $ 01 001F($ 00就等於#$ 1F和$ 01將等於#$ 00),$ 001E存儲在地址$ 02- $ 03($ 02將等於#$ 1E,$ 03將等於#$ 00)。那麼你可能需要另一個變量來保存結果,比如說$ 04- $ 05。


但是,如果你真的有兩個8位的變量,要他們「轉化」爲16位變量...

假設(使用清晰的標籤):

$ 00 - 您的第一個8位的變量(標籤VAR_A_8

$ 01 - 你的第二個8位變量(標籤VAR_B_8

$ 02- $ 03 - 在這裏你要放置你的第一個轉換後的8位變量(標籤VAR_A_16

$ 04- $ 05 - 要在其中放置你的第二個轉換後的8位變量(標籤VAR_B_16

他們是無符號如果是這樣,只需LDA #$00, STA VAR_A_16, STA VAR_B_16, LDA $00, >STA VAR_A_16, LDA $01, STA >VAR_B_16

>是一種常見的彙編語法意味着「低字節」(這威力實際上是< - 我總是糊塗了上)

他們是簽署如果8位值爲負數(位7設置),則需要在新字節中存儲$ FF,否則您需要存儲$ 00。

方式一:

   LDX #$00 
       LDA VAR_A_8  ;Loading .A will set N flag in .P if bit 7 is set 
       BPL VAR_A_NOT_NEG 
       DEX    ;.X will now be $FF 
VAR_A_NOT_NEG: STX <VAR_A_16  ;store .X in high byte 
       STA >VAR_A_16  ;copy low byte 
       LDX #$00 
       LDA VAR_B_8 
       BPL VAR_B_NOT_NEG 
       DEX 
VAR_B_NOT_NEG: STX <VAR_B_16 
       STA >VAR_B_16 
1

6502是一個8位機器;它通過從較低地址讀取最低有效字節來構造16位量(即,它是小尾數)。

因此,您只需要把1e到地址1f前 - 周圍切換它們對當前的佈局,通過移動1f解決02或通過其他方式。不需要移位或ORing;實際上6502內部沒有16位寄存器,可以按位邏輯進行移位或操作。

如果兩個字節保持在0001但是相反,則可以例如零出x並使用($00, x)尋址模式訪問1f1e