【问题标题】:MSP430 microcontroller - how to check addressing modesMSP430 微控制器 - 如何检查寻址模式
【发布时间】:2016-04-19 03:43:25
【问题描述】:

我正在用 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. 如何检查这些值?

【问题讨论】:

  • 你真的是在用 C 编程,还是在使用汇编?
  • 看电气工程的答案,或者我会在这里转贴。你不应该在两个地方出现同样的问题。
  • 不要在问题或答案中使用外部链接,或者至少不要在问题或答案中使用外部链接,因为远程链接最终可能会改变并使这个问题对 SO 读者无用。重写或以其他方式发布外部信息,使其在问题或答案中的 stackoverflow 中/上。
  • @dwelch 我向您致敬,您甚至可以理解原始问题的意图。
  • 不确定我是否理解 OP 对哪个部分感到困惑。

标签: c simulation microcontroller msp430


【解决方案1】:

如果 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 的指令之后在闪存中烧写一个字。

让目的地为常数 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 的目标为 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 立即到 r1 示例一样执行正常情况。 r1 的目的地是一个正常的 Rn 案例。

【讨论】:

  • 使用 gnu 工具。 (apt-get install gcc-msp430 msp430-libc)您可以轻松组装然后反汇编,语法可能与维基百科页面不完全匹配,但您可以弄清楚(编译一些非常简单的 C 程序并编译为 asm 或反汇编这些程序以获得有关语法的线索)。然后开始在 asm 中尝试各种寻址模式,然后使用工具链进行组装和反汇编,然后您可以使用您的程序进行反汇编或模拟。
  • 如果您无法完成所有这些事情(制作 asm 代码以生成各种可能的指令),那么您还没有准备好远程编写模拟器。
【解决方案2】:
  • 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 的值。

    使用始终为零的寄存器允许对绝对地址进行编码,而无需为此使用特殊的寻址模式(只是一个特殊的寄存器)。

  • 常量 -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
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2012-05-11
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多