如何在 lc3 中添加 2 个数字以获得 4 位数字的总和?
How to add 2 numbers in lc3 to get a sum of 4 digits?
到目前为止,我已经制作了一个添加 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 非常令人困惑,就像我花了很长时间才得到个位数的加法,所以非常感谢帮助。
我没有详细查看你的所有代码,但我对第一个循环有点困惑。
LOOP
getc
out
add r1, r0, 0
brz OUTSIDE
您正在获取 ASCII 字符并添加 0 以检查我们的 ASCII 字符是否为空,但您无法从用户那里获得空字符。
ld r0, minus48
add r1, r1, r0
out
brnzp LOOP
接下来的几行也需要修改。基本上,当这 9 行是 运行 时,您从键盘获取一个字符,将该 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,等等...然后分别将两个数字的数字相加。
或者查找 table 可能更容易,它可以帮助您在用户输入时添加以 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
那么你可以直接使用用户给你的数字作为你想要的数组中值的索引。
到目前为止,我已经制作了一个添加 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 非常令人困惑,就像我花了很长时间才得到个位数的加法,所以非常感谢帮助。
我没有详细查看你的所有代码,但我对第一个循环有点困惑。
LOOP
getc
out
add r1, r0, 0
brz OUTSIDE
您正在获取 ASCII 字符并添加 0 以检查我们的 ASCII 字符是否为空,但您无法从用户那里获得空字符。
ld r0, minus48
add r1, r1, r0
out
brnzp LOOP
接下来的几行也需要修改。基本上,当这 9 行是 运行 时,您从键盘获取一个字符,将该 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,等等...然后分别将两个数字的数字相加。
或者查找 table 可能更容易,它可以帮助您在用户输入时添加以 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
那么你可以直接使用用户给你的数字作为你想要的数组中值的索引。