一、立即数
条件:
1、把数据转换成二进制形式,从低位到高位写成4位1组的形式,最高位一组不够四位的,
在最高位前面补0。
2、数1的个数,如果大于8个肯定不是立即数,如果小于等于8进行下面步骤。
3、如果数据中间有连续的大于等于24个0,循环左移4的倍数,使高位全为0。
4、找到最高位的1,去掉前面最大偶数个0。
5、找到最低位的1,去掉后面最大偶数个0。
6、数剩下的位数,如果小于等于8位,那么这个数就是立即数,反之就不是立即数。
(1)有效位数小于等于8 0xf000f000
(2)有效位数中间通过左移右移都会有0,而且剩下的位数大于8则不是立即数。
二、ARM的工作模式
1、user 非特权模式
2、system 特权模式
3、FIQ 快速中断模式
4、IRQ 普通中断模式
5、SVC 超级用户管理权限模式 复位及SWI会进入此模式
6、ABT 存取异常(指令和数据)
7、UND 未定义指令模式
Cotex A特有: Minor 监控模式
2个64bit数相加
.text
.globl _start
_start:
@r0 表示加数1的低32bit
@r1 表示加数1的高32bit
ldr r0,=0x12345678
ldr r1,=0x1
@r2 表示加数2的低32bit
@r3 表示加数2的高32bit
ldr r2,=0xf1234567
ldr r3,=0x2
@r4 表示2个64bit数相加的低32bit
@r5 表示2个64bit数相加的高32bit
adds r4,r0,r2 ;add加法指令 s是影响CPSR中的C位
adc r5,r1,r3 ; r5 = r1+r3+C
.end
三种索引方式:
前索引 LDR R0 , [R1 , #4] r0=[r1+4]
自动索引 LDR R0 , [R1 , #4]! r0=[r1+4]; r1=r1+4
后索引 LDR R0 , [R1], #4 r0=[r1];r1=r1+4
数组元素求和,元素为0结束
.text
.globl _start
_start:
ldr r0,=myarray
loop:
ldr r1,[r0],#4
add r2,r1
cmp r1,#0
beq end_add
b loop
end_add:
b end_add
myarray:
.word 0x11
.word 0x22
.word 0x33
.word 0x0
.end
ldmia r0!,{r1,r2,r4} @ r1=[r0]; r0=r0+4; r2=[r0];r0=r0+4; r4=[r0];r0=r0+4
ldmib r0!,{r1,r2,r4} @ ;r0=r0+4;r1=[r0];r0=r0+4; r2=[r0];r0=r0+4;r4=[r0]
ldmda r0!,{r1,r2,r4} @r4=[r0]; r0=r0-4;r2=[r0];r0=r0-4;r1=[r0];r0=r0-4
ldmdb r0!,{r1,r2,r4} @r0=r0-4;r4=[r0];r0=r0-4;r2=[r0];r0=r0-4;r1=[r0]
栈的类型:
EA 空增
ED 空减
FA 满增
FD 满减 ---》 推荐使用
异常处理:
ARM core:
1、将CPSR拷贝到对应模式SPSR
2、设置CPSR
工作模式为相应异常模式
设置工作状态为ARM态
如果需要 修改中断禁止位
3、保存返回地址到对应模式LR
4、设置PC为相应的异常向量
异常向量表:
0x1c fiq
0x18 irq
0x14 保留
0x10 data abort
0xc prefetch abort
0x8 swi
0x4 undef
0x0 reset
异常返回,我们需要做:
1、从 SPSR_<mode>恢复CPSR
2、从LR_<mode>恢复PC
入栈&出栈
.globl _start
_start:
ldr sp,=myarray_end
mov r1,#1
mov r2,#2
mov r4,#4
bl stmsp
mov r5,#0x8
end_add:
b end_add
stmsp:
stmfd sp!,{r1,r2,r4,lr}
mov r1,#0xff
mov r2,#0xff
mov r4,#0xff
ldmfd sp!,{r1,r2,r4,pc}
.data
myarray:
.word 0x11
.word 0x22
.word 0x33
.word 0x0
myarray_end:
.end
GPIO口操作:
1、修改复用功能
2、设置方向 (输入或输出)
3、电平高低设置
gpx2_7:
GPX2CON 0x11000c40
@复用关系 设置方向为OUTPUT
ldr r0,=[0x11000c40]
bic r0,#0xf0000000
orr r0,#0x10000000
str r0,=[0x11000c40]
GPX2DAT 0x11000c44
@高电平
ldr r1,=[0x11000c44]
orr r1,#0x80
str r1,=[0x11000c44]
@低电平
ldr r1,=[0x11000c44]
bic r1,#0x80
str r1,=[0x11000c44]
测试步骤:
1、loadb 0x40008000