完成装配程序

时间:2015-09-14 21:39:28

标签: assembly lc3

我获得了用LC3编写的程序的一部分,并被告知要添加缺少的部分。幸运的是,我能够在线找到答案,但这并没有帮助我理解为什么答案是它的方式或我如何知道编写特定的指令。这是代码(带答案),我将用字母(a) - (e)标记我们要添加的行。程序确定字符串是否是回文。

      .ORIG x3000
      LEA R0, PTR
      ADD R1, R0, #0
AGAIN LDR R2, R1, #0
      BRz CONT
      ADD R1, R1, #1
      BRnzp AGAIN
CONT  ADD R1, R1, #-1 --> (a)
LOOP  LDR R3, R0, #0
      LDR R4, R1, #0 -->(b)
      NOT R4, R4
      ADD R4, R4, #1
      ADD R3, R3, R4
      BRnp NO
      ADD R0, R0, #1 --> (c)
      ADD R1, R1, #-1 --> (d)
      NOT R2, R0
      ADD R2, R2, #1
      ADD R2, R1, R2
      BRnz YES
      BR LOOP --> (e)
YES   AND R5, R5, #0
      ADD   R5, R5, #1
      BRnzp DONE
NO    AND R5, R5, #0
DONE  HALT
PTR   .FILL X4000
.END

我认为这里唯一显而易见的是(e),因为没有BR LOOP可以让你回到循环的顶端。任何人都可以帮助解释为什么这些命令有效以及如何考虑提出这些命令?例如,我应该如何知道在(b)部分添加“LDR R4,R1,#0”?感谢

1 个答案:

答案 0 :(得分:0)

在详细了解每一行之前,您需要了解该计划正在尝试完成的任务。我们可以看到这是一个例程,它检查以确保 PTR 之后存储的值相等。如果值满足此要求,则此例程将 R5 设置为1,否则将 R5 设置为0.

行(a):我们需要这一行,因为第一个循环是在 PTR 之后检查每个内存位置,直到它找到一个空的内存块(搜索null),代码ADD R1, R1, #-1将我们从该空内存带到最后一个非零内存位置。

行(b):,因为我们的子程序需要比较两个不同的内存位置,我们需要加载最初存储在 R1 中的值。我们将该值加载到 R4 的原因是因为该行之后的代码反转 R4 寄存器。

行(c)和行(d):我们必须包含这些行以移动到内存中的下一个块以进行比较。在下面的示例中,我在PTR之后还包含了一些值:

PTR    .FILL x4000    ; Stored at x3019
       .FILL x400F    ; Stored at x301A
       .FILL x40FF    ; Stored at x301B
       .FILL x4000    ; Stored at x301C

在第一次检查中 R0 = x3019 R1 = x301C 。由于存储在x3019的值等于存储在x301C的值,我们再次循环。

在第二次检查中 R0 = x301A R1 = x301B 。由于存储在x301A和x301B中的值不相等,我们的例程退出并设置 R5 = 0.