【问题标题】:LC-3 print the result with two number after addingLC-3 打印两个数字相加后的结果
【发布时间】:2015-09-15 23:22:22
【问题描述】:

我编写了这个小程序,它尝试将一个从 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

【问题讨论】:

  • 我建议您检查解决方案是否大于 9,如果是则减去 10。该值就是您最右边的数字。从那里您可以打印“1”和减去 10 产生的新数字。示例:9 + 5 = 14。14 - 10 = 4。打印 1,然后打印 4。
  • 当你做“9 + 2”时你得到一个随机字符的原因是因为它的 ASCII 版本是 57 + 50 = 107,那么你从 107 中减去 48 等于 59 . 在 ASCII 59 中是“;”字符
  • 谢谢大家。我试图做到这一点,但我场。你能帮我改一下密码吗?谢谢。
  • 假设这是一个家庭作业,我们可能不应该为你编写代码。如果您想发布新代码并向我们提出具体问题,我们很乐意为您提供帮助。

标签: assembly ascii lc3


【解决方案1】:

问题是您没有考虑超过一位数的答案。我评论了您的代码的固定版本(如下),以便您和其他人在我逐步完成一些示例时理解;我建议你看看ASCII Table

对于 2 + 3(按照给定的方式工作),您

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

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

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

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

  1. 获取xy 的ASCII 码作为输入,将R0 设置为x + 48 并将R1 设置为y + 48(由GETC 自动完成添加)
  2. ADD R0, R0, R1,将x + y + 96 放入R0
  3. R0中减去48得到x + y + 48
  4. R0 中减去57 的ASCII 码'9' 并将结果放入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. 剩下要做的就是将另一个数字的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

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多