简单的ARM汇编(二)

2.1 题目描述

请编写一个ARM数据块拷贝汇编语言程序,将内存中的源数据块的内容拷贝到目标地址。假设r0已经存放了源数据的首地址(自定),r1存放了目标数据地址(自定),r2存放了数据块的总长度100(数据的个数,每个数据都是32位的,即4个字节)。

2.2 设计思

用3个寄存器实现数据块的拷贝,利用LDMIA指令实现从源地址中取数据,利用STMIA指令实现往目标地址中写数据,利用循环操作实现多个数据的拷贝。

2.3 实现代码

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

2.4 运行结果

一个数据占四个字节,100个数据,400个字节,400用16进制表示为190H

LDMIA和STMIA指令都是操作后寄存器地址自动增加的。

源地址中数据见图3,拷贝后目标地址中数据见图4

     简单的ARM汇编(二)_第1张图片

图2 拷贝结束后,R0、R1中的地址

  简单的ARM汇编(二)_第2张图片

图3源地址中的数据

 简单的ARM汇编(二)_第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

你可能感兴趣的:(简单arm汇编,学习)