存储系统访问_第1页
存储系统访问_第2页
存储系统访问_第3页
存储系统访问_第4页
存储系统访问_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Lecture 03: Cortex M3存储系统访问,Refer to Chapter 5 in the reference book “ARM Cortex-M3权威指南”,Cortex-M3存储器的分类 ARM的存储结构及存储方式 存储器操作数及变量 操作数的寻址方式 Cortex-M3存储器访问指令 栈操作,内容,在系统中的地位 主存储器 辅助存储器 存储介质 磁存储器 半导体集成电路存储器 光存储器 激光光盘存储器 信息存取方式 随机存取存储器(RAM) 只读存储器(ROM),Cortex-M3存储器的分类,ARM支持以下6种数据类型: 8位有符号和无符号字节(Byte)。 16位有

2、符号和无符号半字(Halfword) 它们必须以两字节的边界对齐(半字对齐)。 32位有符号和无符号字(word) 它们必须以4字节的边界对齐(字对齐)。 字对齐:字单元地址的低两位 A1A0=0b00。即地址末位为0 x0, 0 x4, 0 x8, 0 xc。 半字对齐:半字单元地址的最低位 A0=0b0 (地址末位为0 x0,0 x2,0 x4,0 x6,0 x8,0 xa,0 xc,0 xe)。,ARM存储结构及存储方式,一个字由四个字节组成,如果要说明一个字存储的地址,则是指这个字存储的最低的地址单元的地址,即一个字存储地址是A,则实际它占用的存储单元地址是A,A+1,A+2,A+3四

3、个单元,一个半字(2个字节)占用的地址是A,A+1两个单元,若是一个字节,占用的地址是A的一个单元。 例如,地址0 x10000000(8位十六进制数)中存放的是一个字节的数据,0 x10000000、0 x10000001、0 x10000002、0 x10000003四个存储单元中存放的是一个字数据。,ARM存储结构及存储方式,ARM存储结构及存储方式,ARM的每个地址是对应于一个存储字节而不是一个存储字,但ARM可以访问存储字,访问存储字时,其地址应该是字对齐的。 字对齐,就是字的地址可以被4整除。也就是说,若第1个字在存储空间中是在第0个地址对应的单元(32位),那么,第2个字则应在第

4、4个地址对应的单元,第3个字应在第8个地址对应的单元,依此类推。一个字(32位二进制数)是由4个字节组成,假如某个字其地址是A(A能被4整除),那么,该字的4个字节对应的地址是A、A+1、A+2、A+3。,字对齐,分析:假设存储器从地址0(0 x00000000)开始存放字数据,一个字数据占四个存储单元,即0(0 x00000000)、1(0 x00000001)、2(0 x00000002)、3(0 x00000003)四个单元,那么第二个字数据放在地址4(0 x00000004)开始的单元里,第三个数据则放在地址8开始的单元里,依此类推。,字对齐,即使存储了其他类型(半字或者字节)的数据,

5、没有用到四个字节,那么下一个数据也必须按字对齐的原则,存放在能被4整除的地址单元里。 例如:一个字(32位)数据存放在4(0 x00000004)、5(0 x00000005)、6(0 x00000006)、7(0 x00000007)四个存储单元中,下面一个存储单元即8(0 x00000008)存放了一个字节(8位)的数据,如果接着要存放一个字(32位)数据,则这个字数据不能存储在9(0 x00000009)开始的存储单元中,而是必须存放在c(0 x0000000C)、d(0 x0000000D)、e(0 x0000000E)、f(0 x0000000F)这四个地址单元中,这样才符合地址对齐

6、的规定。,字对齐,对于指令,ARM指令系统分为32位ARM指令集和16位的Thumb指令集,在存储时分别以32位和16位的两种不同长度存储。 对于数据,ARM支持对32位字数据,16位半字数据,8位字节数据操作。因此数据存储器可以存储32位,16位,8位三种不同长度数据。 在ARM内部,所有操作都面向32位的操作数,只有数据传送指令支持较短的字节和半字的数据类型。当从存储器读入一个字节或半字时,根据其数据类型将其扩展到32位。,ARM存储结构,ARM存储器以8位为一个单元存储数据(一个字节),每个存储单元分配一个存储地址。 ARM将存储器看作是从零地址开始的字节的线性组合。作为32位的微处理器

7、,ARM体系结构所支持的最大寻址空间为4GB(232字节)。 从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。 32位的字数据要使用4个地址单元,16位半数据要使用2个地址单元。 就存在一个所存储的字或半字数据的排列顺序问题。ARM体系结构可以用两种方法存储字数据,称为大端格式和小端格式 。,ARM存储结构,数据存储格式 大端格式:字数据的高字节存储在低地址中,低字节存储在高地址中。 小端格式:字数据的高字节存储在高地址中,低字节存储在低地址中。 例:0 x12345678字数据的大、小端存储方式,低位地址,低位地址,高位地址,高位地址,大端格

8、式,小端格式,ARM存储结构,存储器存储方式,存储器以字节为基本存储单元。 每个存储单元都有唯一的地址与之相对应。 每个字节的二进制码占用一个存储单元。 每个双字节的二进制码占用两个连续的存储单元。 低字节保存在低地址,高字节保存在高地址。 每个四字节的二进制码占用四个连续的存储单元。 低字节保存在低地址,高字节保存在高地址。,存储器存储方式,存储器每个存储单元都有唯一地址 每个数据的地址都采用低地址来标识 0 xfe地址为0 x20001000 0 xdc地址为0 x20001001 0 x98ba地址为0 x20001002 0 x10325476地址为0 x20001004,Cortex

9、-M3存储器的分类 ARM的存储结构及存储方式 存储器操作数及变量 操作数的寻址方式 Cortex-M3存储器访问指令 栈操作,内容,存储器操作数,存储器操作数都按一定规律在存储器中排列,为了便于描述,通常采用不同字符组合来标识。 存储在存储空间的数据通常称为存储变量或简称变量。 变量声明 变量名 类型 值1,值2, 变量名 实质是所变量所在存储空间的地址。 主要用于对存储空间的标识,方便编程。 变量类型 字符型(char) DCB 半字型(short) DCW 字型(long) DCD,变量定义,以字节定义 x1 DCB 0 xfe, 0 xdc, 0 xba, 0 x98, 0 x76,

10、0 x54, 0 x32, 0 x10 以半字定义 x2 DCW 0 xdcfe, 0 x98ba, 0 x5476, 0 x1032 以字定义 x3 DCD 0 x98badcfe, 0 x10325476 混合定义 x4 DCB 0 xfe, 0 xdc DCW 0 x98ba DCD 0 x10325476,变量定义对照,x DCB 1,2,3 y DCW 1,2,3 z DCD 1,2,3,x DCB 1 char x=1;,变量定义,x DCD 0 x98badcfe, 0 x10325476 DCD x,0 xfe,0 xdc,0 xba,0 x98,0 x76,0 x54,0 x

11、32,0 x10,0 x20001000,0 x20001001,0 x20001002,0 x20001003,0 x20001004,0 x20001005,0 x20001006,0 x20001007,0 x20001008,0 x20001009,0 x2000100a,0 x2000100b,long x=0 x98badcfe, 0 x10325476, x;,x DCD 0 x98badcfe, 0 x10325476 DCD 0 x20001000,变量定义,批量字节空间分配 变量名 SPACE n ; for KEIL 分配n个字节的空间,不赋初值。 常用于大数量的存储空间

12、分配 x SPACE 4 y DCD 4,char x4; long y=4;,:分配四个字节(1个字)空间,:分配四个字节(1个字)空间,并将值4保 存在其中。,Cortex-M3存储器的分类 ARM的存储结构及存储方式 存储器操作数及变量 操作数的寻址方式 Cortex-M3存储器访问指令 栈操作,内容,操作数的寻址方式,立即数寻址 MOV Rd, #imm (Rd) = imm 立即数 imm 0-0 xffff 0-0 xff 左移0-23位的值 奇偶字节均相等 MOVW Rd, #imm (Rd) = imm Rd的高16位清零 imm 0-0 xffff MOVT Rd, #imm

13、 (Rd) = imm16 Rd的低16位不受任何影响,其它立即数如何送至寄存器?,操作数的寻址方式,直接寻址 addr 首地址为addr的存储空间 读取数值按操作类型确定 0 x20001000 字符型:0 xfe 半字型:0 xdcfe 字型:0 x98badcfe 0 x20001003 字符型:0 x98 半字型:0 x7698 字型:0 x32547698,0 xfe,0 xdc,0 xba,0 x98,0 x76,0 x54,0 x32,0 x10,0 x20001000,0 x20001001,0 x20001002,0 x20001003,0 x20001004,0 x2000

14、1005,0 x20001006,0 x20001007,操作数的寻址方式,相对寻址 相对寻址 Rn, offset Rn的值(Rn)为基址 地址=基址+偏移量 偏移量为立即数 Rn, #imm Addr=(Rn)+imm -0 xfffimm 0 xfff 偏移量为寄存器值 Rn, Rm Addr=(Rn)+(Rm) 偏移量为寄存器值的移位结果 Rn, Rm, LSL #n Addr=(Rn)+(Rm)n n=1、2、3,0 xfe,0 xdc,0 xba,0 x98,0 x76,0 x54,0 x32,0 x10,0 x20001000,0 x20001001,0 x20001002,0

15、x20001003,0 x20001004,0 x20001005,0 x20001006,0 x20001007,Cortex-M3存储器的分类 ARM的存储结构及存储方式 存储器操作数及变量 操作数的寻址方式 Cortex-M3存储器访问指令 栈操作,内容,Cortex-M3存储器访问指令,常用的存储器访问指令,Cortex-M3存储器访问指令,存储器只能与寄存器交换数据 读出 LDR Rd, Rn, offset; 读一个字 LDRH Rd, Rn, offset; 读一个半字 LDRB Rd, Rn, offset; 读一个字节 LDRD RdL, RdH, Rn, offset; 读

16、一个双字,a=*(long*)(char*)x)+m);,a=*(short*)(char*)x)+m);,a=*(char*)x)+m);,a=*(long long*)(char*)x)+m);,Cortex-M3存储器访问指令,存储器只能与寄存器交换数据 写入 STR Rd, Rn, offset; 写一个字 STRH Rd, Rn, offset; 写一个半字 STRB Rd, Rn, offset; 写一个字节 STRD RdL, RdH, Rn, offset; 写一个双字,*(long*)(char*)x)+m)=a;,*(short*)(char*)x)+m)=a;,*(cha

17、r*)x)+m)=a;,*(long long*)(char*)x)+m)=a;,Cortex-M3存储器访问指令,存储器的读写 x (Rn) i(Rm) j (Rd) long x5; j=xi; short x5; j=xi; char x5; j=xi; long x5; xi=j; short x5; xi=j; char x5; xi=j;,LDR Rd, Rn, Rm, LSL #2 LDRH Rd, Rn, Rm, LSL #1 LDRB Rd, Rn, Rm,STR Rd, Rn, Rm, LSL #2 STRH Rd, Rn, Rm, LSL #1 STRB Rd, Rn,

18、Rm,Cortex-M3存储器访问指令,存储器寻址 LDR R2, R0,#4 Addr=0 x20001000+4=0 x20001004 R2=0 x10325476 LDRH R2, R0, R1 Addr=0 x20001000+1=0 x20001001 R2=0 xbadc LDRB R2, R0, R1, LSL #2 Addr=0 x20001000+(12)=0 x20001004 R2=0 x76,0 xfe,0 xdc,0 xba,0 x98,0 x76,0 x54,0 x32,0 x10,0 x20001000,0 x20001001,0 x20001002,0 x20

19、001003,0 x20001004,0 x20001005,0 x20001006,0 x20001007,0 x20001000,0 x1,R0,R1,练习题,存储器中存有0 x80、0 x2030、0 x456789三个数,将这三个数分别读取至R2、R3、R4中。,0 x80,0 x00,0 x20,0 x30,0 x20,0 x45,0 x67,0 x89,0 x20001000,0 x20001000,R0,0 x67,0 x45,0 x00,0 x01,LDRB R2, R0, #0,LDRH R3, R0, #2,LDR R2, R0, #6,练习题,将数值0 x12、0 x34

20、、0 x56、0 x78按顺序保存在地址为0 x20001010、0 x20001011、0 x20001012、0 x20001013这四个存储单元中。 假定R0当前值为0 x20001000 程序 MOV R1, #0 x12 STRB R1, R0, #0 x10 MOV R1, #0 x34 STRB R1, R0, #0 x11 MOV R1, #0 x56 STRB R1, R0, #0 x12 MOV R1, #0 x78 STRB R1, R0, #0 x13,这三个数可以组成一个32位数0 x78563412,将该值保存在R1中,直接采用 STR R1, R0, #0 x10

21、 即可。,如何将超过16位的立即数赋给寄存器呢?,练习思考,如何将超过16位的任一立即数(如0 x78563412 )赋给寄存器呢? 先将0 x78563412作为数据定义出来,再采用LDR将其读入R1。 x DCD 0 x78563412 LDR R1, x 假定x标识的存储单元地址为0 x00001008 ,汇编指令实质是以PC作为基址的相对寻址。 LDR R1, PC, #offset offset在编译连接过程中自动生成,无需人为计算,但仅当offset在规定的范围内才无错。 假定当前PC为0 x00001000 LDR R1, PC, #8,Cortex-M3存储器访问指令,使用LD

22、R伪指令进行立即数赋值 LDR R0, =imm imm满足MOV要求的 等同于 MOV R0, #imm imm满足MOVW要求的 等同于 MOVW R0, #imm imm不满足MOV或MOVW要求的 分为两部分,即以PC作为基址的相对寻址指令和立即数的存储(与指令同在相同的代码区)。 LDR R0, PC, #offset DCW immL DCW immH,立即数offset在编译连接过程中自动生成,无需人为计算。,Cortex-M3存储器访问指令,前序存储器访问指令,“!”表明基址寄存器Rn会更新,这样指令包含两部分工作,访问存储器+地址修正。-255offset255,LDR.W

23、R0, R1, #offset! ;读取存储器R1+offset,R1更新为R1+offset,“.W”表明指令为32位Thumb-2指令,否则位16位Thumb指令,Sign extension,Cortex-M3存储器访问指令,后序存储器访问指令,LDR.W R0, R1, #offset ;读取存储器R1,R1更新为R1+offset,Cortex-M3存储器访问指令,从地址0 x20001000开始将后续的三个字分别读到的R1,R2和R3中。 LDR R1, R0, #4! LDR R2, R0, #4! LDR R3, R0, #4,0 xfe,0 xdc,0 xba,0 x98,0

24、 x76,0 x54,0 x32,0 x10,0 x20001000,0 x20000ffc,R0,0 x01,0 x23,0 x45,0 x67,0 x98badcfe,R1,0 x20001000,R0,0 x20000ffc,R0,0 x10325476,R2,0 x20001004,R0,0 x20001004,R0,0 x67452301,R3,前序存储器访问,Cortex-M3存储器访问指令,从地址0 x20001000开始将后续的三个字分别读到的R1,R2和R3中。 LDR R1, R0, #4 LDR R2, R0, #4 LDR R3, R0,0 xfe,0 xdc,0 xb

25、a,0 x98,0 x76,0 x54,0 x32,0 x10,0 x20001000,0 x20001000,R0,0 x01,0 x23,0 x45,0 x67,0 x98badcfe,R1,0 x20001004,R0,0 x20001000,R0,0 x10325476,R2,0 x20001008,R0,0 x20001008,R0,0 x67452301,R3,后序存储器访问,练习题,将数值0 x12、0 x34、0 x56、0 x78按顺序保存在地址为0 x20001010、0 x20001013、0 x20001016、0 x20001019这四个存储单元中。 程序 LDR R

26、0, =0 x20001010 MOV R1, #0 x12 STRB R1, R0, #0 x0 MOV R1, #0 x34 STRB R1, R0, #0 x3 MOV R1, #0 x56 STRB R1, R0, #0 x6 MOV R1, #0 x78 STRB R1, R0, #0 x9,练习题,将数值0 x12、0 x34、0 x56、0 x78按顺序保存在地址为0 x20001010、0 x20001013、0 x20001016、0 x20001019这四个存储单元中。 程序 LDR R0, =0 x20001010 MOV R1, #0 x12 STRB R1, R0 M

27、OV R1, #0 x34 STRB R1, R0, #0 x3! MOV R1, #0 x56 STRB R1, R0, #0 x3! MOV R1, #0 x78 STRB R1, R0, #0 x3,Cortex-M3存储器访问指令,多次存储器访问指令,IA:传输完成后(A)地址递增(I),“DB:传输前(B)地址递减(D),(R8)=0 x8000; STMIA.W R8!, R0-R3; 存储器后R8变为0 x8010(增加4个字) STMIA.W R8, R0-R3; 存储器后R8不变,Cortex-M3存储器访问指令,从地址0 x20001000开始将后续的三个字分别读到的R1,

28、R2和R3中。 LDMIA R0, R1-R3 LDMIA R0!, R1-R3,0 xfe,0 xdc,0 xba,0 x98,0 x76,0 x54,0 x32,0 x10,0 x20001000,0 x20001000,R0,0 x01,0 x23,0 x45,0 x67,0 x98badcfe,R1,0 x20001000,R0,0 x20001000,R0,0 x10325476,R2,0 x2000100c,R0,0 x67452301,R3,0 x20001000,R0,0 x98badcfe,R1,0 x10325476,R2,0 x67452301,R3,多次存储器访问,Co

29、rtex-M3存储器访问指令,从地址0 x20001000开始将后续的三个字分别读到的R1,R2和R3中。 LDMDB R0, R1-R3 LDMDB R0!, R1-R3,0 xfe,0 xdc,0 xba,0 x98,0 x76,0 x54,0 x32,0 x10,0 x20001000,0 x2000100c,R0,0 x01,0 x23,0 x45,0 x67,0 x98badcfe,R1,0 x2000100c,R0,0 x2000100c,R0,0 x10325476,R2,0 x20001000,R0,0 x2000100c,R0,0 x98badcfe,R1,0 x103254

30、76,R2,后序存储器访问,0 x67452301,R3,0 x67452301,R3,Cortex-M3存储器的分类 ARM的存储结构及存储方式 存储器操作数及变量 操作数的寻址方式 Cortex-M3存储器访问指令 栈操作,内容,栈操作,栈 一定大小的存储空间,按先进后出读写数据 数据读写改变栈指针SP(R13) 栈指针初始在栈底(高地址) 入栈 栈指针减4后在相应的地址上写入一个字 PUSH 寄存器列表 STMDB SP!, 寄存器列表 出栈 取出栈指针所对应的一个字后栈指针加4 POP 寄存器列表 LDMIA SP!, 寄存器列表,地址值只能为4的倍数(二进制后两位都为0),假定(R0

31、)=0 x12,(R1)=0 x3456,(R2)=0 x789abcde PUSH R0 PUSH R1 PUSH R2,0 x20001000,0 x2000100c,SP,0 x00,SP,0 x2000100c,SP,0 x20001008,SP,0 x20001004,SP,0 x20001000,SP,入栈,0 xde,0 xbc,0 x9a,0 x78,0 x56,0 x34,0 x00,0 x00,0 x12,0 x00,0 x00,0 x00,栈操作,假定(R0)=0 x12,(R1)=0 x3456,(R2)=0 x789abcde PUSH R0-R2 STMDB SP!

32、, R0-R2,0 xde,0 xbc,0 x9a,0 x78,0 x56,0 x34,0 x00,0 x00,0 x20001000,0 x2000100c,SP,0 x12,0 x00,0 x00,0 x00,0 x00,SP,0 x2000100c,SP,0 x20001000,SP,0 x2000100c,SP,0 x20001000,SP,入栈,栈操作,从栈中读出三个数,使(R4)=0 x12,(R5)=0 x3456,(R6)=0 x789abcde POP R6 POP R5 POP R4,0 xde,0 xbc,0 x9a,0 x78,0 x56,0 x34,0 x00,0 x

33、00,0 x20001000,0 x20001000,SP,0 x12,0 x00,0 x00,0 x00,0 x00,SP,0 x20001000,SP,0 x20001004,SP,0 x20001008,SP,0 x2000100C,SP,出栈,(R6)= 0 x789abcde,(R5)= 0 x3456,(R4)= 0 x12,栈操作,从栈中读出三个数,使(R4)=0 x12,(R5)=0 x3456,(R6)=0 x789abcde POP R4-R6 LDMIA SP!, R4-R6,0 xde,0 xbc,0 x9a,0 x78,0 x56,0 x34,0 x00,0 x00,

34、0 x20001000,0 x20001000,SP,0 x12,0 x00,0 x00,0 x00,0 x00,SP,0 x20001000,SP,0 x2000100c,SP,0 x20001000,SP,0 x2000100c,SP,出栈,栈操作,在堆栈中开辟三个字空间,从低地址向高地址存放0 x1234、0 x5678、0 xabcd。 PUSH R0 LDR R0, =0 xabcd PUSH R0 LDR R0, =0 x5678 PUSH R0 LDR R0, =0 x1234 PUSH R0 LDR R0, SP, #12,0 x00000000,0 x00000000,0 x00000000

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论