萌新第一次发帖,大佬请轻喷!!!
本帖主要为记录ARM实验课上所写的一个实验,实验要求如下:
废话不多说,直接上代码 = =
import mycompare
AREA mymemmove,CODE,READONLY
export mymemmove
;r0为源地址,r1为目的地址,r2为字节数
mov r3,r0 ;将源地址保存到r3
mov r4,r2,lsr #4;r4放字节数/16的值
bl mycompare ;调用C程序的compare比较两个地址的大小,此时r0存放源地址-目的地址的值
cmp r0,#0
beq tag3
cmn r0,#1
beq tag6 ;源地址与目的地址相同,不需拷贝
;以下是源地址大于目的地址的拷贝
;从前往后拷贝
mov r0,#16
mul r5,r0,r4
sub r0,r2,r5;r0存放字节数%16后的值
;当前地址各寄存器存放的数值为:
;r0:字节数%16 r1:目的地址 r2:字节数
;r3:源地址 r4:字节数/16
;若需拷贝的字节数大于16,则循环拷贝,一次16字节,直到剩余字节小于16
cmp r4,#0
tag1 ldmneia r3!,{r5-r8} ;访问后地址递增
stmneia r1!,{r5-r8}
subne r4,r4,#1
cmpne r4,#0
bne tag1
;拷贝剩余字节,一次拷贝1字节(防止溢出)
cmp r0,#0
tag2 ldrnesb r5,[r3