繁体   English   中英

LC-3加后用两个数字打印结果

[英]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(按给定的方式工作),您

  1. 获得'2''3'的ASCII码作为输入,将R0设置为50 ,将R151
  2. ADD R0, R0, R1 ,将101放入R0
  3. R0减去48 ,得到53 ,这是'5'的ASCII码(答案)

对于5 + 6(不能按给定方式工作),提供的代码可以执行此操作...

  1. 获得'5''6'的ASCII码作为输入,将R0设置为53 ,将R154
  2. ADD R0, R0, R1 ,将107放入R0
  3. R0减去48得到59 ,这是';'的ASCII码';' (不是答案)

对于x + y(FIX),...

  1. 获得xy的ASCII码作为输入,将R0设置为x + 48 ,将R1y + 48 (由GETC自动完成)
  2. ADD R0, R0, R1 ,将x + y + 96放入R0
  3. R0减去48得到x + y + 48
  4. R0减去57'9'的ASCII码并将结果放入R1
  5. 我们知道如果R0 - 57 <= 0R0在(包括) '0''9' (假设有效输入),因此BRnz DONE其中DONE OUT (然后是HALT
  6. 此时,仅当R0的值大于'9'程序才运行,这意味着我们的答案不是一位数字
  7. 因为问题指定加数是“从0到9”,所以我们知道任何不是一位数字的有效答案都必须是10到18,因此我们将数字存储在R2LD R0, p49p49 .fill 49OUT ,输出'1'
  8. 剩下要做的唯一一件事就是将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM