【问题标题】:Immediate Addressing mode difference?立即寻址模式的区别?
【发布时间】:2018-12-04 16:41:11
【问题描述】:

最近在研究寻址方式的概念,第一种是立即寻址方式,考虑例子ADD #NUM1,R0(指令执行从左到右)

这里,NUM1的地址是否存储在寄存器R1中? 当我们使用ADD #4,R0 使其指向下一个数据时,当我们使用#4 时,我知道它在寄存器R0 的内容上加了4。当我们使用#NUM1#4 时有区别吗?请解释!

【问题讨论】:

  • “地址模式”命名是一团糟,像add #num1, r0 这样的汇编表达式的确切含义取决于汇编程序。立即寻址模式通常意味着指令的操作数嵌入在指令本身的专用字段中。对于用户来说,这意味着他们可以在指令中使用数字常量(例如,add #5, r0 将 5 添加到 r0)。这与 add (5), r0 (我正在发明这种语法)之类的东西形成对比,其中 5 用于从内存中读取以获取要添加到 r0 的数字(即地址 5 的内容是添加到r0)。

标签: cpu-architecture


【解决方案1】:

我们使用#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 链接)。

数字地址在汇编时不可用,仅在链接时可用。目标文件格式保存符号重定位的元数据,一旦链接器决定将加载代码的位置,它就可以填写绝对数字地址。

生成的机器代码仍然相同。

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2019-02-27
    • 2015-04-11
    • 1970-01-01
    相关资源
    最近更新 更多