ARM汇编3

来源:互联网 发布:大数据技术经典书籍 编辑:程序博客网 时间:2024/05/16 01:44


一、立即数
条件:
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], #4r0=[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 






入栈&出栈




.text
.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