[英]LC-3 print the result with two number after adding
我写了这个小程序,试图将0到9之间的数字相加并打印结果。
它有一个错误:如果结果超过9,则显示出一些疯狂的性格。 我不确定解决此问题的正确方法。
.orig x3000
ld r6, m48
lea r0, id
puts
lea r0, numberone
puts
getc
out
add r1, r0, 0
lea r0, numbertwo
puts
getc
out
add r2, r0, 0
lea r0, line
puts
add r0, r1, 0
out
lea r0, display
puts
add r0, r2, 0
out
lea r0, equalization
puts
lea r0, result
puts
add r0, r2, r1
add r0, r0, r6
out
halt
id .stringz "------"
numberone .stringz "\nPlease enter first number"
numbertwo .stringz "\nPlease enter second number"
display .stringz " + "
line .stringz "\n----: "
equalization .stringz "\nanswer: "
m48 .fill -48
result .stringz " "
.end
问题是您没有考虑多于一位数字的答案。 当我逐步介绍一些示例时,我对代码的固定版本(如下)进行了注释,供您和其他人理解。 我建议您看一下ASCII表 。
对于2 + 3(按给定的方式工作),您
'2'
和'3'
的ASCII码作为输入,将R0
设置为50
,将R1
为51
ADD R0, R0, R1
,将101
放入R0
R0
减去48
,得到53
,这是'5'
的ASCII码(答案) 对于5 + 6(不能按给定方式工作),提供的代码可以执行此操作...
'5'
和'6'
的ASCII码作为输入,将R0
设置为53
,将R1
为54
ADD R0, R0, R1
,将107
放入R0
R0
减去48
得到59
,这是';'
的ASCII码';'
(不是答案) 对于x + y(FIX),...
x
和y
的ASCII码作为输入,将R0
设置为x + 48
,将R1
为y + 48
(由GETC
自动完成) ADD R0, R0, R1
,将x + y + 96
放入R0
R0
减去48
得到x + y + 48
R0
减去57
的'9'
的ASCII码并将结果放入R1
R0 - 57 <= 0
则R0
在(包括) '0'
和'9'
(假设有效输入),因此BRnz DONE
其中DONE OUT
(然后是HALT
) R0
的值大于'9'
程序才运行,这意味着我们的答案不是一位数字 R2
和LD R0, p49
在p49 .fill 49
和OUT
,输出'1'
R2
其他数字的ASCII码放入R2
以便在到达DONE OUT
时将其打印出来,因此我们将ADD R0, R2, -10
固定版本:
.orig x3000
LD R6, m48 ; ASCII char. val. - m48 = dec. int. val.
LEA R0, id ; get a horizontal line
PUTS ; print
LEA R0, numberone ; get prompt for first number
PUTS ; print
GETC ; get first number (ASCII char. val.),
; we will call this A1
OUT ; print
ADD R1, R0, 0 ; put A1 in R1
LEA R0, numbertwo ; get prompt for second number
PUTS ; print
GETC ; get second number (ASCII char. val.),
; we will call this A2
OUT ; print
ADD R2, R0, 0 ; put A2 in R2
LEA R0, line ;
PUTS ; doing some stuff here to get the output below...
ADD R0, R1, 0 ; ┌─────────────┐
OUT ; │----- │
LEA R0, display ; │A1 + A2 │
PUTS ; │answer: │
ADD R0, R2, 0 ; └─────────────┘
OUT ;
LEA R0, equalization
PUTS ;
LEA R0, result ; everything looks good so far,
PUTS ; now all we need is the answer...
ADD R0, R2, R1 ; put the sum in R0
ADD R0, R0, R6 ; subtract 48 (to get the ASCII char. val.)
; ERROR: there is no ASCII char. val. for n > 9,
; FIX:
LD R5, m57 ; get '9' == 57 (but negative, for subtraction)
ADD R1, R0, R5 ; if ((answer - '9') <= 0),
BRnz DONE ; then answer is a single digit, print
ADD R2, R0, 0 ; else store the digits in R2
LD R0, p49 ; get 1
OUT ; print
ADD R0, R2, -10 ; get the second digit
DONE OUT ; print
HALT
id .stringz "-----"
numberone .stringz "\nPlease enter first number: "
numbertwo .stringz "\nPlease enter second number: "
display .stringz " + "
line .stringz "\n-----: "
equalization .stringz "\nanswer: "
m48 .fill -48
m57 .fill -57 ; -(the ASCII code for '9')
p49 .fill 49 ; the ASCII code for '1'
result .stringz " "
.end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.