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

MSP430 microcontroller - how to check addressing modes

我正在用 C 语言对 MSP430 进行编程,以模拟真实的微控制器。我陷入寻址模式 (https://en.wikipedia.org/wiki/TI_MSP430#MSP430_CPU),尤其是:

so 对于source 如果as bits 是01 source register bits 是0 是参考的pc 那么

地址符号。等同于 x(PC)。操作数在内存中地址 PC+x.

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

地址符号。等同于 x(PC)。操作数在内存中地址 PC+x.

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

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

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

如果广告位是 1 并且目标寄存器是 2 那么它也是一个 &ADDR

如果 as 位是 10,源位是 2,那么源是常量值 4,我们不必在 4 的指令后在闪存中烧录一个字。

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

对 table 的其余部分重复上述步骤。

你可以同时拥有这两种寻址方式

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

所以我们有一个源为 0 的 as of 11,即直接#x,一个 ad 为 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 案例。

  • 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 寄存器允许编码绝对地址而不需要特殊的寻址模式(只是一个特殊的寄存器)。

  • constants -1/0/1/2/4/8: 在大多数寻址模式下使用SR和CG寄存器是没有意义的,所以这些编码用于生成特殊值没有单独的数据字,保存 space:

    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