数据和指令类型
ARM 采用的是32位架构
Byte : 8 bits
Halfword : 16 bits (2 byte)
Word : 32 bits (4 byte)
Doubleword 64-bits(8byte)(Cortex-A处理器)
大部分ARM core 提供:
ARM 指令集(32-bit)
Thumb 指令集(16-bit )
Cortex-A处理器
16位和32位Thumb-2指令集
16位和32位ThumbEE指令集
处理器工作模式
ARM有7个基本工作模式:
User:非特权模式,大部分任务执行在这种模式用户模式
FIQ:当一个高优先级(fast)中断产生时将会进入这种模式 快中断
IRQ:当一个低优先级(normal)中断产生时将会进入这种模式 通用中断
Supervisor :当复位或软中断指令执行时将会进入这种模式 SVC模式 管理模式
Abort:当存取异常时将会进入这种模式中止模式
Undef:当执行未定义指令时会进入这种模式 未定义
System:使用和User模式相同寄存器集的特权模式 系统模式
Cortex-A特有模式:
Monitor:是为了安全而扩展出的用于执行安全监控代码的模式:监护模式也是一种特权模式
ARM寄存器有37个32bit的寄存器,Cortex体系结构下有40个32bit的寄存器,Cortex-A多出3个寄存器
Cortex-A 低功耗,消耗类
Cortex-R 实时性
Cortex-M 高性能,偏控制
程序状态寄存器
N:负 Z:零 C:进位/借位 V:溢出
ARM9
指令集架构(版本):armV4
存储器访问必须始终适当地保持地址对齐
ARM汇编语言程序
ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。
伪指令
ARM指令集语法格式
加S影响CPSR中标志位
常用指令
注意:
CMP R1,RO;将寄存器R1的值与寄存器RO的值相减,并根据结果设置CPSR的标志位
BIC 操作数2是32位的掩码,如果在掩码中设置了某一位,则相应的在操作数1中清除对应的那一位。
BIC RO, R0, # %1011;该指令清除R0中的位0、1和3,其余的位保持不变
例:汇编实现1到100累加
补充:
函数传参规则
4个以内:r0~r3
大于4个的使用栈传递,把栈指针初始化一下,栈在ARM中,这里是满减栈,所以应该让栈顶指针sp初始化指向0x40001000
立即数:一个数(或其按位取反后)循环右移偶数位后所有1都能放进低8位
所以不能用立即数的方式初始化sp mov sp,#0x40001000
要用LDR方式,LDR本身作用是加载一个地址到寄存器中,地址就是32根线,刚好可以加载进去,这个数也是32位,所以可以用 ldr sp, = 0x40001000
往栈里面放东西用STMFD和LDMFD
bl 会将LR的值保存起来
nop伪指令,作用是空转一个周期,意义不大
补充:
pragma pack可以设置结构体按几个字节对齐,pragma pack(1),就是按一个字节对齐
.a = 10,可以实现局部初始化