ARM微处理器的存储器格式

ARM微处理器的存储器格式

最大寻址空间

ARM体系结构所支持的最大寻址空间为4GB(\(2^{32}\)字节)

字长、指令长度

ARM处理器的字长是32位,则一条汇编指令的长度也是32位,也就是四个字节(8位一个字节),而内存中一个地址单元是一个字节,也就是说一条指令要占据4个地址单元。 假设程序顺序执行(一条接一条,没有跳转),假设当前正在CPU中执行的指令A的首地址是0,也就是说指令A的存放位置是内存中的0—3这4个地址单元。

ARM是一种32位处理器,即ARM处理器处理的数据通常是以32位二进制位基本单位的。ARM中的一个32位数叫做一个字。在存储器中,ARM的一个基本数据需要占用4个连续存储单元,为了判断哪四个单元为一个字,ARM规定一个字所占用的4个连续存储单元的第一个单元地址的低2位必须是00(能被被四整除)。

大端格式、小端格式

根据字的4字节在4个存储单元中的存储顺序,ARM提供了两种存储方式:小端方式和大端方式。系统默认的是小端方式,即字的低位字节在地址的底端(小端)。

理解

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

例如,16bit宽的数0x1234在Little-endian(小端)模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址 0x4000 0x4001
存放内容 0x34 0x12

而在Big-endian(大端)模式CPU内存中的存放方式则为:

内存地址 0x4000 0x4001
存放内容 0x12 0x34

32bit宽的数0x12345678在Little-endian(小端)模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x78 0x56 0x34 0x12

  而在Big-endian(大端)模式CPU内存中的存放方式则为:

内存地址 0x4000 0x4001 0x4002 0x4003
存放内容 0x12 0x34 0x56 0x78

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

指令长度及数据类型

ARM微处理器的指令长度可以是32位(在ARM状态下),也可以为16位(在Thumb状态下)。

ARM微处理器中支持字节(8位)、半字(16位)、字(32位)三种数据类型,其中,字需要4字节对齐(地址的低两位为0)、半字需要2字节对齐(地址的最低位为0

ARM微处理器中的字为32位(4字节)、半字为16位(2字节)、字节为8位(1字节)。

大多数计算机使用字节(8位的数据块)作为最小可寻址的存储器单位,而不是访问存储器中单独的位。存储器的每一个字节都由唯一的数字标识,称为该字节的地址,所有可能地址的集合称为存储器空间。

举例来说,ARM处理器工作状态有如下两种:

ARM状态:执行字对齐的32位ARM指令。

Thumb状态:执行半字对齐的16位Thumb指令。

对于字对齐:

假如,第一次取ARM指令1的地址为 0x0000 0000,由于ARM指令占32位(4个字节),因此地址0x0000 0001、0x0000 0002、0x0000 0003(分别指向一个字中的4个字节的地址)都是指令1的地盘。那么第二次取ARM指令2的地址为 0x0000 0004,同样的道理,0x0000 0005、0x0000 0006、0x0000 0007也都是指令2的地盘,以此类推:

指令1:0x0000 0000——0x0000 0003

指令2:0x0000 0004——0x0000 0007

指令3:0x0000 0008——0x0000 000B

指令4:0x0000 000C——0x0000 000F

观察各个指令的起始地址

若按十进制来看分别是:0、4、8、12、…都可以被4整除

若按二进制来看bit1和bit0都是0:也就是说它们的起始地址都是0bxxxxxxxx xxxxxxxx xxxxxxxx xxxxxx00(32位地址)

同理,对于Thumb指令,他们的起始地址都是0bxxxxxxxx xxxxxxxx xxxxxxxx xxxxxxx0(32位地址)


ARM微处理器的存储器格式
https://jetthuang.top/所有/ARM最大寻址空间、字长、指令长度/
作者
Jett Huang
发布于
2022年3月11日
许可协议