我真的很难理解这个汇编语言问题,在查看了分数方案后,我无法弄清楚为什么我的答案与给出的答案有所不同。
问题如下
图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。
有人可以告诉我为什么在执行分支标签a之后将一个转移到内存位置102吗?
在此先感谢所有回复!很抱歉,如果这是一个很长的问题,我真的很受困扰,并且在尝试自己解决这个问题后,我不知道该去哪里。
答案 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
,就不会后退;)