今天看 ARM7 相关的文档的时候,看到 Arm 指令格式区分的表格,但是发现格式并不是完全各自独立的,同一个指令可能会匹配到多种格式。
比如: xxxx_0000_10xx_xxxx_xxxx_0000_1001_xxxx 这条指令会匹配到 Multiply Long 和 Halfword Data Transfer:register offset 这两种格式。
// 没问题
xxxx_100x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx Block Data Transfer
xxxx_101x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx Branch
xxxx_110x_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx Coprocessor Data Transfer
xxxx_1110_xxxx_xxxx_xxxx_xxxx_xxx0_xxxx Coprocessor Data Operation
xxxx_1110_xxxx_xxxx_xxxx_xxxx_xxx1_xxxx Coprocessor Register Transfer
xxxx_1111_xxxx_xxxx_xxxx_xxxx_xxx1_xxxx Software Interrupt
//
xxxx_0000_1xxx_xxxx_xxxx_xxxx_1001_xxxx Multiply Long
xxxx_000x_x0xx_xxxx_xxxx_0000_1xx1_xxxx Halfword Data Transfer:register offset
xxxx_0000_00xx_xxxx_xxxx_xxxx_1001_xxxx Multiply
xxxx_000x_x1xx_xxxx_xxxx_xxxx_1xx1_xxxx Halfword Data Transfer:immediate offset
xxxx_0001_0010_1111_1111_1111_0001_xxxx Branch and Exchange
xxxx_0001_0x00_xxxx_xxxx_0000_1001_xxxx Single Data Swap
xxxx_00xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx Data Processing / PSR Transfer
xxxx_011x_xxxx_xxxx_xxxx_xxxx_xxx1_xxxx Undefined
xxxx_01xx_xxxx_xxxx_xxxx_xxxx_xxxx_xxxx Single Data Transfer