[其他ST产品] stm32(ARM CPU)与x86 CPU架构组成的异同点 x86CPU组成

[复制链接]
984|7
 楼主| hehhehee 发表于 2024-2-28 14:17 | 显示全部楼层 |阅读模式
x86CPU组成:
CPU的内部架构和工作原理


823665decfa2852c2.png
cpu架构一
9160765decfc6a120e.png
这里的AC累加器、缓冲寄存器和ARM里的通用寄存器R0、R1是一个作用


592565decfd90d8f1.png

ARM


8982165decfe8716df.png


 楼主| hehhehee 发表于 2024-2-28 14:17 | 显示全部楼层
stm32中指令、汇编语言、机器码
8436665decffb08605.png
CPU的内部架构和工作原理

根据操作数的地址是在寄存器还是在内存还是立即数,将这些数据传输类型分为以下几种:

1、Cortex-CM3中的数据传输类型

1)、两个寄存器间的传输数据。MOV

2)、寄存器与存储器间传输数据。LDR、STR

3)、寄存器与特殊功能寄存器间传输数据。

4)、把一个立即数加载到寄存器。MOV
 楼主| hehhehee 发表于 2024-2-28 14:18 | 显示全部楼层
可以通过命令行来汇编与反汇编

6885765ded01694c17.png
4532365ded01eae56a.png

Thumb/Thumb2指令集
6033665ded02e8fa67.png
 楼主| hehhehee 发表于 2024-2-28 14:18 | 显示全部楼层
看下面这个例子:
4700165ded0478dfed.png
LED0=0这条C指令编译器把它转换成了3条汇编指令MOVS、LDR、STR,这三句汇编分别对应的机器码就是2000、490B、6008。
图中,0x08。。。是CODE地址,然后该地址开始的机器码,最后就是这个机器对应的汇编语句。
F04F0001是对应汇编的机器码,你不用关心它的长度,有兴趣的可以去查汇编指令表,其中有对应机器码的格式

上面的机器码对三种操作数的寻址:寄存器(R0这些)、内存(flash等)、立即数
对立即数寻址就是确定该立即数的大小,
 楼主| hehhehee 发表于 2024-2-28 14:21 | 显示全部楼层
2781565ded0f551416.png

首先我们分析下上面的例子:

490B LDR R1,[PC,#44]
490A LDR R1,[PC,#40]

这两的机器码为啥只差了1,而立即数差了4

这是因为立即数寻址是有8位图决定的,不是直接映射数值的

4304165ded0d24033c.png
9152165ded0cabc9da.png
我们可以看到它是将机器码的0-4位乘以4得到最终的立即数
0xb=11,114=44
0xa=10,104=40
 楼主| hehhehee 发表于 2024-2-28 14:22 | 显示全部楼层
1555565ded105e71dc.png

6149065ded1116089f.png
为什么要通过这种方式来寻址:

寄存器寻址可以直接控制寄存器,在机器码中所需的位数不多,够用
内存中寻址,如果是32位的那地址就有0-2的32次方,32位指令的话不够用,但这里就可以采用【】的方式间接寻址
而立即数就没有办法通过直接和间接来,32位指令中间除去操作码,剩下的位数根本覆盖不了0-2的32次方,所有采用了位图加循环右移的方式
 楼主| hehhehee 发表于 2024-2-28 14:22 | 显示全部楼层
Henryko 发表于 2024-2-29 22:52 | 显示全部楼层
这个的指令集是不一样的吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

89

主题

1252

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部