2017-10-28 75 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