试图理解这个简短的汇编程序指令,但我不明白

5 assembly instructions addressing-mode

我们有一个任务,给出了一个2寻址机器的汇编指令:

mov 202, 100[r1+]
Run Code Online (Sandbox Code Playgroud)

记下最小的汇编程序指令序列,它取代了这条指令(见上文)

哪里

  • n[rx+]:寄存器增量索引; n是索引值,rx是寄存器x

  • 单个数值:直接寻址/存储

我们应该使用的地址是:

  1. rx - 注册直接寻址
  2. [rx] - 注册间接寻址
  3. #n - 直接寻址

我们只允许使用add,sub,mov.

我特别不明白#代表什么,为什么我们需要减法,实际上我真的不懂任何东西......任务已经解决,所以我不是在寻找解决方案.我需要解释它是如何完成的,试图自己理解但它不起作用.我希望有人能帮助我,对你这么好!

解:

add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
Run Code Online (Sandbox Code Playgroud)

old*_*mer 6

理解汇编语言不是一些通用的标准化事物.它是由读取它的程序正式定义的,它是汇编程序.因此,无论代码定义为汇编程序的语言是语言.机器代码对处理器来说至关重要,因此您可以拥有与用户一样多的不同汇编程序和汇编语言,只要它们都能生成正确的机器代码即可.因此,如果您希望这是通用的,则一条规则适用于所有不是这种情况的事情.

您已经为有经验的人提供了足够的信息,以便了解其他汇编语言的习惯.

mov 202, 100[r1+]
Run Code Online (Sandbox Code Playgroud)

所以这似乎正在改变你所说的202寄存器直接寻址的地址.到地址r1 + 100寄存器索引的位置和后增量.

要用更多指令替换它,因为就代码行而言,一行是最简单的一行(就复杂性和时钟数量而言不一定).

  • 所以你需要阅读地址202的内容,
  • 你需要临时加100到r1,
  • 你需要将地址202的内容写入位置r1 + 100,
  • 然后你需要取r1并递增它(不是r1 + 100增加但是r1没有增加索引).

给出的解决方案几乎可以:

add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
Run Code Online (Sandbox Code Playgroud)

它将我们需要临时添加的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
Run Code Online (Sandbox Code Playgroud)

右边的目的地和左边的操作数是不直观的,因为我们主要编写和编码左边的结果和右边的操作数.

我们不编写代码202 = r2; 而是编写,r2 = 202;因此mov r2,#202更直观,但是汇编语言再次由编写汇编程序的人员定义,有些人喜欢它从左到右,其他人从右到左.