📄 arm_assemble.s
字号:
;===============================================================
;实验名称:ARM汇编语言编程实验
;程序功能:实现从源地址拷贝num个字数据,到目的地址des中
;===============================================================
;下面是段名为Init的,只读的代码段
AREA Init, CODE, READONLY
num EQU 20
ENTRY ;伪指令指出程序的入口点
;传递参数并设置堆栈
start
LDR r0, =src ;r0 = 源数据块地址
LDR r1, =dst ;r1 = 目的数据块地址
MOV r2, #num ;r2 = 拷贝字数量
MOV sp, #0x400 ;建立栈指针(r13)
;块拷贝:以32个字节(8个字)为单位进行拷贝
;使用指令:LDMIA,STMIA
blockcopy
MOVS r3, r2, LSR #3 ;r3 = r2/8 = 2(num = 20)
BEQ copywords ;少于8个字则跳转到copywords处理
STMFD sp!, {r4 - r11} ;保存工作寄存器
octcopy
LDMIA r0!, {r4 - r11} ;从源地址取出8个字数据分别存放到(r4 - r11)中
STMIA r1!, {r4 - r11} ;将(r4 - r11)中的数据设置到目的数据块地址
SUBS r3, r3, #1 ;计数器递减
BNE octcopy ;重复拷贝
LDMFD sp!, {r4 - r11} ;恢复工作寄存器
;字拷贝:以4个字节(1个字)为单位进行拷贝
;使用指令:LDR,STR
copywords
ANDS r2, r2, #7 ;最多拷贝7个,多余8个先使用blockcopy,然后使用copywords拷贝
BEQ stop ;是否拷贝完毕,拷贝完毕则跳转到stop
wordcopy
LDR r3, [r0], #4 ;从源地址取出1个字数据存放到r3中
STR r3, [r1], #4 ;将r3中的数据设置到目的数据地址
SUBS r2, r2, #1 ;计数器递减
BNE wordcopy ;重复拷贝
;将程序的控制权转交给调试器
stop
MOV r0, #0x18 ;angel_SWIreason_ReportException
LDR r1, =0x20026 ;ADP_Stopped_ApplicationExit
SWI 0x123456 ;ARM semihosting SWI
;下面是段名为BlockData的,可读写的数据段
;定义源地址数据,以及目的地址数据
AREA BlockData, DATA, READWRITE
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 ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -