问题是您没有考虑超过一位数的答案。我评论了您的代码的固定版本(如下),以便您和其他人在我逐步完成一些示例时理解;我建议你看看ASCII Table。
对于 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 的ASCII 码'9' 并将结果放入R1
- 我们知道如果
R0 - 57 <= 0 则R0 介于(包括)'0' 和'9'(假设输入有效)之间,所以BRnz DONE 其中DONE OUT(然后是HALT)
- 此时,程序只有在
R0 的值大于'9' 时才会运行,这意味着我们的答案不是一位数
- 因为问题指定加数是“从 0 到 9”,我们知道任何不是一位数字的有效答案必须是从 10 到 18,因此我们将数字存储在
R2 和 LD R0, p49 中p49 .fill 49 和 OUT,打印 '1'
- 剩下要做的就是将另一个数字的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