编译器/汇编器如何理解处理器核心寄存器?

时间:2017-06-01 17:35:02

标签: arm microcontroller cpu-registers cortex-m3

我的问题是针对手臂皮质M3微控制器。微控制器上的每个外设都是存储器映射的,并且这些存储器地址用于处理。

例如,:GPIOA-> ODR = 0;
这将在地址0x4001080C处写入0。 该地址在微控制器的设备特定文件中定义。

现在,皮质M3具有处理器核心寄存器R0-R12(通用)。我想知道,这些寄存器是否也有其他外设的地址?

所以,如果我有指令:MOV R0,#10;
组装时R0会被翻译成某个地址吗?核心寄存器是否具有核心外设专用的特殊数字地址。是否在GPIOA的任何文件中定义了R0的地址(我找不到)?或者是寄存器R0和其他核心寄存器仅被称为R0及其各自的名称,以便汇编器看到" R0"并从中生成操作码?

我有这种困惑,因为一些8位控制器也有通用寄存器的地址。

谢谢,
纳文

3 个答案:

答案 0 :(得分:1)

R0 - R12SPPC等的寄存器是CPU内核中的寄存器,它们未映射到全局地址空间。只能从汇编程序访问这些寄存器。

也不可能直接访问来自C等高级语言的核心寄存器,因为它们不可寻址。这些寄存器用于内部处理,对程序员来说是透明的。

但像GPIOA-> ODR这样的寄存器被映射到全局地址空间,因此每个寄存器都有自己的地址。

答案 1 :(得分:0)

通用寄存器用于与CPU进行通用操作。这就像我们在任何编程语言中使用很少的临时变量一样。因此,如果我们将此与您的问题联系起来,CPU需要很少的保留内存段来执行它的基本操作。因此,与外界分享这一点毫无意义。这就是基于ARM的处理器的工作原理。

答案 2 :(得分:0)

你碰巧选择了一条很容易看到的指令......

.thumb

mov r0,#10
mov r1,#10
mov r2,#10
mov r3,#10
mov r4,#10
mov r5,#10
mov r6,#10
mov r7,#10

汇编然后反汇编以查看机器代码

Disassembly of section .text:

00000000 <.text>:
   0:   200a        movs    r0, #10
   2:   210a        movs    r1, #10
   4:   220a        movs    r2, #10
   6:   230a        movs    r3, #10
   8:   240a        movs    r4, #10
   a:   250a        movs    r5, #10
   c:   260a        movs    r6, #10
   e:   270a        movs    r7, #10

根据指定寄存器的指令和指令集(arm vs thumb(以及thumb2扩展名)),将有三个或四个位。在这种情况下,这些位恰好与机器代码指令的十六进制表示排成一行,因此我们可以看到0到7.对于cortex-m3,许多拇指指令仅限于r0-r7(暗示3位字段)在指令内,有一个或两个在下部和上部之间移动,thumb2扩展允许更多访问完整的r0-r15(因此在指令中将有4位字段)。您应该获得与cortex-m3相关的armv7m架构参考手册(在获得cortex-m3技术参考手册并看到它使用armv7m架构之后),您还可以获得最早的armv5架构参考手册它具有最早的拇指指令集描述,这是一个与所有臂核兼容的指令集armv6m覆盖了cortex-m0,其中thumb2扩展较少,然后armv7m覆盖了cortex-m3 m4和m7有更多thumb2扩展。

另一个只需要一秒钟尝试的例子

.thumb

mov r0,r0
mov r1,r1
mov r2,r2
mov r3,r3
mov r4,r4
mov r5,r5
mov r6,r6
mov r7,r7

mov r0,r0
mov r1,r0
mov r2,r0
mov r3,r0
mov r4,r0
mov r5,r0
mov r6,r0
mov r7,r0

Disassembly of section .text:

00000000 <.text>:
   0:   1c00        adds    r0, r0, #0
   2:   1c09        adds    r1, r1, #0
   4:   1c12        adds    r2, r2, #0
   6:   1c1b        adds    r3, r3, #0
   8:   1c24        adds    r4, r4, #0
   a:   1c2d        adds    r5, r5, #0
   c:   1c36        adds    r6, r6, #0
   e:   1c3f        adds    r7, r7, #0
  10:   1c00        adds    r0, r0, #0
  12:   1c01        adds    r1, r0, #0
  14:   1c02        adds    r2, r0, #0
  16:   1c03        adds    r3, r0, #0
  18:   1c04        adds    r4, r0, #0
  1a:   1c05        adds    r5, r0, #0
  1c:   1c06        adds    r6, r0, #0
  1e:   1c07        adds    r7, r0, #0

请注意,这些位没有像以前那样使用十六进制值很好地排列,看看二进制文件看看三位在指令之间的变化并不重要。

在这种情况下,汇编程序选择使用add而不是mov

  

注意:

     

编码:该指令编码为ADD Rd,Rn,#0。

  

注释

     

操作数限制:如果为和指定了低位寄存器   H1 == 0和H2 == 0),结果是不可预测的。

所有这些加上您在阅读文档时学到的更多内容。 http://infocenter.arm.com。在左臂架构然后参考手册,你可能不得不牺牲一个电子邮件地址。你可以谷歌手臂建筑参考手册,你可能会很幸运...