我有這個代碼:
jsr cls
ldx #$00 ;loads 0 into x
stx tmp ; stores x in tmp
ldx #<scr1
ldy #>scr1
printToScreen
stx zpb 0
sty zpb 1
lda (zpb),y
ldx tmp. ; loads x from tmp
beq done
sta screen_start,x
inx
stx tmp ; stores new x in tmp
bne printToScreen
done
rts
tmp = $C8
zpb = $fb
scr1 byte 'some text'
byte 0
我想創建一個將字串列印到螢屏上的例程。引數是字串的地址和用作計數器的 X 暫存器。由于 X 也在函式內部使用,因此我將其值存盤在 tmp 變數中。
但是這段代碼什么也沒列印。我對組裝完全陌生,所以可能我不明白這應該如何作業。請參閱代碼注釋。我在這里做錯了什么?
uj5u.com熱心網友回復:
jsr cls
ldy #$10 ; loads $10 into x as a string length
lda #<scr1
sta zpb 0
lda #>scr1
sta zpb 1
printToScreen
lda (zpb),y
sta screen_start,y
dey
bne printToScreen
rts
我會那樣做。老實說,我沒有測驗我上面寫的代碼。我已經按照我認為應該做的方式改變了它。
關于您的代碼:不需要在每次回圈迭代中覆寫 zpb 和 zpb 1。您在執行 "lda (zpb),y" 之前忘記設定 Y 索引暫存器 - 它可能應該為零。在“ldx tmp”之后,您不將其與任何內容進行比較(應該是 cpx #something),因此默認情況下,您將其與零進行比較(beq done)并且 cpu 退出程式,因為 X==0。所以你的程式在記憶體中的某處寫入一個位元組然后退出。
uj5u.com熱心網友回復:
.X 應該是正在列印的字串的長度嗎?
您當前的代碼:
printToScreen
stx zpb 0
sty zpb 1
lda (zpb),y
ldx tmp.
beq done
sta screen_start,x
inx
stx tmp
bne printToScreen
我認為您正在嘗試做的是:
- 在 .X 和 .Y 中傳遞字串的地址
- 將此存盤在
zpb - 在 zpb 使用間接尋址獲取位元組并將它們存盤到螢屏上
screen_start
幾個問題:
lda (zpb),y是正確的尋址模式,但您永遠不會初始化 .Y 暫存器。所以第一次呼叫時的 .Y 暫存器實際上是使用你傳遞的地址的最高有效位元組inxstx tmpbne printToScreen..的組合,當你做的時候inx,bne你說“增加.X,保存它,如果它不等于零,分支到printToScreen”。但這實際上看起來像是您正在嘗試復制 256 個位元組。- 盡管從不初始化 .Y,您也永遠不會更改它,因此它實際上總是會得到 .Y 指向(間接)的相同位元組
zpb。 - 您正在使用 #$00 初始化 .X 并將其存盤在 .X 中
tmp,但這確實不需要按照我認為您正在嘗試執行的操作來完成。 - 如果 .X 應該是長度,那么您實際上并沒有在任何地方定義它……您實際上是為 256 個位元組執行此操作(除非這是您想要的?)
- 您繼續將 .X 和 .Y 存盤在 中
zpb,但這使您無法實際使用 .X 和 .Y
也就是說,我認為可能對你有用的是:
jsr cls ; assuming this is a routine to clear the screen
ldx #<scr1
ldy #>scr1
stx zpb 0
sty zpb 1
ldy #$00
printToScreen
lda (zpb),y
beq done
sta screen_start,y
iny
bne printToScreen
done
rts
scr1 .asc 'some text'
.byt 0
這將做的是:
- 存盤位置
scr1inzpb - 回圈
scr1并將其存盤在screen_start,并在以下情況下結束:- 當前位元組是 0 位元組(它在進行實際復制之前檢查這一點);或者
- .Y 變為零(再次初始化后)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315399.html
上一篇:計算DW陣列中等于1的元素數
