VR虚拟现实-ARM指令2 精品
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SP栈顶 SP栈顶 0x12345678
栈底
空Hale Waihona Puke 栈SP栈顶堆栈压栈
0x12345678
栈底
向上 栈区 增长
堆栈存 储区
向下 增长 栈区
栈底
0x12345678
栈顶SP 堆栈压栈
LDM:出栈 /STM:压栈
FD、ED、FA、EA
多寄存器load和store指令的堆栈和块拷贝对照
递增
递减
满空满空
增值
b
HandlerUndef;/* handlerUndef
b
HandlerSWI ;/* SWI interrupt handler*/
b
HandlerPabort ;/* handlerPAbort
*/
b
HandlerDabort ;/* handlerDAbort
*/
b
.
;/* handlerReserved */
... LDMED R0!,{R5-R6}
栈
两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操
作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和
出栈操作则需要考虑空与满、加与减对应的问题。
应用示例: S3C44B0 部分启动代码
• Vectors
b
ResetHandler;/* for debug
三、ARM指令系统
寻址方式 ARM指令集 (重点) ARM伪指令 Thumb指令集 (ARM指令集的功能子集)
寻址方式
立即寻址
MOV R0,#20;20 → R0
寄存器寻址
MOV R0,R1;(R1)→R0
寄存器移位寻址
寄存器间接寻址 LDR R0,[R3];((R3))→R0
基址加偏址寻址
指令STMIB R1!,{R5-R7}
FA
R1 R7 R6
R1’ R5
4014H 4010H 400CH 4008H 4004H 4000H
指令STMDB R1!,{R5-R7}
FD
堆栈寻址
LDM/STM FD、ED、FA、EA
压栈
SP栈顶 0x12345678 SP栈顶
满堆栈 栈底
0x12345678 压栈
堆栈存 储区
向下 增长 栈区
栈底
STMFA:满递增(入栈) STMIB:
栈顶SP 0x12345678 栈顶SP
0x12345678
Rn
堆栈压栈 STMFD:满递减(入栈) STMDB
SP栈顶 SP栈顶
堆栈压栈 0x12345678
Rn
0x12345678
栈底
向上 栈区 增长
堆栈存 储区
向下 增长 栈区
LDMFA: 满递增(出栈) LDMDA
0x12345678
Rn
堆栈出栈
LDMFD :满递减(出栈) LDMIA
SP栈顶 SP栈顶
堆栈出栈 0x12345678
Rn
0x12345678
栈底
栈区
向上 增长
堆栈存 储区
向下 增长 栈区
栈底
LDMEA :空递增(出栈) LDMDB
0x12345678
Rn
0x12345678 栈顶SP 栈顶SP
堆栈出栈
LDMED: 空递减(出栈) LDMIB
堆栈操作和数据块传送
数据块传送 存储
堆栈操作 压栈
说明
数据块传送 加载
堆栈操作 出栈
说明
STMDA STMIA STMDB STMIB
STMED STMEA STMFD STMFA
空递减 空递增 满递减 满递增
LDR R0,[R1,#4]! ( (R1)+4) )→R0 ;(R1)+4→R1 前变址偏移寻址
LDR R0,[R1],#4 ; ((R1))→R0 ,(R1) +4→R1 后变址偏移寻址
堆栈寻址
LDM/STM FD、ED、FA、EA
多寄存器寻址
LDM/STM IA、IB、DA、DB
相对寻址
B rel ;(pc)+rel → pc
LDMDA LDMIA LDMDB LDMIB
LDMFA LDMFD LDMEA LDMED
满递减 满递增 空递减 空递增
向 下
;使用数据块传送指令进行堆栈操作
生 STMDA R0!,{R5-R6} 压栈
;使用堆栈指令进行堆栈操作 STMED R0!,{R5-R6}
长 ...
空 堆
LDMIB R0!,{R5-R6} 出栈
ldr
pc, =HandlerIRQ
b
HandlerFIQ
• HandlerFIQ sub stmfd ldr ldr str
ldmfd
;HANDLER HandleFIQ
sp, sp,#4
;reserved for PC
sp!,{r8-r9}
;STMDB
r8, =HandleFIQ ; _ISR_STARTADDRESS
栈底
STMEA:空递增(入栈) STMIA
0x12345678
Rn
0x12345678 栈顶SP 栈顶SP
堆栈压栈
STMED:空递减(入栈) STMDA
堆栈出栈
Rn
0x12345678
SP栈顶 0x12345678 SP栈顶
栈底
栈区
向上 增长
堆栈存 储区
向下 增长 栈区
栈底
栈顶SP 0x12345678 栈顶SP
减值
先增 后增
STMI B STMFA
LDMI B LDMED
STMI A LDMI A STMEA LDMFD
先减
LDMDB STMDB LDMEA STMFD
后减
LDMDA LDMFA
STMDA STMED
Rn
堆栈压栈 0x12345678
SP栈顶 0x12345678 SP栈顶
栈底
向上 栈区 增长
LDMIA LDMIB
R1,{R0,R2,R5} R1,{R0,R2,R5}
;R0← [R1] ;R2← [R1+4] ;R5← [R1+8]
;R0← [R1+4] ;R2← [R1+8] ;R5← [R1+12]
LDMDA LDMDB
R1,{R0,R2,R5} R1,{R0,R2,R5}
;R5← [R1] ;R2← [R1-4] ;R0← [R1-8]
;R5← [R1-4] ;R2← [R1-8] ;R0← [R1-12]
• ARM存储器访问指令——多寄存器存取
数据块传送指令操作 过程如右图所示,其 中R1为指令执行前的 基址寄存器,R1’则为 指令执行后的基址寄 存器。
R1’
4014H
R7 4010H
R6 400CH
R1 R5 4008H
4004H
4000H
指令STMIA R1!,{R5-R7}
EA
4014H
R1 R7 4010H
R6 400CH
R5 4008H
R1’
4004H
4000H
指令STMDA R1!,{R5-R7}
ED
R1’ R7 R6 R5
R1
4014H 4010H 400CH 4008H 4004H 4000H
栈底
空Hale Waihona Puke 栈SP栈顶堆栈压栈
0x12345678
栈底
向上 栈区 增长
堆栈存 储区
向下 增长 栈区
栈底
0x12345678
栈顶SP 堆栈压栈
LDM:出栈 /STM:压栈
FD、ED、FA、EA
多寄存器load和store指令的堆栈和块拷贝对照
递增
递减
满空满空
增值
b
HandlerUndef;/* handlerUndef
b
HandlerSWI ;/* SWI interrupt handler*/
b
HandlerPabort ;/* handlerPAbort
*/
b
HandlerDabort ;/* handlerDAbort
*/
b
.
;/* handlerReserved */
... LDMED R0!,{R5-R6}
栈
两段代码的执行结果是一样的,但是使用堆栈指令的压栈和出栈操
作编程很简单(只要前后一致即可),而使用数据块指令进行压栈和
出栈操作则需要考虑空与满、加与减对应的问题。
应用示例: S3C44B0 部分启动代码
• Vectors
b
ResetHandler;/* for debug
三、ARM指令系统
寻址方式 ARM指令集 (重点) ARM伪指令 Thumb指令集 (ARM指令集的功能子集)
寻址方式
立即寻址
MOV R0,#20;20 → R0
寄存器寻址
MOV R0,R1;(R1)→R0
寄存器移位寻址
寄存器间接寻址 LDR R0,[R3];((R3))→R0
基址加偏址寻址
指令STMIB R1!,{R5-R7}
FA
R1 R7 R6
R1’ R5
4014H 4010H 400CH 4008H 4004H 4000H
指令STMDB R1!,{R5-R7}
FD
堆栈寻址
LDM/STM FD、ED、FA、EA
压栈
SP栈顶 0x12345678 SP栈顶
满堆栈 栈底
0x12345678 压栈
堆栈存 储区
向下 增长 栈区
栈底
STMFA:满递增(入栈) STMIB:
栈顶SP 0x12345678 栈顶SP
0x12345678
Rn
堆栈压栈 STMFD:满递减(入栈) STMDB
SP栈顶 SP栈顶
堆栈压栈 0x12345678
Rn
0x12345678
栈底
向上 栈区 增长
堆栈存 储区
向下 增长 栈区
LDMFA: 满递增(出栈) LDMDA
0x12345678
Rn
堆栈出栈
LDMFD :满递减(出栈) LDMIA
SP栈顶 SP栈顶
堆栈出栈 0x12345678
Rn
0x12345678
栈底
栈区
向上 增长
堆栈存 储区
向下 增长 栈区
栈底
LDMEA :空递增(出栈) LDMDB
0x12345678
Rn
0x12345678 栈顶SP 栈顶SP
堆栈出栈
LDMED: 空递减(出栈) LDMIB
堆栈操作和数据块传送
数据块传送 存储
堆栈操作 压栈
说明
数据块传送 加载
堆栈操作 出栈
说明
STMDA STMIA STMDB STMIB
STMED STMEA STMFD STMFA
空递减 空递增 满递减 满递增
LDR R0,[R1,#4]! ( (R1)+4) )→R0 ;(R1)+4→R1 前变址偏移寻址
LDR R0,[R1],#4 ; ((R1))→R0 ,(R1) +4→R1 后变址偏移寻址
堆栈寻址
LDM/STM FD、ED、FA、EA
多寄存器寻址
LDM/STM IA、IB、DA、DB
相对寻址
B rel ;(pc)+rel → pc
LDMDA LDMIA LDMDB LDMIB
LDMFA LDMFD LDMEA LDMED
满递减 满递增 空递减 空递增
向 下
;使用数据块传送指令进行堆栈操作
生 STMDA R0!,{R5-R6} 压栈
;使用堆栈指令进行堆栈操作 STMED R0!,{R5-R6}
长 ...
空 堆
LDMIB R0!,{R5-R6} 出栈
ldr
pc, =HandlerIRQ
b
HandlerFIQ
• HandlerFIQ sub stmfd ldr ldr str
ldmfd
;HANDLER HandleFIQ
sp, sp,#4
;reserved for PC
sp!,{r8-r9}
;STMDB
r8, =HandleFIQ ; _ISR_STARTADDRESS
栈底
STMEA:空递增(入栈) STMIA
0x12345678
Rn
0x12345678 栈顶SP 栈顶SP
堆栈压栈
STMED:空递减(入栈) STMDA
堆栈出栈
Rn
0x12345678
SP栈顶 0x12345678 SP栈顶
栈底
栈区
向上 增长
堆栈存 储区
向下 增长 栈区
栈底
栈顶SP 0x12345678 栈顶SP
减值
先增 后增
STMI B STMFA
LDMI B LDMED
STMI A LDMI A STMEA LDMFD
先减
LDMDB STMDB LDMEA STMFD
后减
LDMDA LDMFA
STMDA STMED
Rn
堆栈压栈 0x12345678
SP栈顶 0x12345678 SP栈顶
栈底
向上 栈区 增长
LDMIA LDMIB
R1,{R0,R2,R5} R1,{R0,R2,R5}
;R0← [R1] ;R2← [R1+4] ;R5← [R1+8]
;R0← [R1+4] ;R2← [R1+8] ;R5← [R1+12]
LDMDA LDMDB
R1,{R0,R2,R5} R1,{R0,R2,R5}
;R5← [R1] ;R2← [R1-4] ;R0← [R1-8]
;R5← [R1-4] ;R2← [R1-8] ;R0← [R1-12]
• ARM存储器访问指令——多寄存器存取
数据块传送指令操作 过程如右图所示,其 中R1为指令执行前的 基址寄存器,R1’则为 指令执行后的基址寄 存器。
R1’
4014H
R7 4010H
R6 400CH
R1 R5 4008H
4004H
4000H
指令STMIA R1!,{R5-R7}
EA
4014H
R1 R7 4010H
R6 400CH
R5 4008H
R1’
4004H
4000H
指令STMDA R1!,{R5-R7}
ED
R1’ R7 R6 R5
R1
4014H 4010H 400CH 4008H 4004H 4000H