您的位置:首页 > 其它

几个ARM指令操作的汇编实现

2013-06-09 15:03 387 查看
下面几段小程序是在学习ARM指令应用是记下的。感觉比较经典,做一下整理。

1.长跳转(为了实现arm 4GB范围的跳转,三级流水)

START ;主程序体

。。。

ADD LR,PC,#4

CALL_SUB LDR PC,[PC,#-4]

DCD FUNCTION

RETURN 。。。

FUNCTION 。。。

MOV PC,LR

2.多路跳转(在多个处理程序中进行选择)

START :主程序体

。。。

LDR R0, [R1] ;从【R1】I/O地址读索引号

CMP R0,MAXINDEX

LDRL PC,[PC,R0,LSL#2]

B INDEXOUTOFLANG

DCD HANDLER0

DCD HANDLER1

DCD HANDLER2

。。。

3.子程序的进入和退出

X_FUNCTIONG

STMFD R13!,{R4-R12,R14}

。。。

LDMFD R13!,{R4,R12,PC}^

4.软中断

SWIHANDLER

STMFD SP!,{R0,R3,R12,LR}

MRS R0,SPSR_SVC

TST R0,#0X20 :测试cpsr【T】位

LDRNEH R0,[LR,#-2]

BICNE R0,#0XFF00

LDREQ R0,[LR,#-4]

BICNE R0,#0XFF000000

CMP R0,#MAX_SWI

LDRLS PC,[PC,R0,LSL #2]

B SWI_OUT_RANGE

DCD DO_SWI_0



5.IRQ响应

IRQHANDLER

SUB R14,R14,#4

STMFD R13!,{R12,R14}

MRS R12,SPSR_IRQ

STMFD R13!,{R12}

MOV R12,#INTBASE

LDR R12,[R12,#INTLEVER]

MRS R14,CPSR

BIC R14,R14,#0X80 ;设置CPSR[I]为0 即允许irq嵌套

MSR CPSR_C,R14

LDR PC,[PC,R12,LSL #2]

NOP ;站位符 因为三级流水

DCD PRIORITY_0_HANDLER

6.数据/指令预取中止

ABTHANDLER

SUB LR,LR,#4 ;数据访问中止此处立即数为#8

STMFD SP!,{RIGLIST,LR}

。。。

LDMFD SP!,{RIGLIST,PC}^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: