了解汇编语言不是某种通用的标准化东西。它由读取它的程序(即汇编程序)正式定义。因此,无论该代码定义为该汇编程序的语言,就是该语言。机器代码对处理器来说很重要,因此您可以拥有与用户一样多的不同汇编程序和汇编语言,只要它们都生成正确的机器代码即可。因此,如果您期望这是普遍适用的,则一条规则适用于所有情况,但事实并非如此。
不过,您已经为有经验的人提供了足够的信息,让他们可以看到此处反映的其他汇编语言的习惯。
mov 202, 100[r1+]
因此,正如您所说,这似乎正在移动 202 寄存器直接寻址的地址。到地址 r1+100 寄存器索引的位置和后增量。
用更多指令替换它,因为就代码行而言,一行是最简单的一行(就复杂性和时钟数量而言不一定)。
- 所以需要读取地址202的内容,
- 你需要暂时给r1加100,
- 您需要将地址202的内容写入到位置r1+100,
- 然后你需要获取 r1 并递增它(不是 r1+100 递增,而是 r1 没有索引递增)。
给出的解决方案几乎可以做到这一点:
add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
它将 100 添加到 r1 中,我们需要暂时执行此操作(并且稍后必须撤消,因为从长远来看,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;
so mov r2,#202
更直观,但汇编语言是由编写汇编程序的人定义的,有些人喜欢从左到右,有些人喜欢从右到左。