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

时间:2016-06-29 19:49:59

标签: assembly instructions addressing-mode

  

我们有一个任务,给出了一个2-addressing的汇编指令   机:

mov 202, 100[r1+]
     

记下一个替换它的最小汇编指令序列   指示(见上文)

,其中

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

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

我们应该使用的地址是:

  1. rx - 注册直接寻址
  2. [rx] - 注册间接寻址
  3. #n - 直接致辞
  4. 我们只允许使用add,sub,mov。

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

    解决方案:

    add #100, r1
    mov #202, r2
    mov[r2],[r1]
    sub #99, r1
    

3 个答案:

答案 0 :(得分:6)

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

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

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

它将我们需要临时添加的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)