我对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”一样进行扩展吗?
由于
答案 0 :(得分:2)
汇编程序将主要执行您告诉它的操作。我的68k汇编程序暴露了不同的行为 - 有些人会愚蠢地翻译我告诉他们的内容,有些人会在分支偏移量太小或太大而无法到达标签时发出警告和/或错误,而其他一些人会做几次调整来优化分支大小。这取决于你的汇编程序。
如果您没有明确告诉他们(使用.S或.L后缀),我认识的大多数汇编程序都会选择字大小偏移量。
但即使你的汇编程序为你优化,一个优秀的汇编程序员也会感觉到他需要达到标签所需的分支大小。
BRA.S label
BRA.W label
BRA.L label ; (68020 and up only)
产生三个不同的偏移值(字节,字,长字大小)以达到其目标。偏移值是2s补码,所以+ -126,+ -65534和+ -2 ^ -a很多。如果您选择的分支类型使用过多的偏移量,则会浪费内存空间和CPU(指令获取需要更长时间)。