我给出了一个问题来找到偏移量:
假设指令BNE HERE位于存储单元$ FF1234中,标签HERE表示地址$ FF12C0处的指令。计算此指令的偏移量(位移)。偏移是否会被典型的汇编程序存储为8位或16位值?为什么呢?
我尝试这样做以找到位移:
FF1234 + offset = HERE = FF12C0
I tried solving for Offset which is:
FF1234
-FF12C0
等于:33432820?
这是否是计算偏移量的正确方法?
答案 0 :(得分:0)
首先:检查BNE指令如何使用偏移以及如果跳转,PC值用于计算下一个PC值。
描述:如果指定的条件为真,则执行程序 继续在位置(PC)+位移。 PC包含地址 Bcc指令的指令字加上两个。该 位移是一个代表相对的二进制补码整数 从当前PC到16位位移的距离(以字节为单位) 使用紧跟在指令之后的字)。如果是8位 指令字中的位移字段都是1($ FF),. 32位位移(紧跟指令后的长字)是 使用
因此,如果BNE
指令位于$FF1234
,则用作要添加的偏移量的基础的PC的值为$FF1236
。
OTOH,PC目标值为$FF12C0
,因此$FF1236 + offset = $FF12C0
。 offset
将是一个积极的价值。你应该没有问题搞清楚。
关于这个问题:
通过典型值将偏移量存储为8位或16位值 汇编?为什么呢?
我不知道它意味着“典型的汇编程序”。我不知道它是指任何架构的典型汇编程序,还是m68k架构的典型汇编程序。我只能猜测这是指“典型的汇编程序生成m68k目标代码”,在这种情况下,您应该能够通过查看偏移值所需的位大小和BNE的编码选项来回答这个问题。说明,可在上述网页上找到:
指令格式:\ i3 - ++ - 4Condition,88位位移,
如果8位位移= $ 00,则为016位位移,
如果8位位移= $ FF,则为032位位移,
指令字段(寄存器移位):条件字段 - 二进制 表中列出的条件之一的代码。 8位位移 field - 指定字节数的二进制补码整数 在分支指令和要执行的下一条指令之间 如果满足条件。 16位位移字段 - 用于 当8位位移字段包含$ 00时的位移。 32位 位移场 - 用于8位时的位移 位移字段包含$ FF。
注意:紧接着以下指令的分支自动 因为8位,所以使用16位位移格式 位移字段包含$ 00(零偏移)。