我们有一个任务,给出了一个2-addressing的汇编指令 机:
mov 202, 100[r1+]
记下一个替换它的最小汇编指令序列 指示(见上文)
,其中
n[rx+]
:注册后增量索引; n是索引值,rx是寄存器x
单个数值:直接寻址/存储
我们应该使用的地址是:
rx
- 注册直接寻址[rx]
- 注册间接寻址#n
- 直接致辞我们只允许使用add,sub,mov。
我特别不明白#代表什么,为什么我们需要减法,实际上我真的不懂任何东西...... 任务已经解决,所以我不寻找解决方案。我需要解释它是如何完成的,试图自己理解但它没有用。 我希望有人能帮助我,对你这么好!
解决方案:
add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
答案 0 :(得分:6)
理解汇编语言不是一些通用的标准化事物。它是由读取它的程序正式定义的,它是汇编程序。因此,无论代码定义为汇编程序的语言是语言。机器代码对处理器来说至关重要,因此您可以拥有与用户一样多的不同汇编程序和汇编语言,只要它们都能生成正确的机器代码即可。因此,如果您希望这是通用的,则一条规则适用于所有不属于这种情况的事情。
您已经为有经验的人提供了足够的信息,以便了解其他汇编语言的习惯。
mov 202, 100[r1+]
所以这似乎正在改变你所说的202寄存器直接寻址的地址。到地址r1 + 100寄存器索引的位置和后增量。
要用更多指令替换它,因为就代码行而言,一行是最简单的一行(就复杂性和时钟数量而言不一定)。
给出的解决方案几乎就是:
add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
它将我们需要临时添加的r1加100(并且必须稍后撤消,因为从长远来看r1现在是错误的)。 然后,因为它们限制了寻址模式,所以需要让寄存器保持地址202,因此值202被加载到r2中,就像将值100添加到r1一样。 #number表示只使用此号码。
现在你可以使用[rn],因此移动会读取地址r2(地址202)处的内容并将其写入地址r1(原始r1加100)的内容。最后因为我们希望r1最终成为原始加1,但我们将其设为原始加100我们需要减去99 r1 + 100-99 = r1 + 1
在C中,它会是这样的:
unsigned *r1;
unsigned *r2;
//r1 is set somewhere in here to something that is not defined in your question or problem.
r1 += 100; //add #100,r1
r2 = 202; //mov #202,r2
*r1 = *r2; //mov [r2],[r1]
r1 -= 99; //sub #99,r1
右边的目的地和左边的操作数是不直观的,因为我们主要编写和编码左边的结果和右边的操作数。
我们不编码202 = r2;
而是编写r2 = 202;
所以mov r2,#202
更直观,但汇编语言再次由编写汇编程序的人定义,有些人喜欢它从左到右,其他从右到左。
答案 1 :(得分:3)
在mov 202, 100[r1+]
:
mov
202
的内存。在某些汇编语言中,为清晰起见,您还可以编写[202]
。数字上没有#
,因此它是一种绝对寻址模式,而非即时模式。r1 + 100
的内存。r1++
与许多版本的汇编语言一样,这个版本显然使用#
前缀来表示立即常量。这类似于GNU / AT& T x86语法,其中add $4, %eax
添加4,但add 4, %eax
加载绝对地址4
中的值。
你教授给定的等效序列将{100}添加到r1
,然后减去99
,因为它希望避免在寻址模式中的位移和后增量。它也是单指令版本没有的r2
,所以它不是替代品。
答案 2 :(得分:-2)
您的解决方案根本不会映射到输入。在您的输入中,R1处于未知状态。在我们的“解决方案”中,R1最终处于已知状态(1)。
此外,您必须知道您的国家指令格式是什么。
mov 202, 100[r1+]
看起来会
1) add 100 to the contents of R1 to create an address.
2) move 202 into that address
3) Add 2 to r1 (assuming a 2-byte machine word)