汇编语言混乱

时间:2018-12-19 22:47:51

标签: assembly

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

问题如下

  

图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中的程序。您可能不需要使用所有   行。

跟踪表:

Trace Table

表1:

Table 1 Picture

我想出的答案是:

answer

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

markscheme answer

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

有人可以告诉我为什么在执行分支标签a之后将一个转移到内存位置102吗?

在此先感谢所有回复!很抱歉,如果这是一个很长的问题,我真的很受困扰,并且在尝试自己解决这个问题后,我不知道该去哪里。

1 个答案:

答案 0 :(得分:3)

  

有人可以向我解释为什么将一个转移到   执行分支标签后是否存储位置102?

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

标签与高级编程语言中的方法或函数不同。知道这一点,从标签到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,就不会后退;)