【问题标题】:Assembly language confusion汇编语言混乱
【发布时间】:2018-12-19 22:47:51
【问题描述】:

我真的很难理解这个汇编语言问题,在查看标记方案后,我无法弄清楚为什么我的答案与给定的不同。

问题如下

图 5 显示了一个汇编语言程序以及计算机主存储器的一部分内容, 程序将被执行。每个主存位置和寄存器 可以存储一个 16 位的值。

用于编写程序的汇编语言指令集 程序在下一页的表 1 中列出。

图5

LDR R1, 100
LSL R2, R1, #2
ADD R1, R1, R2
LDR R3, 101
CMP R3, R1
BEQ labela
MOV R4, #0
B labelb
labela:
 MOV R4, #1
labelb:
 STR R4, 102
 HALT 

|---------------------|----------------------|
|    Memory Address   | Main Memory Contents |
|     (in decimal)    |      (in decimal)    |
|---------------------|----------------------|
|        100          |         10           |
|---------------------|----------------------|
|        101          |         50           |
|---------------------|----------------------|
|        102          |         80           |
|---------------------|----------------------|

问题:用十进制完成下面的跟踪表,以显示存储在寄存器和主存储器中的值如何随着 执行图 5 中的程序。您可能不需要使用所有 行。

跟踪表:

表 1:

我想出的答案是这样的:

但是标记方案上的答案是这样的(在 102 列中添加了 1):

我认为这里可能发生的是程序退出 labela 分支,然后在分支到 labela 后恢复代码。但是,如果是这种情况,那么内存位置 102 的值将是 0。

谁能给我解释一下,为什么在执行分支 labela 之后,一个 1 会被转移到内存位置 102 中?

提前感谢任何回复的人!抱歉,如果这是一个很长的问题,我真的被卡住了,经过多次尝试自己解决这个问题后,我不知道还能去哪里。

【问题讨论】:

  • 这是 LC-3 吗?除了寻址模式语法之外,它看起来像 ARM。
  • 我相信这是我的考试委员会制作的汇编语言指令集。表 1 显示了该语言的语法
  • 为什么你的值是小数?您在这里有轮班说明,这会导致轮班痛苦。我将从二进制表示开始。
  • 那叫“AQA 大会”。它看起来与 ARM 完全相同,但具有简化的寻址模式。 (MVN 是一个基于 ARM 的重要线索。)奇怪的是,它们似乎已经删除了间接分支或任何等效的调用/调用,因此即使您在 BEQ 之后也无法编写返回的代码想要。 (真正的ARM有bl,branch-and-link,将返回地址保存在寄存器中。)
  • @Antoniossss:没关系,我只是想正确标记这个问题,以便其他人可以找到它。

标签: assembly


【解决方案1】:

有人可以向我解释为什么一个人被转移到 执行分支labela后内存位置102?

因为标签只是为了您的方便。编译器将它们转换为程序内存偏移量,然后在每次出现标签时都用该程序指令偏移量(地址)替换。

标签不像高级编程语言中的方法或函数。知道了,从 labela 到 HALT 的下面的行一一执行

labela:
 MOV R4, #1   // move #1 into R4
labelb:   // there is no such thing in program instuctions, just go on!
 STR R4, 102  // save #1 into mem102
 HALT        //halt

所以一旦你到达labela,就没有回头路了;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2010-12-24
    • 2014-10-07
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多