这些说明是做什么的

时间:2009-09-15 19:16:47

标签: assembly msp430

我正在使用msp430指令集的模拟器。 gnu汇编程序将允许您编码如下指令:

fc0a: 12 10 00 02 rrc &0x0200       
fc0e: 22 11       rra #4        
fc10: 23 52       add #4,#2

我的猜测是rrc& 0x0200将从地址0x0200获取执行旋转然后将答案写回地址0x0200,对吗?但#ra rra会做什么?来源将是我假设的直接4但操作后是否有目的地?添加#4,#2组合成你所期望的(如2b10,source = r2,ad = 1b0,dest = r3),binutils反汇编程序虽然不知道如何处理该指令。

这些有效的说明吗?

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

他们有可能。查看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指令。