请编写一个ARM数据块拷贝汇编语言程序,将内存中的源数据块的内容拷贝到目标地址。假设r0已经存放了源数据的首地址(自定),r1存放了目标数据地址(自定),r2存放了数据块的总长度100(数据的个数,每个数据都是32位的,即4个字节)。
用3个寄存器实现数据块的拷贝,利用LDMIA指令实现从源地址中取数据,利用STMIA指令实现往目标地址中写数据,利用循环操作实现多个数据的拷贝。
1. 首先给寄存器R0、R1和R2赋初始值(寄存器R0存放源数据首地址,R1存放目标数据地址,R2存放数据的总长度即要拷贝数据的个数)。
MOV R0,#0x70000000 ;R0源数据的首地址
MOV R1,#0x10000000 ;R1目标数据地址
MOV R2,#100 ;R2数据块的总长度
2. 执行LDMIA操作,一次读出4个数据放入寄存器R3-R6中。再执行STMIA操作,将读取的R3-R6中的值写入目标内存单元中。
LDMIA R0!,{R3-R6} ;R3-R6寄存器读取源数据的内容
STMIA R1!,{R3-R6} ;将R3-R6中的内容拷贝到目标数据地址中
3 . 要拷贝的数据个数做SUB操作减4,若不等于0,则跳转至步骤2做循环操作,直至要拷贝的数据个数为0,结束。
SUB R2,R2,#4
CMP R2,#0
BNE LOOP
一个数据占四个字节,100个数据,400个字节,400用16进制表示为190H
LDMIA和STMIA指令都是操作后寄存器地址自动增加的。
源地址中数据见图3,拷贝后目标地址中数据见图4
图2 拷贝结束后,R0、R1中的地址
图3源地址中的数据
图4 拷贝后目标地址中数据
源程序:
AREA F,CODE,READONLY
EXPORT Reset_Handler
Reset_Handler
MOV R0,#0x70000000 ;R0源数据的首地址
MOV R1,#0x10000000 ;R1目标数据地址
MOV R2,#100 ;R2数据块的总长度
LOOP
LDMIA R0!,{R3-R6} ;R3-R6寄存器读取源数据的内容
STMIA R1!,{R3-R6} ;将R3-R6中的内容拷贝到目标数据地址中
SUB R2,R2,#4
CMP R2,#0
BNE LOOP
END