我不知道如何輸入兩位數字並且實際上可以使用它(加,減,AND等)。到目前爲止,我可以輸入我的開始和結束數字作爲字符串,並使用LEA輸出字符串,但我需要它們在寄存器中,以便我們可以將它們從ASCII轉換爲整數並計算總和。我認爲我對總和計算的邏輯很好,但我可能是錯的。到目前爲止,我有這個:LC-3程序,在兩個數字之間添加奇數整數之和
.ORIG x3000
AND R0, R0, #0 ; clear R0
LEA R2, blankspace ; string space R2
LD R1, pooploop ; loop condition
LEA R0, ENTER
PUTS ; print start number prompt
startloop
GETC
OUT
STR R0, R2, #0
ADD R2, R2, #1
ADD R1, R1, #-1
BRp startloop
LEA R3, deathnote ; string space R3
LD R1, pooploop ; loop condition
LEA R0, END
PUTS ; print end number prompt
endloop
GETC
OUT
STR R0, R3, #0
ADD R3, R3, #1
ADD R1, R1, #-1
BRp endloop
ADD R2, R2, #-12 ; convert
ADD R2, R2, #-12
ADD R2, R2, #-12
ADD R2, R2, #-12
ADD R3, R3, #-12 ; convert
ADD R3, R3, #-12
ADD R3, R3, #-12
ADD R3, R3, #-12
NOT R2, R2 ; negate R2
ADD R4, R3, R2 ; R3 - R2
BRn NEG
NOT R2, R2 ; if end number is greater, negate R2 again
loop
ADD R2, R2, #1 ; increment start number by 1
NOT R2, R2 ; negate R2
ADD R5, R3, R2 ; R3 - (R2+1)
BRz exit ; exit when start number is equal to end number
NOT R2, R2 ; negate R2 if start number is less than end number
AND R5, R2, #1 ;
BRp sum
BRnzp loop
sum
ADD R6, R2, #0
BRnzp loop
exit
NEG LEA R0, ERROR
PUTS
HALT
deathnote .blkw 50
blankspace .blkw 100
pooploop .FILL x02
ENTER .STRINGZ "\nEnter Start Number > "
END .STRINGZ "\nEnter End Number > "
ERROR .STRINGZ "\nERROR! Invalid Entry!"
我對硬件並不熟悉,但是目前的結果是什麼,你試過了嗎?問題究竟在哪裏?您也可以在不將字符串轉換爲數字的情況下執行一些操作(例如:添加,減法)。 –
基本上現在發生的事情是,當它到達代碼的一部分時,它會檢查結束數字是否大於起始數字,它會跳轉到ERROR字符串,即使我輸入的結束數字大於起始號碼。我相信這是因爲ASCII值實際上並不在寄存器R2和R3中,而只是地址 – prisonmike
您可以嘗試通過單步執行指令進行調試嗎?通常情況下,ASCII碼(值爲48-57)和內存地址(無論其他地方通常相當大)之間的差別是顯而易見的。然後,可以查看LC-3的一些示例/教程,以更好地理解如何使用值與地址(我不知道LC-3,因此我沒有詳細閱讀您的代碼,只是「LEA R3,死亡筆記」聽起來像是「加載地址」,所以它是合理的解釋...雖然你可能稍後用某些輸入覆蓋R3?不知道,很難說沒有學習LC-3)。 – Ped7g