5 assembly instructions addressing-mode
我们有一个任务,给出了一个2寻址机器的汇编指令:
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
理解汇编语言不是一些通用的标准化事物.它是由读取它的程序正式定义的,它是汇编程序.因此,无论代码定义为汇编程序的语言是语言.机器代码对处理器来说至关重要,因此您可以拥有与用户一样多的不同汇编程序和汇编语言,只要它们都能生成正确的机器代码即可.因此,如果您希望这是通用的,则一条规则适用于所有不是这种情况的事情.
您已经为有经验的人提供了足够的信息,以便了解其他汇编语言的习惯.
mov 202, 100[r1+]
Run Code Online (Sandbox Code Playgroud)
所以这似乎正在改变你所说的202寄存器直接寻址的地址.到地址r1 + 100寄存器索引的位置和后增量.
要用更多指令替换它,因为就代码行而言,一行是最简单的一行(就复杂性和时钟数量而言不一定).
给出的解决方案几乎可以:
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更直观,但是汇编语言再次由编写汇编程序的人员定义,有些人喜欢它从左到右,其他人从右到左.