【转载】ARM基础:基本的C数据类型
源地址:http://www.lirenedu.org/index.php?ack=xinwen&id=1112
首先研究一下ARM编译器如何处理基本的C数据类型,将会发现其中一些数据类型用作局部变量时,执行效率要比其他类型的高,同时,在一定的寻址模式下,装载/存储不同类型的数据,效率是不一样的。
ARM处理器内部是32位寄存器和32位的数据处理操作。其体系结构是RISCload/store结构,换句话说,数据在使用前必须先将其从内存装载到内部寄存器,任何算术或者逻辑指令都不能直接在存储器里进行数据操作。
早期版本的ARM结构为装载和存储无符号8位和无符号/有符号32位数据提供了硬件支持。这些体系结构都是用于比ARM7TDMI更早的处理器,指出了ARM体系结构支持load/store指令。
体系结构 指令 执行的功能
Pre-ARMv4 LDRB 装载一个无符号的8位数据
STRB 存储一个有/无符号的8位数据
LDR 装载一个有/无符号的32位数据
STR 存储一个有/无符号的32位数据
ARMv4 LDRBSB 装载一个有符号的8位数据
LDRH 装载一个无符号的16位数据
LDRSH 装载一个有符号的16位数据
STRH 存储一个有/无符号的16位数据
ARMV5 LDRD 装载一个有/无符号的64位数据
STRD 存储一个有/无符号的64位数据
在以上表中8位或者16位数据在装载/存储ARM寄存器之前,先要扩展成32位,无符号数把0作为扩展位,有符号数则按照符号位扩展,这就意味着装载int类型的数据无须花费多余的指令时间来进行位扩展。同样在存储时,8位或者16位的数据必须做到寄存器的低8位或低16位,而一个int或更小类型的传送,存储时就不需要花费额外的指令时间了。
ARMv4及其以后的体系结构可以使用新增的指令来直接装载和存储一个带符号8位和16位数据。由于这些指令都是后来增加的。它们并不支持早于ARMv4指令集的许多寻址方式。
ARMv5增加了支持64位数据load和store指令,ARM9e及其以后的核都支持这些指令。
比ARMv4早的ARM处理器并不能很好地处理有符号的8位或者任何16位数据。因此,在ARM C编译器中定义的char类型是8位无符号的。而不像其他编译器默认是8位有符号的。
浙公网安备 33010602011771号