2

我正在为 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 反汇编程序不知道如何处理该指令。

这些指令有效吗?

4

3 回答 3

5

尽管似乎没有任何关于此效果的明确在线参考,但我倾向于同意 OP 的观点,即显示的两个指令(以及其他几个指令)可能无效,即使它们符合数据表中定义的格式.

换句话说,并非构成指令字的各个部分的所有可能组合都是有效的。特别是许多使用立即寻址模式的单操作数指令,以及许多对目标具有立即寻址模式的双操作数指令可能在语义上不可行。

文档中对此效果只有一些提示,例如,在用户指南第 3.3.7 节(关于立即寻址模式)中,注释指示“仅对源操作数有效。 ”(并且,顺便说一句,这适用于立即寻址模式的所有情况,而不仅仅是 R2 或 R3 常量生成技巧所允许的速记情况。)

反汇编程序不知道如何处理这些代码的事实也是另一个提示(尽管......一些反汇编程序很容易被绊倒......)。

为了便于记录,我在下面收集了一些对 MSP430 有用的参考资料:

于 2009-09-16T02:20:32.750 回答
2

在当前用户指南的第 3.4.4.2 节中,建议不要在命令 RRA 的目标字段中使用立即模式 (#N),因为它会导致“不可预测的程序操作”。

于 2011-08-06T00:00:57.267 回答
1

有可能他们是。查看 Wikipedia 上的指令集,操作码对寄存器和各种选项进行编码。所以这不是一个简单的映射。看起来你得到的输出是小端的,所以这个:

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 指令中编码。

于 2009-09-18T11:21:37.817 回答