我的问题是针对手臂皮质M3微控制器。微控制器上的每个外设都是存储器映射的,并且这些存储器地址用于处理。
例如,:GPIOA-> ODR = 0;
这将在地址0x4001080C处写入0。
该地址在微控制器的设备特定文件中定义。
现在,皮质M3具有处理器核心寄存器R0-R12(通用)。我想知道,这些寄存器是否也有其他外设的地址?
所以,如果我有指令:MOV R0,#10;
组装时R0会被翻译成某个地址吗?核心寄存器是否具有核心外设专用的特殊数字地址。是否在GPIOA的任何文件中定义了R0的地址(我找不到)?或者是寄存器R0和其他核心寄存器仅被称为R0及其各自的名称,以便汇编器看到" R0"并从中生成操作码?
我有这种困惑,因为一些8位控制器也有通用寄存器的地址。
谢谢,
纳文
答案 0 :(得分:1)
R0
- R12
或SP
,PC
等的寄存器是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。在左臂架构然后参考手册,你可能不得不牺牲一个电子邮件地址。你可以谷歌手臂建筑参考手册,你可能会很幸运...