2017-10-28 78 views
-1

我不知道如何輸入兩位數字並且實際上可以使用它(加,減,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!" 
+1

我對硬件並不熟悉,但是目前的結果是什麼,你試過了嗎?問題究竟在哪裏?您也可以在不將字符串轉換爲數字的情況下執行一些操作(例如:添加,減法)。 –

+0

基本上現在發生的事情是,當它到達代碼的一部分時,它會檢查結束數字是否大於起始數字,它會跳轉到ERROR字符串,即使我輸入的結束數字大於起始號碼。我相信這是因爲ASCII值實際上並不在寄存器R2和R3中,而只是地址 – prisonmike

+0

您可以嘗試通過單步執行指令進行調試嗎?通常情況下,ASCII碼(值爲48-57)和內存地址(無論其他地方通常相當大)之間的差別是顯而易見的。然後,可以查看LC-3的一些示例/教程,以更好地理解如何使用值與地址(我不知道LC-3,因此我沒有詳細閱讀您的代碼,只是「LEA R3,死亡筆記」聽起來像是「加載地址」,所以它是合理的解釋...雖然你可能稍後用某些輸入覆蓋R3?不知道,很難說沒有學習LC-3)。 – Ped7g

回答

1

快速掃描您的代碼。

GETC 
OUT 
STR R0, R2, #0 
[...] 
GETC 
OUT 
STR R0, R3, #0 

請記住,LD/LDR/LDI/ST/STR/STI指令將進入內存。如果你只是想將一個寄存器的值移到另一個寄存器的值,那麼你就不應該使用任何這些指令。

將一個寄存器移動到另一個寄存器可以簡單地通過ADD或AND指令完成。只需將0添加到寄存器並存儲到目標寄存器,或與其自己進行與,並存入目標寄存器。

+0

感謝您的評論。我意識到我在做什麼,我需要做的是兩件不同的事情。我以後可以發佈完整的代碼給任何正在犯同樣錯誤的人 – prisonmike