我有一个问题关于机器代码的操作,如胸罩,密件抄送等…在68K汇编中。
是否有一条规则可以知道位移的大小是8位、16位还是32位?例如,我使用BRA操作编写了一个具有-6字节位移的程序,其机器代码是:
60FA (8 bit displacement)然后我写了一个程序,它有6个字节的位移用于胸罩操作,机器代码是:
6000 0006 (16 bit displacement)正的位移总是16位的位移吗?
以下是手册中关于胸罩操作码的说明,这进一步让我感到困惑:
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“一样带符号扩展?
谢谢
发布于 2018-04-25 01:52:50
汇编器主要是按照你说的做。我的68k汇编器暴露了不同的行为-一些会默默地翻译我告诉他们的东西,一些会在分支偏移量太小或太大而无法到达标签时发出警告和/或错误,还有一些会执行几次遍历来优化分支大小。这取决于您的汇编程序。
我认识的大多数汇编程序,如果你没有明确地告诉他们不这样做(使用.S或.L后缀),他们会选择字大小偏移量。
但是,即使你的汇编器为你优化了,一个好的汇编器程序员也知道他需要多大的分支大小才能到达标签。
BRA.S label
BRA.W label
BRA.L label ; (68020 and up only)生成三个不同的偏移值(字节、字、长字大小)以达到其目标。偏移量是2s-补码,所以+-126. +-65534和+-2^-很多。如果你选择的分支类型使用了太多的偏移量,你就浪费了内存空间和CPU (取指令需要更长的时间)。
https://stackoverflow.com/questions/49931639
复制相似问题