最近当我研究寻址模式的概念时,第一种类型是即时寻址模式,请考虑示例ADD #NUM1,R0
(从左到右执行指令)
这里,NUM1
的地址是否存储在寄存器R1中? 当我们做ADD #4,R0
让它指向下一个数据时呢,当我们使用#4
时,我知道它在寄存器 R0 的内容中添加了 4。当我们使用#NUM1
和#4
时有区别吗?请解释一下!
我们使用
#NUM1
和#4
有区别吗
在可执行文件中CPU实际运行的最终机器代码中,不,没有。
如果你有一个直接创建可执行文件的汇编程序(没有单独的链接步骤),那么汇编程序将在汇编时知道NUM1
的数字地址,并简单地将其扩展为立即,产生与您编写add #0x700, R0
完全相同的机器代码。 (假设本示例的NUM1
标签最终位于地址0x700
。
例如,如果add #imm, R0
的机器编码是00 00 imm16
,那么你会得到00 00 07 00
(假设立即使用位端)。
在这里,NUM1 的地址是否存储在寄存器 R1 中?
不,它已添加到R0。 如果 R0 以前包含4
,则 R0 现在将保存地址NUM1+4
。
R1 不受影响。
通常,您有一个汇编程序和一个单独的链接器(例如as foo.s -o foo.o
组装然后与ld -o foo foo.o
链接)。
数字地址在组装时不可用,仅在链接时可用。 对象文件格式保存符号重定位的元数据,链接器在决定代码的加载位置后,允许链接器填充绝对数字地址。
生成的机器代码仍将相同。