编写一段ARM汇编程序,实现数据块复制,将R0指向8个字的连续数据保存到R1指向的一段连续的内存单元,急求

编写一段ARM汇编程序,实现数据块复制,将R0指向8个字的连续数据保存到R1指向的一段连续的内存单元,急求,第1张

。。。

MOV SI ,R0

MOV DI,RI

MOV CX,8

LOP: MOV AL,[SI]

MOV [DI],AL

ADD SI,2 ;因为是字所以要加2

ADD DI,2

LOOP LOP

。。桐毁兄做。

不过汇编程局尘备序是以asm为后缀的。。。

LDM是多寄存器存取的意思,IA表示数据传输后地址增加(increase after);(IB:increase before, DA: decrease after, DB: decrease before)

后面参数以“,”分隔,第一个参数是首地址;第二个参数是寄存器列表或旦拦,并以“{}”括起来。

具体的迟宽例子:

LDMIA R0!, {R1-R4}

R0表示要 *** 作的存储空间首地址,要 *** 作的数据个数由寄存器列表决定,现在是R1到R4,共4个数据(每个数据是32bits的)

具体:地址为R0的存储空间中的数据赋值给R1

地址为R0+4的存储空间中的数据赋值给R2

地址为R0+8的存储空间中的数据赋值给R3

地址为R0+12的存储空间中的数据赋衫胡值给R4

所有的示例指令执行前的存储空间和寄存器情况:

mem32[0x1000C] = 0x04

mem32[0x10008] = 0x03

mem32[0x10004] = 0x02

mem32[0x10000] = 0x01

r0 = 0x00010000

r1 = 0x00000000

r3 = 0x00000000

r4 = 0x00000000

执行后存储空间不变,寄存器变化:

r0 = 0x00010010

r1 = 0x01

r2 = 0x02

r3 = 0x03

r4 = 0x04

貌似这个问题是很久之前的,应该都解决了吧,那附带说一下。

批量加载/存储指令

ARM微处理器所支持的批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的 *** 作。常用的加载存储指令如下:

LDM (批量数据加载指令)

LDM{条件}{类型} 基址寄存器{!},寄存器列表{∧}

LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。

其中,{类型}为以下几种情况:

IA 每次传送后地址加1;

IB 每次传送前地址加1;

DA 每次传送后地址减1;

DB 每次传送前地址减1;

FD 满递减堆栈;

ED 空递减堆栈;

FA 满递增堆栈;

EA 空递增堆栈;

{!}为可选后缀,若选用该后缀,则当数据传送完毕兆睁备之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。

{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。

例如:

STMFD R13!,{R0,R4-R12,LR}

将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈。

LDMFD R13!,{R0,R4-R12,PC}

将堆栈内容恢复到寄存器(R0,R4到R12,LR)

有了以上必备知识后,lz的问题就很容易理解了。

把r0所存放的基址,通过基址寄族毁存器寻址方式,

把r0所指向的内容给r5后 r0向后移,之后就是早燃依次给 r6 r7 r8,等等,!感叹号代表则当数据传送完毕之后,将最后的地址写入基址寄存器。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12520930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存