【问题标题】:LC-3 program that adds the sum of odd integers between two numberLC-3 程序,将两个数之间的奇数相加
【发布时间】:2017-10-28 19:12:50
【问题描述】:

我不知道如何输入一个两位数并实际使用它(加、减、AND 等)。到目前为止,我可以将开始和结束数字作为字符串输入并使用 LEA 输出字符串,但我需要将它们放在寄存器中,以便将它们从 ASCII 转换为整数并计算总和。我认为我的总和计算逻辑很好,但我可能错了。到目前为止,我有这个:

    .ORIG x3000

    AND R0, R0, #0                                                  ; clear R0

    LEA R2, blankspace                                              ; string space R2
    LD R1, pooploop                                                 ; loop condition 
    LEA R0, ENTER   
    PUTS                                                            ; print start number prompt                                                         

startloop       
    GETC
    OUT
STR R0, R2, #0
ADD R2, R2, #1
ADD R1, R1, #-1
    BRp startloop



    LEA R3, deathnote                                               ; string space R3
    LD R1, pooploop                                                 ; loop condition
    LEA R0, END
    PUTS                                                            ; print end number prompt

endloop     
    GETC
    OUT
STR R0, R3, #0
ADD R3, R3, #1
ADD R1, R1, #-1                                                     
    BRp endloop

ADD R2, R2, #-12                                                    ; convert
ADD R2, R2, #-12
ADD R2, R2, #-12
ADD R2, R2, #-12

ADD R3, R3, #-12                                                    ; convert
ADD R3, R3, #-12
ADD R3, R3, #-12
ADD R3, R3, #-12

NOT R2, R2                                                          ; negate R2
ADD R4, R3, R2                                                      ; R3 - R2                                           
    BRn NEG
NOT R2, R2                                                          ; if end number is greater, negate R2 again

loop    
ADD R2, R2, #1                                                      ; increment start number by 1
NOT R2, R2                                                          ; negate R2
ADD R5, R3, R2                                                      ; R3 - (R2+1)
    BRz exit                                                        ; exit when start number is equal to end number
NOT R2, R2                                                          ; negate R2 if start number is less than end number
AND R5, R2, #1                                                      ; 
    BRp sum
    BRnzp loop

sum
ADD R6, R2, #0
    BRnzp loop

exit


NEG LEA R0, ERROR
    PUTS

    HALT


deathnote   .blkw 50
blankspace  .blkw 100
pooploop .FILL x02
ENTER   .STRINGZ "\nEnter Start Number > "
END     .STRINGZ "\nEnter End Number > "
ERROR   .STRINGZ "\nERROR! Invalid Entry!"

【问题讨论】:

  • 硬件我不熟悉,但是目前的结果如何,你试过了吗?问题究竟出在哪里?您还可以在不将字符串转换为数字的情况下进行一些操作(例如:加法、减法)。
  • 基本上现在发生的事情是当它到达代码的一部分时,它检查结束编号是否大于开始编号,它分支到错误字符串,即使我输入一个大于起始号的结束号。我相信这是因为 ASCII 值实际上不在寄存器 R2 和 R3 中,而只是地址
  • 您可以通过单步指令尝试调试器吗?通常 ASCII 数字(值 48-57)和内存地址(无论其他什么,通常相当大)之间的差异是显而易见的。然后也许检查一些 LC-3 的示例/教程,以更好地了解如何使用值与地址(我不知道 LC-3,所以我没有详细阅读您的代码,只是 LEA R3, deathnote 听起来像“加载地址”,所以这是合理的解释......虽然你可能稍后会用一些输入覆盖 R3?不确定,如果不学习 LC-3 就很难分辨)。

标签: assembly lc3


【解决方案1】:

快速扫描您的代码。

GETC
OUT
STR R0, R2, #0
[...]
GETC
OUT
STR R0, R3, #0

请记住,LD/LDR/LDI/ST/STR/STI 指令将进入内存。如果您只是想将一个寄存器的值移动到另一个寄存器,那么您不应该使用任何这些指令。

将一个寄存器移动到另一个寄存器可以简单地使用 ADD 或 AND 指令来完成。只需将寄存器加 0 并存储到目标寄存器中,或者与自身 AND 并存储到目标寄存器中。

【讨论】:

  • 感谢您的评论。我意识到我在做什么和我需要做的是两件不同的事情。我可以稍后将我的完整代码发布给任何与我犯相同错误的人
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2012-07-02
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多