计算偏移量(Motorola 68k)

时间:2015-10-29 23:49:23

标签: assembly 68000

我给出了一个问题来找到偏移量:

假设指令BNE HERE位于存储单元$ FF1234中,标签HERE表示地址$ FF12C0处的指令。计算此指令的偏移量(位移)。偏移是否会被典型的汇编程序存储为8位或16位值?为什么呢?

我尝试这样做以找到位移:

FF1234 + offset = HERE = FF12C0
I tried solving for Offset which is:

 FF1234
-FF12C0

等于:33432820?

这是否是计算偏移量的正确方法?

1 个答案:

答案 0 :(得分:0)

首先:检查BNE指令如何使用偏移以及如果跳转,PC值用于计算下一个PC值。

来自http://68k.hax.com/Bcc

  

描述:如果指定的条件为真,则执行程序   继续在位置(PC)+位移。 PC包含地址   Bcc指令的指令字加上两个。该   位移是一个代表相对的二进制补码整数   从当前PC到16位位移的距离(以字节为单位)   使用紧跟在指令之后的字)。如果是8位   指令字中的位移字段都是1($ FF),.   32位位移(紧跟指令后的长字)是   使用

因此,如果BNE指令位于$FF1234,则用作要添加的偏移量的基础的PC的值为$FF1236

OTOH,PC目标值为$FF12C0,因此$FF1236 + offset = $FF12C0offset将是一个积极的价值。你应该没有问题搞清楚。

关于这个问题:

  

通过典型值将偏移量存储为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(零偏移)。