【问题标题】:Complete the assembly program完成组装程序
【发布时间】:2015-09-14 21:39:27
【问题描述】:

我得到了一个用 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”?谢谢

【问题讨论】:

    标签: assembly lc3


    【解决方案1】:

    在详细了解每一行之前,您需要了解程序试图完成什么。我们可以看到这是一个检查以确保 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。

    【讨论】:

    • 我希望这会有所帮助,这个子程序有点复杂。如果您有具体问题,我会尽力帮助解答。
    • 我想我的问题是,你怎么知道它检查内存位置和搜索空值?我看到“ADD R1,R1,#1”,我想“将 R1 中存储的值加 1,并将其存储到 R1 中”。你怎么知道它正在检查内存位置?我很难解释 LC-3 代码。
    • 没问题,asm 不像其他高级语言那样直观。由于“BRz CONT”,我们可以看出这是程序在第一个循环中寻找的内容。它说如果为零则分支,但这只会给我们空内存块的内存位置,所以“ADD R1,R1,#-1”就像退回到最后一个“填充”的内存位置。
    • 这就像在一条有几排房屋的街道上开车,你的朋友打电话告诉你他的家是街道上最后一个。所以 LC3 在这条街上巡航,直到它找到一块空地,然后说它一定是我经过的最后一所房子,并反转了一段记忆。
    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多