【发布时间】:2017-10-28 19:12:50
【问题描述】:
我不知道如何输入一个两位数并实际使用它(加、减、AND 等)。到目前为止,我可以将开始和结束数字作为字符串输入并使用 LEA 输出字符串,但我需要将它们放在寄存器中,以便将它们从 ASCII 转换为整数并计算总和。我认为我的总和计算逻辑很好,但我可能错了。到目前为止,我有这个:
.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!"
【问题讨论】:
-
硬件我不熟悉,但是目前的结果如何,你试过了吗?问题究竟出在哪里?您还可以在不将字符串转换为数字的情况下进行一些操作(例如:加法、减法)。
-
基本上现在发生的事情是当它到达代码的一部分时,它检查结束编号是否大于开始编号,它分支到错误字符串,即使我输入一个大于起始号的结束号。我相信这是因为 ASCII 值实际上不在寄存器 R2 和 R3 中,而只是地址
-
您可以通过单步指令尝试调试器吗?通常 ASCII 数字(值 48-57)和内存地址(无论其他什么,通常相当大)之间的差异是显而易见的。然后也许检查一些 LC-3 的示例/教程,以更好地了解如何使用值与地址(我不知道 LC-3,所以我没有详细阅读您的代码,只是
LEA R3, deathnote听起来像“加载地址”,所以这是合理的解释......虽然你可能稍后会用一些输入覆盖 R3?不确定,如果不学习 LC-3 就很难分辨)。