加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ARM数据加载与存储指令(一)

(2012-06-13 17:53:36)
标签:

ARM

汇编语言

分类: 汇编语言

 

 

 

 

 

ARM数据加载与存储指令

数据加载与存储指令时ARM在寄存器与存储器之间实现数据传送的一类指令。

 

实验目的:

l         单寄存器数据传送指令的运用和各种变址寻址模式的掌握

l         多寄存器数据传送指令的运用和各种变址寻址模式的掌握

l         单个数据复制和数据块复制的方法。

l         利用调试器中各种窗口观察完成各指令操作后寄存器、存储器、标签地址、机器指令等的变化情况。

一、 单寄存器的加载和存储指令LDR|STR

      AREA Lab1,CODE

       ENTRY

START 

       ADR R1,SRC

       ADR R2,DST

COPY  

       LDR R0,[R1]

       STR R0,[R2]

       ADD R1,R1,#0x4

       ADD R2,R2,#0x4

       LDR R0,[R1]

       STR R0,[R2]

       ADD R1,R1,#0x4

       ADD R2,R2,#0x4

       LDR R0,[R1]

       STR R0,[R2]

      

STOP

       B STOP

       

      

SRC    DCB "one small!"

       ALIGN

DST    DCB "three big!"

       END

程序说明:

1.       伪指令ADR是将一个寄存器相关变大时或程序相关表达式的地址存入寄存器中,在例子中相当于使R1指向SRCR2指向DST地址,即初始化地址指针。

2.       DCB的作用是分配一组字节内存并定义其内容为指定字符串,也可以用“=”代替:

SRC = “one small!”

DST =three big!”

 

完成下列任务

1.阅读程序exp6_1.s,写出程序的功能。设置代码段的基地址为0x8000。用AXD单步调试程序,观察每执行一步以后,相应的寄存器和存储器的变化情况,完成表格。

打开的process view窗口如下:registerdisassemblylow lever symbols,memory

序号

执行指令

指令执行后变化情况

 

 

寄存器

存储器

 

 

R0

R1

R2

PC

0x8040

0x8041

0x8042

0x8043

0x8044

0x8045

0x8046

0x8047

0x8048

0x8049

0

 

0x0

0x0

0x0

0x8000

0x74

t

0x68

H

0x72

r

0x65

e

0x65

e

0x20

_

0x62

b

0x69

i

0x67

g

0x21

!

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.程序中使用的寻址方式是间接寻址中的零变址方式,请将程序改为前变址形式和后变址形式。(绘图分析各种变址寻址形式,并设计程序验证。)

3.用多寄存器传送指令修改程序。

 

答案:

1.       程序的功能是将存储器中SRC处的源数据通过数据传送指令传送到DST处。

2.       前变址和后变址

方法一

COPY LDR R0,[R1],#4

            STR R0,[R2],#4

            LDR R0,[R1],#4

            STR R0,[R2],#4

LDR R0,[R1],#4

            STR R0,[R2],#4

方法二

    SUB R1,R1,#4

    SUB R2,R2,#4

    MOV R3,#1

CPY

    LDR R0,[R1,#4]!

    STR R0,[R2,#4]!

    CMP R3,#3

    ADD R3,R3,#1

    BNE CPY

方法三

LDR R0,[R1]

            STR R0,[R2]

            LDR R0,[R1#4]

            STR R0,[R2#4]

LDR R0,[R1#8]

            STR R0,[R2#8]

3.       多寄存器传送指令

LDMIA   R1!,{R3-R5}

STMIA   R2!,{R3-R5}

 

 

一、 多寄存器的加载和存储指令

       AREA Lab2,CODE

       ENTRY

START 

       LDR sp,=NUM

       LDMFD SP!,{R0-R4}

       ADD R4,R0,R1

       ADD R4,R4,R2

       ADD R4,R4,R3

       MOV R4,R4,LSR #2

       STR R4,[SP]

STOP

       B STOP

      

       AREA Dblock,DATA

NUM    DCD  0x12,0x34,0x56,0x78

       END

程序说明:

1.         定义一个名为Dblock的数据区域

2.         伪指令DCD的作用是分配一组字内存并定义其内容,分配的内存一定是4的倍数。也可以用&替代。

NUM & 0x12, 0x34,0x56,0x78

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有