代码之家  ›  专栏  ›  技术社区  ›  old_timer

这些说明的作用是什么

  •  2
  • old_timer  · 技术社区  · 15 年前

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

    这些指示有效吗?

    3 回复  |  直到 15 年前
        1
  •  5
  •   mjv    12 年前

    可能无效 ,即使它们符合数据表中定义的格式。

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

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

    为了便于文档记录,我收集了以下有关MSP430的一些有用参考资料:

        2
  •  2
  •   Ben Ward    13 年前

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

        3
  •  1
  •   Callie J    15 年前

    有可能是的。查看维基百科上的指令集,操作码对寄存器和各种选项进行编码。所以这不是一个简单的映射。看起来您得到的输出是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
    

    您需要以类似的方式分解其他说明才能完全理解。对于ADD指令,源寄存器和目标寄存器/地址都在