MSP430微控制器 - 如何检查寻址模式

时间:2016-01-13 23:27:30

标签: c simulation microcontroller msp430

我正在使用C语言编写MSP430作为真实微控制器的仿真。我陷入了寻址模式(https://en.wikipedia.org/wiki/TI_MSP430#MSP430_CPU),特别是:

  • 使用R0(PC)
  • 寻址模式
  • 使用R2(SR)和R3(CG)寻址模式,特殊情况解码

    1. 我不明白0(PC),2(SR)和3(CG)是什么意思。它们是什么?
    2. 如何查看这些值?

2 个答案:

答案 0 :(得分:2)

因此,对于源,如果as位为01且源寄存器位为0,那么是用于参考的pc

ADDR符号。相当于x(PC)。操作数在地址PC + x的内存中。

如果广告位为1且目标为0,则

ADDR符号。相当于x(PC)。操作数在地址PC + x的内存中。

x将是该指令之后的另一个字,因此cpu将获取下一个字,将其添加到pc,这是源

如果as位为11且源为寄存器0,则源为立即值,该值位于指令后的下一个字中。

如果as位为01且源为2,恰好是SR寄存器以供参考,则地址为x指令后的下一个字(& ADDR)

如果ad位为1且目标寄存器为2,那么它也是& ADDR

如果as位为10,则源位为2,则源为常数值4,并且在指令4之后我们不必在flash中刻录一个字。

将目标设为常数4是没有意义的,因此不是真正的组合。

重复表格的其余部分。

您可以同时使用这两种寻址模式

mov #0x5A80,&0x0120

产生

c000:   b2 40 80 5a     mov #23168, &0x0120 ;#0x5a80
c004:   20 01

0x40b2 0x5a80 0x0120

0100000010110010
0100 opcode mov
0000 source
1 ad
0 b/w
11 as
0010 destination

所以我们有一个11的源,0的源是#x,1是1的广告,目的地是2,所以目的地是& ADDR。这是一个重要的实验,因为当你有2个x值时,一个三字的指令基本上哪一个与源和目的地一起

0x40b2 0x5a80 0x0120

所以作为目的地的地址0x5a80是跟随指令的第一个x,然后是源0x0120后立即出现。

如果它只是一个立即和一个寄存器那么

c006:   31 40 ff 03     mov #1023,  r1  ;#0x03ff

0x4031 0x03FF

0100000000110001
0100 mov
0000 source
0 ad
0 b/w
11 as
0001 dest

从11开始,0的源是#immediate,X在这种情况下是0x03FF,后面的字。目的地是0的广告

Register direct. The operand is the contents of Rn 

这种情况下的目的地是r1

所以第一组Rn,x(Rn),@ Rn和@Rn +是正常情况,你问的下面那些是特殊情况,如果你得到一个适合特殊情况的组合那么你这样做,否则你做正常情况,如上面的mov immediate to r1示例。 r1的目的地是正常的Rn案例。

答案 1 :(得分:1)

  • As = 01,Ad = 1,R0( ADDR ):这与 x(Rn)完全相同,即操作数在地址为R0 + x的存储器。

    当编译器不知道代码将位于哪个绝对地址时,它用于存储在使用它的代码附近的数据,但是它知道数据是例如指令后面的二十个字。

  • As = 11,R0( #x ):这与 @ R0 + 完全相同,用于需要数据字的指令来自指令流。例如,这个汇编程序指令:

    MOV #1234, R5
    

    实际编码并实现为:

    MOV @PC+, R5
    .dw 1234
    

    CPU读取MOV指令字后,PC指向数据字。读取第一个MOV操作数时,CPU读取数据字,然后再次递增PC。

  • As = 01,Ad = 1,R2(& ADDR ):这与x(Rn)完全相同,但R2寄存器读为零,所以你是什么最终得到的是x的值。

    使用always-zero寄存器允许对绝对地址进行编码,而无需为此设置特殊寻址模式(仅限特殊寄存器)。

  • 常量-1/0/1/2/4/8:在大多数寻址模式下使用SR和CG寄存器是没有意义的,因此这些编码用于生成特殊值而无需单独的数据字,以节省空间:

    encoding:       what actually happens:
    MOV @SR, R5     MOV #4, R5
    MOV @SR+, R5    MOV #8, R5
    MOV CG, R5      MOV #0, R5
    MOV x(CG), R5   MOV #1, R5  (no word for x)
    MOV @CG, R5     MOV #2, R5
    MOV @CG+, R5    MOV #-1, R5