试图理解这个简短的汇编程序指令,但我不明白
Trying to understand this short assembler instruction but I don't understand
We had a task, given was an assembler instruction of a 2-addressing
machine:
mov 202, 100[r1+]
Note down a minimal assembler instruction sequence which replaces this
instruction (see above)
哪里
n[rx+]
:以 post 增量索引的寄存器; n 是索引值,rx 是寄存器 x
单个数值:直接寻址/存储
我们应该使用的地址是:
rx
- 寄存器直接寻址
[rx]
- 注册间接寻址
#n
- 直接寻址
而且我们只能使用add, sub, mov.
我特别不明白#代表什么以及为什么我们需要减法,其实我真的什么都不懂...
任务已经解决,所以我不在寻找解决方案。我需要解释它是如何完成的,试图自己理解它但它没有用。
我希望有人能够帮助我,你真好!
解决方案:
add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
您的解决方案根本没有映射到输入。在您的输入中,R1 处于未知状态。在我们的 "solution" 中,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)
在mov 202, 100[r1+]
中:
- 指令是
mov
- 源操作数是地址
202
处的内存。在某些汇编语言中,为了清楚起见,您还可以编写 [202]
。数字上没有#
,所以是绝对寻址方式,不是立即数。
- 目标操作数是地址
r1 + 100
处的内存。
- 寻址模式的副作用是
r1++
像许多汇编语言一样,这个语言显然使用 #
前缀来表示立即数。这就像 GNU/AT&T x86 语法,其中 add , %eax
加 4,但 add 4, %eax
从绝对地址 4
.
加载一个值
你的教授给定的等效序列将 r1
加 100,然后减去 99
,因为它想避免位移和 post 寻址模式中的增量。它还破坏了 r2
,单指令版本没有,所以它不是直接替代品。
了解汇编语言不是某种通用的标准化语言。它由读取它的程序正式定义,即汇编程序。因此,无论该代码定义为该汇编程序的语言是什么语言。机器代码对处理器很重要,因此只要用户都生成正确的机器代码,您就可以拥有与用户一样多的不同汇编器和汇编语言。因此,如果您希望这是普遍适用的规则,则适用于所有情况并非如此。
您提供了足够的信息,让有经验的人可以看到这里反映的其他汇编语言的习惯。
mov 202, 100[r1+]
所以这似乎是在移动您所说的 202 寄存器直接寻址的地址。到地址 r1+100 寄存器索引的位置和 post 增量。
用更多指令替换它,因为就代码行而言,一行是最简单的(就复杂性和时钟数量而言不一定)。
- 所以需要读取地址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 现在在 long 运行 中是错误的)。
然后因为它们限制了寻址模式,你需要一个寄存器保存地址 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
更直观,但是汇编语言同样是由编写汇编程序的人和一些人定义的喜欢从左到右,其他人从右到左。
We had a task, given was an assembler instruction of a 2-addressing machine:
mov 202, 100[r1+]
Note down a minimal assembler instruction sequence which replaces this instruction (see above)
哪里
n[rx+]
:以 post 增量索引的寄存器; n 是索引值,rx 是寄存器 x单个数值:直接寻址/存储
我们应该使用的地址是:
rx
- 寄存器直接寻址[rx]
- 注册间接寻址#n
- 直接寻址
而且我们只能使用add, sub, mov.
我特别不明白#代表什么以及为什么我们需要减法,其实我真的什么都不懂... 任务已经解决,所以我不在寻找解决方案。我需要解释它是如何完成的,试图自己理解它但它没有用。 我希望有人能够帮助我,你真好!
解决方案:
add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1
您的解决方案根本没有映射到输入。在您的输入中,R1 处于未知状态。在我们的 "solution" 中,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)
在mov 202, 100[r1+]
中:
- 指令是
mov
- 源操作数是地址
202
处的内存。在某些汇编语言中,为了清楚起见,您还可以编写[202]
。数字上没有#
,所以是绝对寻址方式,不是立即数。 - 目标操作数是地址
r1 + 100
处的内存。 - 寻址模式的副作用是
r1++
像许多汇编语言一样,这个语言显然使用 #
前缀来表示立即数。这就像 GNU/AT&T x86 语法,其中 add , %eax
加 4,但 add 4, %eax
从绝对地址 4
.
你的教授给定的等效序列将 r1
加 100,然后减去 99
,因为它想避免位移和 post 寻址模式中的增量。它还破坏了 r2
,单指令版本没有,所以它不是直接替代品。
了解汇编语言不是某种通用的标准化语言。它由读取它的程序正式定义,即汇编程序。因此,无论该代码定义为该汇编程序的语言是什么语言。机器代码对处理器很重要,因此只要用户都生成正确的机器代码,您就可以拥有与用户一样多的不同汇编器和汇编语言。因此,如果您希望这是普遍适用的规则,则适用于所有情况并非如此。
您提供了足够的信息,让有经验的人可以看到这里反映的其他汇编语言的习惯。
mov 202, 100[r1+]
所以这似乎是在移动您所说的 202 寄存器直接寻址的地址。到地址 r1+100 寄存器索引的位置和 post 增量。
用更多指令替换它,因为就代码行而言,一行是最简单的(就复杂性和时钟数量而言不一定)。
- 所以需要读取地址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 现在在 long 运行 中是错误的)。 然后因为它们限制了寻址模式,你需要一个寄存器保存地址 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
更直观,但是汇编语言同样是由编写汇编程序的人和一些人定义的喜欢从左到右,其他人从右到左。