题
我正在开发 msp430 指令集的模拟器。gnu 汇编器将允许您编码如下指令:
fc0a: 12 10 00 02 rrc &0x0200
fc0e: 22 11 rra #4
fc10: 23 52 add #4,#2
我的猜测是 rrc &0x0200 将从地址 0x0200 获取执行旋转然后将答案写回地址 0x0200,对吗?但是 rra #4 会做什么呢?我假设源是立即的 4 但操作后有目的地吗?add #4,#2 组装成您期望的内容(如 2b10,source = r2,ad = 1b0,dest = r3),但 binutils 反汇编程序不知道如何处理该指令。
这些指令有效吗?
解决方案
尽管似乎没有任何关于此效果的明确的在线参考,但我倾向于同意这两个说明(以及其他几个说明)所示的OP 可能无效, ,即使它们符合数据表中定义的格式。
换句话说,并非组成指令字的各个部分的所有可能组合都是有效的。特别是许多使用立即寻址模式的单操作数指令和许多对目标具有立即寻址模式的双操作数指令在语义上可能不可行。
文档中对此效果只有一些提示,例如,在用户指南的第 3.3.7 节(关于立即寻址模式)中,注释表示“仅对源操作数有效。(顺便说一句,这适用于立即寻址模式的所有情况,而不仅仅是 R2 或 R3 常量生成技巧允许的速记情况。)
反汇编程序不知道如何处理这些代码这一事实也是另一个提示(尽管......有些反汇编器很容易被绊倒......)。
为了便于记录,我在下面收集了一些有关 MSP430 的有用参考资料:
- TI 的 MSP430 用户指南 (pdf) 第 3 章特别相关
- TI MSP430 微控制器 (pdf) 较短的概述(11 页)
- MSPGCC手册 适用于 MSP430 微控制器的 TI 工具的 GNU 端口。
其他提示
在当前的用户指南中,在3.4.4.2节中,它建议不要在命令RRA的目标字段中使用立即模式(#N),因为它会导致“不可预测的程序操作”。
他们有可能。查看Wikipedia上的指令集,操作码对寄存器和各种选项进行编码。所以这不是一个简单的映射。看起来你得到的输出是little-endian,所以这个:
fc0a: 12 10 00 02 rrc &0x0200
对应于指令1012,其以二进制为0001 0000 0001 0010。
这分解如下:
6 bits: 0001 00 - fixed; defines the instruction family
3 bits: 00 0 - instruction (RRC)
1 bit : 0 - byte or word parameter (0 = 16 bit parameter; 1 = 8 bit)
2 bits: 01 - addressing mode (01 = indexed;)
4 bits: 0010 - register
因此,在这种情况下,寄存器2中的偏移值从地址& 0200开始向右旋转。
你需要以完全理解的类似方式打破其他指令。对于ADD指令,源和目标寄存器/地址都在编码中 5223指令。