MSP430 微控制器 - 如何检查寻址模式
MSP430 microcontroller - how to check addressing modes
我正在用 C 语言对 MSP430 进行编程,以模拟真实的微控制器。我陷入寻址模式 (https://en.wikipedia.org/wiki/TI_MSP430#MSP430_CPU),尤其是:
- 使用 R0 (PC) 的寻址模式
使用 R2 (SR) 和 R3 (CG) 的寻址模式,特殊情况解码
- 我不明白 0(PC)、2(SR) 和 3(CG) 是什么意思。它们是什么?
- 如何查看这些值?
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
我正在用 C 语言对 MSP430 进行编程,以模拟真实的微控制器。我陷入寻址模式 (https://en.wikipedia.org/wiki/TI_MSP430#MSP430_CPU),尤其是:
- 使用 R0 (PC) 的寻址模式
使用 R2 (SR) 和 R3 (CG) 的寻址模式,特殊情况解码
- 我不明白 0(PC)、2(SR) 和 3(CG) 是什么意思。它们是什么?
- 如何查看这些值?
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