到目前为止,我已经制作了一个代码,可以添加2个数字,但它们是单个数字。
.orig x3000
lea r0, string1
puts
getc
out
add r1, r0, 0
ld r0, minus48
add r1, r1, r0
lea r0, string1 ;input one
puts
LOOP
getc
out
add r2, r0, 0
ld r0, minus48
add r2, r2, r0
add r3, r1, r2
out
OUTSIDE
lea r0, string2 ;input two
puts
ld r0, plus48
add r0, r3, r0
out
HALT
plus48 .FILL 48
minus48 .FILL -48
string1 .stringz "\nPlease enter a number: "
string2 .stringz "\nSum is: "
.end

这很好但是我一直试图让数字输入存储超过1位数,这就是我所做的:
.orig x3000
lea r0, string1 ;input one
puts
LOOP
getc
out
add r1, r0, 0
brz OUTSIDE
ld r0, minus48
add r1, r1, r0
out
brnzp LOOP
lea r0, string1
puts
getc
out
add r2, r0, 0
ld r0, minus48
add r2, r2, r0
add r3, r1, r2
out
OUTSIDE
lea r0, string2 ;input two
puts
ld r0, plus48
add r0, r3, r0
out
HALT
plus48 .FILL 48
minus48 .FILL -48
string1 .stringz "\nPlease enter a number: "
string2 .stringz "\nSum is: "
.end

我试过使用一个循环,所以我可以输入更多的单个数字,总和最多可以计算9999.但我的循环输出奇怪的字符,但它不像我想要的那样运行,LC3非常令人困惑就像我永远花了我一样的数字,所以非常感谢帮助。
答案 0 :(得分:1)
我没有详细查看您的所有代码,但我对第一个循环感到有些困惑。
LOOP
getc
out
add r1, r0, 0
brz OUTSIDE
您正在使用ASCII字符并添加0以检查我们的ASCII字符是否为空,但您无法从该用户获取空字符。
ld r0, minus48
add r1, r1, r0
out
brnzp LOOP
接下来的几行也需要修改。基本上,当运行这9行时,您将从键盘获取一个char,将该ASCII值转换为整数,然后将该int添加到其ASCII值。这就是为什么你会得到一个永无止境的随机字符循环。
我建议为每个基数为10的值设置几个变量。
示例:
; Stored values
NUM1_1 .FILL x0000 ; stores the last number entered by the user
NUM1_10 .FILL x0000 ; stores the 10's value
NUM1_100 .FILL x0000 ; stores the 100's value
NUM1_1000 .FILL x0000 ; stores the 1,000's
因此,如果您在用户给出数字5,382的情况下,您将5存入NUM1_1000,3存入NUM1_100,等等......然后分别添加两个数字的数字。
或者可能更容易有一个查找表,可以帮助您在用户输入时添加基数为10的值。
示例:
LookUp10 .FILL #0
.FILL #10
.FILL #20
.FILL #30
.FILL #40
.FILL #50
.FILL #60
.FILL #70
.FILL #80
.FILL #90
LookUp100 .FILL #0
.FILL #100
.FILL #200
.FILL #300
.FILL #400
.FILL #500
.FILL #600
.FILL #700
.FILL #800
.FILL #900
然后,您可以使用用户提供给您的数字作为所需数组中值的索引。