目录
1、ARM数据存储
(1) ARM数据类型
ARM采用32位架构,即ARM一次可以处理32bit的数据,基本的数据类型有以下三种:
- Byte 8 bits(1个字节)
- Halfword 16 bits(2个字节)
- Word 32 bits(4个字节)
前面说到,C语言是可以移植到arm处理器上的,但是C语言的数据类型和ARM的数据类型并不兼容,所以arm-gcc编译器在编译的时候,会将C语言的类型转换成ARM可以处理的数据类型,比如 char =》 Byte,short =》Halfword,int =》Word 。
注意:如果遇到了floate类型的数据,并非不能处理,可以采取拆分的方式进行运算,比如先处理整数部分,然后再处理小数部分;或者借助协处理器来运算。
(2) ARM数据存储的方式
数据本身是多少位,在内存存储时就应该多少位对齐。
- Byte:占1个字节,对齐必须是1的倍数,也就可以直接存储
- Halfword:占2个字节,在内存中保存的起始地址必须是2的整数倍
- Word:占4个字节,在内存中保存的起始地址必须是4的整数倍
这样存的目的是提升寻址时的效率,比如现在要从内存里取出一个Halfword类型的数据,每找一次,跳2个字节,找到的时候,直接取出2个字节带走。
但是Halfword不是按照2的整数倍存储,那么在取得时候,有可能会导致无法将数据一次取出。要全部取出的话,内存在寻址的时候,必须是一个字节一个字节的找,严重影响寻址效率。
2、ARM的指令存储
和上面数据存储一样,指令本身是多少位,在内存存储时就应该多少位对齐。
(1) 指令集的分类
ARM处理器支持两种指令集:
- ARM指令集
- 所有指令(机器码)都占用 32 bit 的存储空间 =》内存中的起始地址必须是4的整数倍
- 执行ARM指令集时,PC值每次Thu自增 4个字节
- PC值由 2~31位决定,与 0~1 位无关。
- Thumb指令集
- 所有指令(机器码)都占用 16 bit 的存储空间 =》内存中的起始地址必须是2的整数倍
- 执行Thumb指令集时,PC值每次自增 2个字节
- PC值由 1~31位决定,与 第 0 位无关
(2) 为什么ARM指令集的PC值与低2位无关?
每当CPU执行完一条指令,PC的值就会自增来获取到下一条指令,自增的步长由指令集的类型决定。ARM指令存储的起始地址是4的整数倍,比如是0x0B,转换成二进制就是0000 1100,只要是4的倍数,最低2位一定是 0,因为低两位的取值是小于4的。
因此,PC的值,也就是指令存储的起始地址,与低2位无关。