COUNT EQU 0x40003100
ADDRESS EQU 0x00009000
CONSTANT EQU 0x12345678
CONSTANT EQU 0x12345678
ADDRESSONE EQU 0x80018
ADDRESSTWO EQU 0x80014
ADDRESSTHE EQU 0x80010
AREA Example2,CODE, READONLY
ENTRY
CODE32
;START LDR R1, =COUNT
; MOV R0,#0
; STR R0,[R1]
;
;LOOP LDR R1,=COUNT
; LDRB R0,[R1]
; ADD R0,R0,#1
; CMP R0,#10
; MOVHS R0,#0
; STRB R0,[R1]
;
;
; B LOOP
ADDRESSTWO EQU 0x80014
ADDRESSTHE EQU 0x80010
AREA Example2,CODE, READONLY
ENTRY
CODE32
;START LDR R1, =COUNT
; MOV R0,#0
; STR R0,[R1]
;
;LOOP LDR R1,=COUNT
; LDRB R0,[R1]
; ADD R0,R0,#1
; CMP R0,#10
; MOVHS R0,#0
; STRB R0,[R1]
;
;
; B LOOP
;PC=0x0000800C
; SUB R1,pc,#4 ;R1中存放下面STR指令的地址 ;PC=0x00008010,R1=0x00008010
; STR pc,[R0] ;将PC=STR指令地址+offset保存到R0中 ;PC=0x00008014,R0=0x0000000
; LDR R0,[R0] ;;PC=0x00008018,R0=0x000801C
; SUB R0,R0,R1 ;offset=PC-STR地址 ;
; ;;PC=0x0000801C,R0=0x000000C
; CMP R0,#10
;
;---------------------------------------------------------------------------------------------------------
;交换指令
; mem32[0x9000]=0x12345678
; r0=0x00000000
; r1=0x11112222
; r2=0x00009000
;
; LDR R3,=ADDRESS
; LDR R4,=CONSTANT
; STR R4,[R3]
;
;
; MOV R0,#0x00000000
; LDR R1,=0x11112222
; MOV R2,#0x00009000
;
; SWP R0,R1,[R2]
;---------------------------------------------------------------------------------------------------------
;LDM|STM指令
LDR R1, =0x80018
MOV R0,#0x03
STR R0,[R1]
LDR R1, =ADDRESSTWO
MOV R0,#0x02
STR R0,[R1]
LDR R1, =ADDRESSTHE
MOV R0,#0x01
STR R0,[R1]
LDR r0,=0x00080010
LDR r1,=0x00000000
LDR r2,=0x00000000
LDR r3,=0x00000000
LDMIA r0!,{r1-r3}
LDR R12,=0xFF
STR r12,[r0],#8
; LDMFD r13!,{r1,pc}^
;------------------------------------------------------------------------------------------------------------
;MRC,MCR,协处理器的使用
;操作前,协处理器的内容:
;MCR p15,0,r4,c1,c0,0 ;Bad register name symbol
;操作后,协处理器的内容:
;MRC p15,0,r0,c0,c0,1 ;Bad register name symbol
; MRC p15,0,r0,c1,c0,0 ;Bad register name symbol
;MCR p15,0,r0,c1,0,0 ;Bad register name symbol
;--------------------------------------------
;把一个CP15寄存器拷贝到一个通用寄存器
;把协处理器CP15寄存器C0的内容拷贝到r10
MRC p15,0,r10,c0,c0,0
;把CP15的控制寄存器c1写到内核寄存器r1中
MRC p15,0,r1,c1,c0,0
;通过MRC指令可以将寄存器C1中的值读取到ARM寄存器R0中
MRC p15,0,R0,c1,c0,0
;;通过MCR指令可以将ARM寄存器R0中的值写入到寄存器C1中
MCR p15,0,r0,c1,c0,0
;禁止/使能MMU
MRC p15,0,r0,c1,c0,0
ORR r0,r0,#0x01
MCR p15,0,r0,c1,c0,0 ;使能MMU
;--------------------------------------------
;--------------------------------------------
;系统控制协处理器CP15的寄存器c8就是用来控制清除TLB内容相关的操作,
;它是一个只写寄存器。使用MRC指令读取该寄存器,将产生不可预知的结果
;使用MCR指令来写该寄存器,具体格式如下
;MCR p15,0,Rd,c8,CRm<,opcode_2>
MCR p15,0,r0,c8,c7,0 ;清除cache,即清除I-cache和D-cache
MCR p15,0,r0,c8,c7,1
MCR p15,0,r0,c8,c5,0 ;清除指令cache
MCR p15,0,r0,c8,c5,1
MCR p15,0,r0,c8,c6,0 ;清除数据cache
MCR p15,0,r0,c8,c6,1
;--------------------------------------------
;--------------------------------------------
;使用路和组索引寻址清理cache的CP15:c7寄存器命令
MCR p15,0,r0,c7,c5,2 ;清除指令cache行
MCR p15,0,r0,c7,c6,2 ;清除数据cache行
MCR p15,0,r0,c7,c10,2 ;清理数据cache行
MCR p15,0,r0,c7,c14,2 ;清理并清除数据cache行
;--------------------------------------------
;--------------------------------------------
;测试清理单一D-cache的命令
;MCR p15,0,PC,c7,c10,3 ;undefined effect(use of PC/PSR)
;MCR p15,0,pc,c7,c14,3 ;undefined effect(use of PC/PSR)
;--------------------------------------------
Rd RN 0; Rd或者定义一个虚拟地址
;通过主存中所对应的地址清理和清除一个cache行的命令
MCR p15,0,Rd,c7,c5,1 ;清除指令cache行
MCR p15,0,Rd,c7,c6,1 ;清除数据cache行
MCR p15,0,Rd,c7,c10,1 ;清理数据cache行
MCR p15,0,Rd,c7,c14,1 ;清理并清除数据cache行
;--------------------------------------------
;--------------------------------------------
;通过访问路,在cache中锁定数据的命令
MRC p15,0,Rd,c9,c0,0 ;读D-cache锁定基
MCR p15,0,Rd,c9,c0,0 ;写D-cache锁定基
MRC p15,0,Rd,c9,c0,1 ;读I-cache锁定基
MCR p15,0,Rd,c9,c0,1 ;写I-cache锁定基
;--------------------------------------------
;--------------------------------------------
;使用锁定位锁定cache的CP15:c9命令
MRC p15,0,Rd,c9,c0,1 ;读I-cache锁定页寄存器
MRC p15,0,Rd,c9,c0,0 ;读D-cache锁定页寄存器
MCR p15,0,Rd,c9,c0,1 ;写I-cache锁定页寄存器
MCR p15,0,Rd,c9,c0,0 ;写D-cache锁定页寄存器
MCR p15,0,Rd,c7,c13,1 ;装载某一地址的代码cache行
;--------------------------------------------
;快速上下文切换技术编程接口
MCR p15,0,Rd,c13,c0,0
MRC p15,0,Rd,c13,c0,0
;--------------------------------------------
;下面的代码段将寄存器R0中的数据存储方式转换成另外一种
LDR R0,=0xABCD
EOR R1,R0,R0,ROR#16
BIC R1,R1,#0xFF0000
MOV R0,R0,ROR#8
EOR R0,R0,R1,LSR #8
;编码逻辑有错误,修该如下
;--------------------------------------------
;下面的代码段用于转换大量的字数据的存储方式
LDR R0,=0x0000ABCD
MOV R2,#0xFF
ORR R2,R2,#0xFF0000
;重复下面的指令段,实现数据的存放方式的转换
AND R1,R2,R0
AND R0,R2,R0,ROR #24
ORR R0,R0,R1,ROR #8
AND R1,R2,R0
AND R0,R2,R0,ROR #24
ORR R0,R0,R1,ROR #8
;编码逻辑有错误,修该如下
;--------------------------------------------
;下面的代码测试是否连接了C++库,并根据结果执行不同的代码
AREA Example, CODE, READONLY
EXTERN __CPP_INITIALIZE[WEAK]; 如果连接了C++库则读取
;函数__CPP_INITIALIZE地址
LDR r0,__CPP_INITIALIZE
CMP r0,#0 ; Test of zero
BEQ nocplusplus ;如果没有连接C++库,则跳转到nocplusplus
; SUB R1,pc,#4 ;R1中存放下面STR指令的地址 ;PC=0x00008010,R1=0x00008010
; STR pc,[R0] ;将PC=STR指令地址+offset保存到R0中 ;PC=0x00008014,R0=0x0000000
; LDR R0,[R0] ;;PC=0x00008018,R0=0x000801C
; SUB R0,R0,R1 ;offset=PC-STR地址 ;
; ;;PC=0x0000801C,R0=0x000000C
; CMP R0,#10
;
;---------------------------------------------------------------------------------------------------------
;交换指令
; mem32[0x9000]=0x12345678
; r0=0x00000000
; r1=0x11112222
; r2=0x00009000
;
; LDR R3,=ADDRESS
; LDR R4,=CONSTANT
; STR R4,[R3]
;
;
; MOV R0,#0x00000000
; LDR R1,=0x11112222
; MOV R2,#0x00009000
;
; SWP R0,R1,[R2]
;---------------------------------------------------------------------------------------------------------
;LDM|STM指令
LDR R1, =0x80018
MOV R0,#0x03
STR R0,[R1]
LDR R1, =ADDRESSTWO
MOV R0,#0x02
STR R0,[R1]
LDR R1, =ADDRESSTHE
MOV R0,#0x01
STR R0,[R1]
LDR r0,=0x00080010
LDR r1,=0x00000000
LDR r2,=0x00000000
LDR r3,=0x00000000
LDMIA r0!,{r1-r3}
LDR R12,=0xFF
STR r12,[r0],#8
; LDMFD r13!,{r1,pc}^
;------------------------------------------------------------------------------------------------------------
;MRC,MCR,协处理器的使用
;操作前,协处理器的内容:
;MCR p15,0,r4,c1,c0,0 ;Bad register name symbol
;操作后,协处理器的内容:
;MRC p15,0,r0,c0,c0,1 ;Bad register name symbol
; MRC p15,0,r0,c1,c0,0 ;Bad register name symbol
;MCR p15,0,r0,c1,0,0 ;Bad register name symbol
;--------------------------------------------
;把一个CP15寄存器拷贝到一个通用寄存器
;把协处理器CP15寄存器C0的内容拷贝到r10
MRC p15,0,r10,c0,c0,0
;把CP15的控制寄存器c1写到内核寄存器r1中
MRC p15,0,r1,c1,c0,0
;通过MRC指令可以将寄存器C1中的值读取到ARM寄存器R0中
MRC p15,0,R0,c1,c0,0
;;通过MCR指令可以将ARM寄存器R0中的值写入到寄存器C1中
MCR p15,0,r0,c1,c0,0
;禁止/使能MMU
MRC p15,0,r0,c1,c0,0
ORR r0,r0,#0x01
MCR p15,0,r0,c1,c0,0 ;使能MMU
;--------------------------------------------
;--------------------------------------------
;系统控制协处理器CP15的寄存器c8就是用来控制清除TLB内容相关的操作,
;它是一个只写寄存器。使用MRC指令读取该寄存器,将产生不可预知的结果
;使用MCR指令来写该寄存器,具体格式如下
;MCR p15,0,Rd,c8,CRm<,opcode_2>
MCR p15,0,r0,c8,c7,0 ;清除cache,即清除I-cache和D-cache
MCR p15,0,r0,c8,c7,1
MCR p15,0,r0,c8,c5,0 ;清除指令cache
MCR p15,0,r0,c8,c5,1
MCR p15,0,r0,c8,c6,0 ;清除数据cache
MCR p15,0,r0,c8,c6,1
;--------------------------------------------
;--------------------------------------------
;使用路和组索引寻址清理cache的CP15:c7寄存器命令
MCR p15,0,r0,c7,c5,2 ;清除指令cache行
MCR p15,0,r0,c7,c6,2 ;清除数据cache行
MCR p15,0,r0,c7,c10,2 ;清理数据cache行
MCR p15,0,r0,c7,c14,2 ;清理并清除数据cache行
;--------------------------------------------
;--------------------------------------------
;测试清理单一D-cache的命令
;MCR p15,0,PC,c7,c10,3 ;undefined effect(use of PC/PSR)
;MCR p15,0,pc,c7,c14,3 ;undefined effect(use of PC/PSR)
;--------------------------------------------
Rd RN 0; Rd或者定义一个虚拟地址
;通过主存中所对应的地址清理和清除一个cache行的命令
MCR p15,0,Rd,c7,c5,1 ;清除指令cache行
MCR p15,0,Rd,c7,c6,1 ;清除数据cache行
MCR p15,0,Rd,c7,c10,1 ;清理数据cache行
MCR p15,0,Rd,c7,c14,1 ;清理并清除数据cache行
;--------------------------------------------
;--------------------------------------------
;通过访问路,在cache中锁定数据的命令
MRC p15,0,Rd,c9,c0,0 ;读D-cache锁定基
MCR p15,0,Rd,c9,c0,0 ;写D-cache锁定基
MRC p15,0,Rd,c9,c0,1 ;读I-cache锁定基
MCR p15,0,Rd,c9,c0,1 ;写I-cache锁定基
;--------------------------------------------
;--------------------------------------------
;使用锁定位锁定cache的CP15:c9命令
MRC p15,0,Rd,c9,c0,1 ;读I-cache锁定页寄存器
MRC p15,0,Rd,c9,c0,0 ;读D-cache锁定页寄存器
MCR p15,0,Rd,c9,c0,1 ;写I-cache锁定页寄存器
MCR p15,0,Rd,c9,c0,0 ;写D-cache锁定页寄存器
MCR p15,0,Rd,c7,c13,1 ;装载某一地址的代码cache行
;--------------------------------------------
;快速上下文切换技术编程接口
MCR p15,0,Rd,c13,c0,0
MRC p15,0,Rd,c13,c0,0
;--------------------------------------------
;下面的代码段将寄存器R0中的数据存储方式转换成另外一种
LDR R0,=0xABCD
EOR R1,R0,R0,ROR#16
BIC R1,R1,#0xFF0000
MOV R0,R0,ROR#8
EOR R0,R0,R1,LSR #8
;编码逻辑有错误,修该如下
;--------------------------------------------
;下面的代码段用于转换大量的字数据的存储方式
LDR R0,=0x0000ABCD
MOV R2,#0xFF
ORR R2,R2,#0xFF0000
;重复下面的指令段,实现数据的存放方式的转换
AND R1,R2,R0
AND R0,R2,R0,ROR #24
ORR R0,R0,R1,ROR #8
AND R1,R2,R0
AND R0,R2,R0,ROR #24
ORR R0,R0,R1,ROR #8
;编码逻辑有错误,修该如下
;--------------------------------------------
;下面的代码测试是否连接了C++库,并根据结果执行不同的代码
AREA Example, CODE, READONLY
EXTERN __CPP_INITIALIZE[WEAK]; 如果连接了C++库则读取
;函数__CPP_INITIALIZE地址
LDR r0,__CPP_INITIALIZE
CMP r0,#0 ; Test of zero
BEQ nocplusplus ;如果没有连接C++库,则跳转到nocplusplus
nocplusplus ADC r0,r1,r2
;上面这段代码有错误
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;上面这段代码有错误
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
;--------------------------------------------
CMP r0,r1
END
发表评论 评论 (0 个评论)