何时在组装分支机器代码时使用8位,16位或32位位移?

时间:2018-04-19 23:20:20

标签: assembly branch machine-code 68000

我对68K装配中的BRA,BCC等操作机器代码有疑问。

是否有规则要知道位移的大小是8位,16位还是32位?例如,我使用BRA操作编写了一个具有-6字节位移的程序,其机器代码为:

60FA  (8 bit displacement)

然后我为BRA操作写了一个有6字节位移的程序,机器代码是:

6000 0006   (16 bit displacement)

正位移总是16位位移吗?

以下是手册对BRA操作码的说法,这进一步让我感到困惑:

8-Bit Displacement field: Twos complement integer specifying the number of bytes
between the branch instruction and the next instruction to be executed if the
condition is met.

16-Bit Displacement field: Used for the displacement when the 8-bit displacement
field contains $00.

32-Bit Displacement field: Used for the displacement when the 8-bit displacement
field contains $FF. 

我被告知如果位移大于字节大小而使用16位但是6不小于字节大小?

此外,位移总是像第一个例子中的“A”一样进行扩展吗?

由于

1 个答案:

答案 0 :(得分:2)

汇编程序将主要执行您告诉它的操作。我的68k汇编程序暴露了不同的行为 - 有些人会愚蠢地翻译我告诉他们的内容,有些人会在分支偏移量太小或太大而无法到达标签时发出警告和/或错误,而其他一些人会做几次调整来优化分支大小。这取决于你的汇编程序。

如果您没有明确告诉他们(使用.S或.L后缀),我认识的大多数汇编程序都会选择字大小偏移量。

但即使你的汇编程序为你优化,一个优秀的汇编程序员也会感觉到他需要达到标签所需的分支大小。

   BRA.S    label
   BRA.W    label
   BRA.L    label ; (68020 and up only)

产生三个不同的偏移值(字节,字,长字大小)以达到其目标。偏移值是2s补码,所以+ -126,+ -65534和+ -2 ^ -a很多。如果您选择的分支类型使用过多的偏移量,则会浪费内存空间和CPU(指令获取需要更长时间)。

相关问题