《嵌入式基础》实验三 ARM编程模型和ARM指令

news2024/11/20 20:44:09

零、前言

本人不擅长写汇编相关的东西,所以以下内容也是不断摸索(百度 ) 整出来的,和linux的实验报告的质量相比较低。

一、 实验目的

  1. 掌握ARM微处理器的汇编指令的使用方法。
  2. 掌握使用 LDM/STM,B,BL 等指令完成较为复杂的存储区访问和分支程序设计的方法。
  3. 学习使用条件码,并加强对 CPSR 的认识。
  4. 学会使用 MSR/MRS 指令实现 ARM 处理器工作模式的切换;
  5. 观察不同模式下的寄存器,加深对 CPU 结构的理解。

二、 实验设备

  1. 硬件:PC 机。
  2. 软件:µVision IDE for ARM 集成开发环境。

三、 实验任务与要求
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一定要确认自己使用的 keil 版本,必须是 keil3 for arm

** keil 编辑时可能会出现1**

  1. 使用 LDR/STR, MOV等指令访问寄存器或存储单元;使用 ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本算术/逻辑运算。
;3.1_asm1\Asm1_a 中的 asm1_a.s 文件
x			EQU	45
y			EQU	64
stack_top	EQU	0x30200000
export Reset_Handler
	AREA text,CODE,READONLY
		export 
Reset_Handler
		ldr		sp, =stack_top
		mov	r0, #x
		str		r0, [sp]		   
		mov	r0, #y
		ldr		r1, [sp]
		add		r0, r0, r1
		str		r0, [sp]
stop
 		b		stop
		end

(1) 请按照嵌入式程序调试步骤进行单步执行,并将每一步执行的寄存器值及内存中的结果截图。

asm_1a

在这里插入图片描述
常量定义,类似于C语言中的 #define
x EQU 45 意味着之后程序中 出现的 x 将会在预处理阶段被替换为 45
y EQU 64 意味着之后程序中 出现的 y 将会在预处理阶段被替换为 64
stack_top EQU 0x30200000 意味着之后程序中 出现的 stack_top 将会在预处理阶段被替换为 0x30200000

在这里插入图片描述

export Reset_Handler 表示 Reset_Handler 这个子程序可供其他模块调用。

在这里插入图片描述
定义一个代码段textCODE 代表它要定义的是一个代码段,READONLY 指定本段为只读,(代码段默认为READONLY)

此处参考来源:https://www.cnblogs.com/qiyuexin/p/12608776.html

此处代码可以debug

step 0:

在这里插入图片描述
此时程序走在第一步(还未执行),上图所示都是初始状态下的情况。

step 1:ldr sp, =stack_top

在这里插入图片描述

step 2:mov r0, #x 把x的值给 R0
在这里插入图片描述

step 3:str r0, [sp] 将 R0 的值保存到栈中

在这里插入图片描述
step 4:mov r0, #y把y的值给 R0
在这里插入图片描述

step 5:ldr r1, [sp] 从堆栈中读取数据,并将其放入 R1

在这里插入图片描述
step 6:add r0, r0, r1 把 R0 和 R1 的值加起来
在这里插入图片描述

step 7:str r0, [sp]

在这里插入图片描述
step 8:b stop 代码结束
在这里插入图片描述
asm_1b
在这里插入图片描述

常量定义,类似于C语言中的 #define
x EQU 45 意味着之后程序中 出现的 x 将会在预处理阶段被替换为 45
y EQU 64 意味着之后程序中 出现的 y 将会在预处理阶段被替换为 64
z EQU 87 意味着之后程序中 出现的 z 将会在预处理阶段被替换为 87
stack_top EQU 0x30200000 意味着之后程序中 出现的 stack_top 将会在预处理阶段被替换为 0x30200000

在这里插入图片描述

export Reset_Handler 表示 Reset_Handler 这个子程序可供其他模块调用。

在这里插入图片描述
定义一个代码段textCODE 代表它要定义的是一个代码段,READONLY 指定本段为只读,(代码段默认为READONLY)

此处参考来源:https://www.cnblogs.com/qiyuexin/p/12608776.html

此处代码可以debug
step 0:
在这里插入图片描述
step 1:mov r0, #x 把x的值放到 r0
在这里插入图片描述
step 2: mov r0, r0, lsl #8 x = x << 8 左移八位
在这里插入图片描述
step 3: mov r1, #y 把y的值放入 r1 中

在这里插入图片描述

step 4: add r2, r0, r1, lsr #1 R2 = (R1>>1) + R0

在这里插入图片描述
step 5: ldr sp, =stack_top
在这里插入图片描述
step 6: str r2, [sp]
在这里插入图片描述
step 7: mov r0, #z 把z的值放到 r0
在这里插入图片描述
step 8: and r0, r0, #0xFF 从 r0 中获得低八位

在这里插入图片描述
step 9: mov r1, #y y的值放入r1 中
在这里插入图片描述
step 10: add r2, r0, r1, lsr #1 R2 =(R1>>1)+ R0
在这里插入图片描述
step 11: ldr r0, [sp]
在这里插入图片描述

step 12: mov r1, #0x01
在这里插入图片描述

step 13:orr r0, r0, r1
在这里插入图片描述

step 14:mov r1, R2 把y的值放入r1 中
在这里插入图片描述

step 15: add r2, r0, r1, lsr #1 R2 =(R1>>1) + R0
在这里插入图片描述
step 16: b stop 结束代码
在这里插入图片描述

(2) 在上面的代码基础上进行实验的拓展,加入ADD、SUB、AND、ORR等指令,并加上寄存器移位寻址方式。

(这里我仅在 asm_1a.s文件里进行了拓展)
在这里插入图片描述

; ADD
ldr     r0, =0x20
ldr     r1, =0x30
add     r2, r0, r1

; SUB
ldr     r0, =0x3f
ldr     r1, =0x1d
sub     r2, r0, r1

; AND
MOV R0,#0x02
AND R0,#0x01

; ORR 
MOV R0,#0x01
ORR  R0,R0,#0x0F

;寄存器移位寻址
;LSL 逻辑左移
MOV R1, #0x02
MOV R2, #0x03
ADD  R0,R1,R2,LSL #2

更改完毕之后,点击此处重新Build
在这里插入图片描述
然后在下方的控制台查看是否build成功
在这里插入图片描述

这时候就可以 Debug -> Start Debug 然后挨个执行指令了。

(3) 在上面的代码基础上进行LDR/STR指令对内存随机访问的指令,需要在程序中利用数据定义伪操作定义字数据并分配内存。

在这里插入图片描述

缩进很重要!缩进不对无法编译

		;new
		ldr R0, =data1
		ldr R1, =data2

		ldr R3, [R0]
		str r4, [R1]
		
LTORG
data1
		DCD 0x123
data2
		DCD 0

(4) LDR/STR指令访问内存时分别采用寄存器间接寻址方式、基址变址寻址方式中的前索引偏移和后索引偏移进行设计,并将结果截图。

前索引偏移:

	AREA text,CODE,READONLY

Reset_Handler

	ldr r4,=0x3c
	ldr r0,[r4,#8]
	mov r6,#2
	ldr r0,[r4, r6]
	ldr r0, [r4,r6,LSL #2]

stop
		b		stop								    
		END

在这里插入图片描述
后索引偏移:

	AREA text,CODE,READONLY

Reset_Handler

	ldr r2, =0x68
	str r1, [r2], #4
	str r3, [r2], #8


stop
		b		stop								    
		END

在这里插入图片描述

(5) 编写程序循环对 R4~R11 进行累加 8 次赋值,R4~R11 起始值为 1~8,每次加操作后把 R4~R11 的内容放入 SP 栈中。
在这里插入图片描述

stack_top	EQU	0x00800000
			                 export	Reset_Handler
	AREA text,CODE,READONLY

Reset_Handler
		mov sp,#stack_top
		mov r4,#1
		mov r5,#2
		mov r6,#3
		mov r7,#4
		mov r8,#5
		mov r9,#5
		mov r10,#7
		mov r11,#8
		stmfd sp!,{r4-r11}
		mov r3,#0

stop
		b		stop								    
		END

  1. 熟悉开发环境的使用并完成一块存储区的拷贝。分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。
    (1) EduKit2410_for_MDK\3.2_asm2中的asm_code1.s代码和asm_code2.s代码进行解释;

以下是 ChatGPT给出的解释(一种AI程序):
asm_code1.s:
在这里插入图片描述
asm_code2.s:
在这里插入图片描述

asm_code1.s:

		GLOBAL	Reset_Handler
		area start,code,readwrite
		entry
		code32
num		EQU		20   ;/*  设置要复制的字数 */

Reset_Handler
		ldr		r0, =src	;/*  R0 指向源数据块首地址 */
		ldr		r1, =dst	;/*  R1 指向目标数据块首地址 */
		mov		r2, #num	;/*  R2 复制的字数 */

		ldr		sp, =0x30200000	;/*  设置堆栈指针,用于保存工作寄存器数值 */
blockcopy       
		movs	r3,r2, LSR #3	;/*  需要以8 个字为单位的数据复制 */
		beq		copywords		;/*  如果移动的字的个数小于 8 则跳转到 copywords _子函数 */

		stmfd	sp!, {r4-r11}		;/* 保存工作寄存器 */
octcopy
		ldmia	r0!, {r4-r11}		;/* 从数据源取出 8 个字数据放到寄存器,更新 RO */
		stmia	r1!, {r4-r11}		;/*把数据写入目的地址,更新 R1 */
		subs	r3, r3, #1			;/* 将块复制制次数减 1 */
		bne		octcopy			;/* 循环直到完成八个字为单位的人复制 */

		ldmfd	sp!, {r4-r11}		;/* 恢复工作寄存器 */

copywords
		ands	r2, r2, #7		;/*剩余不足 8 个字数据的字数 */
		beq		stop				;/*  数据复制完成则跳转到 stop */
wordcopy
		ldr		r3, [r0], #4		;/*  从数据源取出一个字数据到 R3,且更新 R3 */
		str		r3, [r1], #4    	;/* 将字数据存储到目标地址,更新 R1 */
		subs	r2, r2, #1		    ;/*  字复制次数减 1 */
		bne		wordcopy		    ;/* 循环到复制结束 */

stop
		b		stop

;/*------------------------------------------------------------------------------------------*/
;/*	 								make a word pool					 				    */
;/*------------------------------------------------------------------------------------------*/
		ltorg
src
		dcd		1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst
		dcd		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		end

asm_code2.s

		area start,code,readwrite
		entry
		code32
num equ	2					
		export Reset_Handler
Reset_Handler
		;/* 设置三个参数 */
		mov		r0, #0		;/*  把 0 传送到 R0 寄存器中 */
		mov		r1, #3       ;/*  把 3 传送到 R1 寄存器中 */
		mov		r2, #2      ;/*  把 2 传送到 R2 寄存器中 */
		bl		arithfunc		;/*  调用函数 */

stop
		b		stop


;# ********************************************************************************************
;# * According R0 valude to execute the code													 *
;# ********************************************************************************************
arithfunc						;/*  标识函数 */
		cmp		r0, #num		;/*  将函数代码视为无符号整数,R0 与立即数 NUM 进行比较 */
		bhs		DoAdd			;/*  如果大于等于 2,则执行操作 0 */

		adr		r3, JumpTable		;/* 根据参数 R0 的值跳转到对应的子程序 */
		ldr		pc, [r3,r0,LSL#2]		;/* 跳转到适当的路线 */

JumpTable
		dcd		DoAdd  ;/*占领四个字节,其中存储的是 DoAdd 对应的地址 */
		dcd		DoSub  ;/* 占领四个字节,其中存储的是 DoSub.对应的地址 */

DoAdd
		add		r0, r1, r2		;/*  R1+R2->R0 */
		bx		lr 				;/*  跳转到 lr 中存放的地址处*/


DoSub
		sub		r0, r1, r2			;/*  R0-R1->R3 */
		bx		lr					;/*  跳转到 lr 中存放的地址处 */

		end							;/*  结束程序 */

(2) 将运行结果的寄存器值及内存中的查看结果截图;
asm_code1.s:

在这里插入图片描述

asm_code2.s:

在这里插入图片描述

(3) 将asm_code1.s代码中的进栈、出栈指令STMIA/LDMIA分别改成STMIB/LDMIB、STMDA/LDMDA、STMDB/LDMDB,并将运行结果截图。

提示:这里的改成就是一种简单的文字替换,用CTRL+H逐个替换即可

  1. STMIA/LDMIA 改成 STMIB/LDMIB
;#*********************************************************************************************
;# NAME:	ARMcode.s																		 *
;# Author: 	EWUHAN  R & D Center, st																			 *
;# Desc:	ARMcode examples																 *
;#          copy words from src to dst														 *
;# History:	shw.He 2005.02.22																 *
;#*********************************************************************************************

;/*------------------------------------------------------------------------------------------*/
;/*	 								code								 				    */
;/*------------------------------------------------------------------------------------------*/
		
		GLOBAL	Reset_Handler
		area start,code,readwrite
		entry
		code32
num		EQU		20									         ;/*  Set number of words to be copied */

Reset_Handler
		ldr		r0, =src						;/*  r0 = pointer to source block */
		ldr		r1, =dst						;/*  r1 = pointer to destination block */
		mov		r2, #num						;/*  r2 = number of words to copy */

		ldr		sp, =0x30200000						;/*  set up stack pointer (r13) */
blockcopy       
		movs	r3,r2, LSR #3					;/*  number of eight word multiples */
		beq		copywords						;/*  less than eight words to move ? */

		stmfd	sp!, {r4-r11}					;/*  save some working registers */
octcopy
		LDMIB	r0!, {r4-r11}					;/*  load 8 words from the source */
		STMIB	r1!, {r4-r11}					;/*  and put them at the destination */
		subs	r3, r3, #1						;/*  decrement the counter */
		bne		octcopy							;/*  ... copy more */

		ldmfd	sp!, {r4-r11}					;/*  don't need these now - restore originals */

copywords
		ands	r2, r2, #7						;/*  number of odd words to copy */
		beq		stop							;/*  No words left to copy ? */
wordcopy
		ldr		r3, [r0], #4					;/*  a word from the source */
		str		r3, [r1], #4					;/*  store a word to the destination */
		subs	r2, r2, #1						;/*  decrement the counter */
		bne		wordcopy						;/*  ... copy more */

stop
		b		stop

;/*------------------------------------------------------------------------------------------*/
;/*	 								make a word pool					 				    */
;/*------------------------------------------------------------------------------------------*/
		ltorg
src
		dcd		1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst
		dcd		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		end

在这里插入图片描述

  1. STMIA/LDMIA 改成 STMDA/LDMDA
;#*********************************************************************************************
;# NAME:	ARMcode.s																		 *
;# Author: 	EWUHAN  R & D Center, st																			 *
;# Desc:	ARMcode examples																 *
;#          copy words from src to dst														 *
;# History:	shw.He 2005.02.22																 *
;#*********************************************************************************************

;/*------------------------------------------------------------------------------------------*/
;/*	 								code								 				    */
;/*------------------------------------------------------------------------------------------*/
		
		GLOBAL	Reset_Handler
		area start,code,readwrite
		entry
		code32
num		EQU		20									         ;/*  Set number of words to be copied */

Reset_Handler
		ldr		r0, =src						;/*  r0 = pointer to source block */
		ldr		r1, =dst						;/*  r1 = pointer to destination block */
		mov		r2, #num						;/*  r2 = number of words to copy */

		ldr		sp, =0x30200000						;/*  set up stack pointer (r13) */
blockcopy       
		movs	r3,r2, LSR #3					;/*  number of eight word multiples */
		beq		copywords						;/*  less than eight words to move ? */

		stmfd	sp!, {r4-r11}					;/*  save some working registers */
octcopy
		LDMDA	r0!, {r4-r11}					;/*  load 8 words from the source */
		STMDA	r1!, {r4-r11}					;/*  and put them at the destination */
		subs	r3, r3, #1						;/*  decrement the counter */
		bne		octcopy							;/*  ... copy more */

		ldmfd	sp!, {r4-r11}					;/*  don't need these now - restore originals */

copywords
		ands	r2, r2, #7						;/*  number of odd words to copy */
		beq		stop							;/*  No words left to copy ? */
wordcopy
		ldr		r3, [r0], #4					;/*  a word from the source */
		str		r3, [r1], #4					;/*  store a word to the destination */
		subs	r2, r2, #1						;/*  decrement the counter */
		bne		wordcopy						;/*  ... copy more */

stop
		b		stop

;/*------------------------------------------------------------------------------------------*/
;/*	 								make a word pool					 				    */
;/*------------------------------------------------------------------------------------------*/
		ltorg
src
		dcd		1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst
		dcd		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		end



在这里插入图片描述

  1. STMIA/LDMIA 改成 STMDB/LDMDB
;#*********************************************************************************************
;# NAME:	ARMcode.s																		 *
;# Author: 	EWUHAN  R & D Center, st																			 *
;# Desc:	ARMcode examples																 *
;#          copy words from src to dst														 *
;# History:	shw.He 2005.02.22																 *
;#*********************************************************************************************

;/*------------------------------------------------------------------------------------------*/
;/*	 								code								 				    */
;/*------------------------------------------------------------------------------------------*/
		
		GLOBAL	Reset_Handler
		area start,code,readwrite
		entry
		code32
num		EQU		20									         ;/*  Set number of words to be copied */

Reset_Handler
		ldr		r0, =src						;/*  r0 = pointer to source block */
		ldr		r1, =dst						;/*  r1 = pointer to destination block */
		mov		r2, #num						;/*  r2 = number of words to copy */

		ldr		sp, =0x30200000						;/*  set up stack pointer (r13) */
blockcopy       
		movs	r3,r2, LSR #3					;/*  number of eight word multiples */
		beq		copywords						;/*  less than eight words to move ? */

		stmfd	sp!, {r4-r11}					;/*  save some working registers */
octcopy
		ldmdb	r0!, {r4-r11}					;/*  load 8 words from the source */
		stmdb	r1!, {r4-r11}					;/*  and put them at the destination */
		subs	r3, r3, #1						;/*  decrement the counter */
		bne		octcopy							;/*  ... copy more */

		ldmfd	sp!, {r4-r11}					;/*  don't need these now - restore originals */

copywords
		ands	r2, r2, #7						;/*  number of odd words to copy */
		beq		stop							;/*  No words left to copy ? */
wordcopy
		ldr		r3, [r0], #4					;/*  a word from the source */
		str		r3, [r1], #4					;/*  store a word to the destination */
		subs	r2, r2, #1						;/*  decrement the counter */
		bne		wordcopy						;/*  ... copy more */

stop
		b		stop

;/*------------------------------------------------------------------------------------------*/
;/*	 								make a word pool					 				    */
;/*------------------------------------------------------------------------------------------*/
		ltorg
src
		dcd		1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst
		dcd		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		end



在这里插入图片描述

(4) 将asm_code1.s代码中的进栈、出栈指令STMFD/LDMFD分别改成STMFA/LDMFA、STMEA/LDMEA、STMED/LDMED,并将运行结果截图。

  1. STMFD/LDMFD 改成 STMFA/LDMFA
;#*********************************************************************************************
;# NAME:	ARMcode.s																		 *
;# Author: 	EWUHAN  R & D Center, st																			 *
;# Desc:	ARMcode examples																 *
;#          copy words from src to dst														 *
;# History:	shw.He 2005.02.22																 *
;#*********************************************************************************************

;/*------------------------------------------------------------------------------------------*/
;/*	 								code								 				    */
;/*------------------------------------------------------------------------------------------*/
		
		GLOBAL	Reset_Handler
		area start,code,readwrite
		entry
		code32
num		EQU		20									         ;/*  Set number of words to be copied */

Reset_Handler
		ldr		r0, =src						;/*  r0 = pointer to source block */
		ldr		r1, =dst						;/*  r1 = pointer to destination block */
		mov		r2, #num						;/*  r2 = number of words to copy */

		ldr		sp, =0x30200000						;/*  set up stack pointer (r13) */
blockcopy       
		movs	r3,r2, LSR #3					;/*  number of eight word multiples */
		beq		copywords						;/*  less than eight words to move ? */

		stmfa	sp!, {r4-r11}					;/*  save some working registers */
octcopy
		ldmia	r0!, {r4-r11}					;/*  load 8 words from the source */
		stmia	r1!, {r4-r11}					;/*  and put them at the destination */
		subs	r3, r3, #1						;/*  decrement the counter */
		bne		octcopy							;/*  ... copy more */

		ldmfa	sp!, {r4-r11}					;/*  don't need these now - restore originals */

copywords
		ands	r2, r2, #7						;/*  number of odd words to copy */
		beq		stop							;/*  No words left to copy ? */
wordcopy
		ldr		r3, [r0], #4					;/*  a word from the source */
		str		r3, [r1], #4					;/*  store a word to the destination */
		subs	r2, r2, #1						;/*  decrement the counter */
		bne		wordcopy						;/*  ... copy more */

stop
		b		stop

;/*------------------------------------------------------------------------------------------*/
;/*	 								make a word pool					 				    */
;/*------------------------------------------------------------------------------------------*/
		ltorg
src
		dcd		1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst
		dcd		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		end



在这里插入图片描述

  1. STMFD/LDMFD 改成 STMEA/LDMEA
;#*********************************************************************************************
;# NAME:	ARMcode.s																		 *
;# Author: 	EWUHAN  R & D Center, st																			 *
;# Desc:	ARMcode examples																 *
;#          copy words from src to dst														 *
;# History:	shw.He 2005.02.22																 *
;#*********************************************************************************************

;/*------------------------------------------------------------------------------------------*/
;/*	 								code								 				    */
;/*------------------------------------------------------------------------------------------*/
		
		GLOBAL	Reset_Handler
		area start,code,readwrite
		entry
		code32
num		EQU		20									         ;/*  Set number of words to be copied */

Reset_Handler
		ldr		r0, =src						;/*  r0 = pointer to source block */
		ldr		r1, =dst						;/*  r1 = pointer to destination block */
		mov		r2, #num						;/*  r2 = number of words to copy */

		ldr		sp, =0x30200000						;/*  set up stack pointer (r13) */
blockcopy       
		movs	r3,r2, LSR #3					;/*  number of eight word multiples */
		beq		copywords						;/*  less than eight words to move ? */

		stmea	sp!, {r4-r11}					;/*  save some working registers */
octcopy
		ldmia	r0!, {r4-r11}					;/*  load 8 words from the source */
		stmia	r1!, {r4-r11}					;/*  and put them at the destination */
		subs	r3, r3, #1						;/*  decrement the counter */
		bne		octcopy							;/*  ... copy more */

		ldmea	sp!, {r4-r11}					;/*  don't need these now - restore originals */

copywords
		ands	r2, r2, #7						;/*  number of odd words to copy */
		beq		stop							;/*  No words left to copy ? */
wordcopy
		ldr		r3, [r0], #4					;/*  a word from the source */
		str		r3, [r1], #4					;/*  store a word to the destination */
		subs	r2, r2, #1						;/*  decrement the counter */
		bne		wordcopy						;/*  ... copy more */

stop
		b		stop

;/*------------------------------------------------------------------------------------------*/
;/*	 								make a word pool					 				    */
;/*------------------------------------------------------------------------------------------*/
		ltorg
src
		dcd		1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst
		dcd		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		end



在这里插入图片描述

  1. STMFD/LDMFD 改成 STMED/LDMED
;#*********************************************************************************************
;# NAME:	ARMcode.s																		 *
;# Author: 	EWUHAN  R & D Center, st																			 *
;# Desc:	ARMcode examples																 *
;#          copy words from src to dst														 *
;# History:	shw.He 2005.02.22																 *
;#*********************************************************************************************

;/*------------------------------------------------------------------------------------------*/
;/*	 								code								 				    */
;/*------------------------------------------------------------------------------------------*/
		
		GLOBAL	Reset_Handler
		area start,code,readwrite
		entry
		code32
num		EQU		20									         ;/*  Set number of words to be copied */

Reset_Handler
		ldr		r0, =src						;/*  r0 = pointer to source block */
		ldr		r1, =dst						;/*  r1 = pointer to destination block */
		mov		r2, #num						;/*  r2 = number of words to copy */

		ldr		sp, =0x30200000						;/*  set up stack pointer (r13) */
blockcopy       
		movs	r3,r2, LSR #3					;/*  number of eight word multiples */
		beq		copywords						;/*  less than eight words to move ? */

		stmed	sp!, {r4-r11}					;/*  save some working registers */
octcopy
		ldmia	r0!, {r4-r11}					;/*  load 8 words from the source */
		stmia	r1!, {r4-r11}					;/*  and put them at the destination */
		subs	r3, r3, #1						;/*  decrement the counter */
		bne		octcopy							;/*  ... copy more */

		ldmed	sp!, {r4-r11}					;/*  don't need these now - restore originals */

copywords
		ands	r2, r2, #7						;/*  number of odd words to copy */
		beq		stop							;/*  No words left to copy ? */
wordcopy
		ldr		r3, [r0], #4					;/*  a word from the source */
		str		r3, [r1], #4					;/*  store a word to the destination */
		subs	r2, r2, #1						;/*  decrement the counter */
		bne		wordcopy						;/*  ... copy more */

stop
		b		stop

;/*------------------------------------------------------------------------------------------*/
;/*	 								make a word pool					 				    */
;/*------------------------------------------------------------------------------------------*/
		ltorg
src
		dcd		1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4
dst
		dcd		0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		end



在这里插入图片描述

  1. 通过 ARM 汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;掌握 ARM 不同模式的进入与退出。
;EduKit2410_for_MDK\3.4_armmode中的armmode.s代码
mrs  r0,cpsr					     
		bic  r0,r0,#0x1f		;/*  */
		orr  r0,r0,#0x11					  
		msr  cpsr_cxfs,r0

		mov r8, #16					 		  
		mov r9, #17	
		mov r10, #18	
		mov r11, #19	
		mov r12, #20	
		mov r13, #21	
		mov r14, #22

(1) 请解释上述模式切换指令;

很好,我选择求助 ChatGPT。
以下是ChatGPT(一种AI程序)给出的解释:

在这里插入图片描述

(2) 将运行结果及寄存器值截图;
在这里插入图片描述

(3) 将CPSR的格式写出来,并将程序运行的CPSR值截图。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Struts、Struts2、Spring MVC、JSF、AngularJS、React以及Vue的对比

Struts是一种Java语言的Web应用框架&#xff0c;用于构建基于Java的Web应用程序。它旨在为开发人员提供一种简单易用的方法来构建动态Web页面。Struts框架提供了一组组件&#xff0c;用于处理常见的Web应用程序任务&#xff0c;包括处理用户输入&#xff0c;验证用户输入&#…

(算法设计与分析)第七章随机化算法概述

文章目录一&#xff1a;概述&#xff08;1&#xff09;什么是随机化算法&#xff08;2&#xff09;随机化算法的特点&#xff08;3&#xff09;随机化算法分类&#xff08;4&#xff09;随机数二&#xff1a;数值随机化算法&#xff08;以计算πππ值为例&#xff09;三&#…

分布式计算 MapReduce 究竟是怎么一回事?

前言 如果要对文件中的内容进行统计&#xff0c;大家觉得怎么做呢&#xff1f;一般的思路都是将不同地方的文件数据读取到内存中&#xff0c;最后集中进行统计。如果数据量少还好&#xff0c;但是面对海量数据、大数据的场景这样真的合适吗&#xff1f;不合适的话&#xff0c;…

操作系统装完之后,安装几个特别有用的经典软件,都是电脑必备,包含pdf编辑、图片编辑、wiki、压缩、影音等等

操作系统装完之后&#xff0c;安装几个特别有用的经典软件&#xff0c;都是电脑必备&#xff0c;包含pdf编辑、图片编辑、wiki、压缩、影音等等。 Gimp https://www.gimp.org/ Gimp 是一款小巧实用的图片编辑工具。 如果你不想用笨重的PS&#xff0c;那可以尝试一下Gimp&…

元胞自动机模拟病毒传染(SEIR模型)(Python代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

SSM整合-如何配置相关文件

下述操作都是在IDEA上进行 1.首先新建一个Maven工程。 2.在pom.xml中增加相关依赖 <properties><spring.version>5.3.1</spring.version></properties><dependencies><dependency><groupId>org.springframework</groupId>&l…

安卓玩机搞机技巧综合资源----手机各种代码 查询信息 开启端口 调试选项【十】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

踩坑Xxljob本地部署后调度一半成功一半失败原因分析及解决方案记录

缘由 入门学习和本地部署Xxljob过程中&#xff0c;发现Xxljob任务一半调度成功&#xff0c;一半调度失败&#xff0c;给我邮箱发爆了&#xff0c;为啥呢&#xff1f;查了半天资料都没解决 成功比例图&#xff1a; 实际操作时&#xff0c;发现单次手动执行一定成功&#xff0…

Python之数据库编程

目录 一、MySQL数据库的使用 数据库相关操作 二、数据库增删改查 增加 修改 删除 三、数据库标准写法 一、MySQL数据库的使用 建表 CREATE TABLE py_student( id INTEGER primary key auto_increment, name INTEGER not null, gender varchar(11) default 男 , birthday d…

CMake中define_property的使用

CMake中的define_property命令用于定义和记录自定义属性&#xff0c;其格式如下&#xff1a; define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |TEST | VARIABLE | CACHED_VARIABLE>PROPERTY <name> [INHERITED][BRIEF_DOCS <brief-doc> [docs...]]…

php+vue基于微信小程序的在线挂号预约小程序

网络的广泛应用给生活带来了十分的便利。所以把在线挂号管理与现在网络相结合&#xff0c;利用ThinkPHP5技术建设在线挂号微信小程序&#xff0c;实现在线挂号的信息化。则对于进一步提高在线挂号管理发展&#xff0c;丰富在线挂号管理经验能起到不少的促进作用。 在线挂号微信…

在飞书搞了个机器人,我让ChatGPT帮忙写算法

一、前言 环境&#xff1a; 系统&#xff1a;Windows 11 64位 Python版本&#xff1a;Python 3.9 注&#xff1a;本文不讲怎么实现&#xff0c;只讲实现的效果和一些思考。大家感兴趣再考虑去配置相关机器人。 先来问问ChatGPT两个问题&#xff1a; 1、ChatGPT是什么&#xff…

Java面试题总结-面向对象

面试题总结第一篇面向对象面向对象和面向过程的区别面向对象三大特性Java是如何实现多态的面向对象 面向对象和面向过程的区别 面向过程&#xff1a; 优点&#xff1a;性能比面向对象高&#xff0c;因为类调用时需要实例化&#xff0c;开销比较大&#xff0c;比较消耗资源;比如…

非零基础自学计算机操作系统 第1章 操作系统概述 1.2 操作系统的历史 1.2.1 操作系统的产生

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.2 操作系统的历史1.2.1 操作系统的产生第1章 操作系统概述 1.2 操作系统的历史 由于操作系统是直接建造于硬件层之上的&#xff0c;它的演变必然与计算机系统结构的演变有着密切的联系。 …

Java基于JSP的小区内部物业管理系统

对于规模较小的物业管理公司来说,传统的人工小区物业管理模式仍旧可以应付日常的工作需求。但是,随着该行业不断的发展,竞争日益激烈,提高物业管理的工作水平与效率、为业主提供更好的服务,已经成为物业管理公司当前必须考虑的问题。而将计算机引入到管理机制中来将是一个不错的…

2022-12- 05 网工进阶(三十七)MPLS--基本概念、转发过程、基本配置、配置静态LSR

MPLS概述 基本概念 MPLS&#xff08;Multi-Protocol Label Switching&#xff0c;多协议标签交换&#xff09;位于TCP/IP协议栈中的数据链路层和网络层之间&#xff0c;可以向所有网络层提供服务。 通过在数据链路层和网络层之间增加额外的MPLS头部&#xff0c;基于MPLS头部…

木字楠后台管理系统开发(3):Vue项目初始化并引入基础依赖

&#x1f3b6; 文章简介&#xff1a;木字楠后台管理系统开发(3)&#xff1a;Vue项目初始化并引入基础依赖 &#x1f4a1; 创作目的&#xff1a;为了带大家完整的体验木字楠后台管理系统模版的开发流程 ☀️ 今日天气&#xff1a;温度骤降&#xff0c;差点给爷送走。 &#x1f4…

Js逆向教程23-AST Babel插件最简单修改值示例

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; AST Babel插件最简单修改值示例 一、文档地址和安装的方式 https://github.com/jamiebuilds/babel-handbook/blob/master/translation…

动态规划

什么是动态规划 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中&#xff0c;可能会有许多可行解。每一个解都对应于一个值&#xff0c;我们希望找到具有最优值的解。 动态规划的前提是什么&#xff1f; 存在最优解 拿出来任意一块物品&#xff0c;仍旧是最…

详解C++11

文章目录前言一、C11简介二、统一的列表初始化2.1 {}的初始化2.2 std::initializer_list三、声明3.1 auto3.2 decltype3.3 nullptr四、范围for五、智能指针六、STL中一些变化新容器容器中的一些新方法七、右值引用和移动语义7.1 左值引用和右值引用7.2 左值引用和右值引用比较左…