您好,欢迎访问三七文档
Lecture03:CortexM3存储系统访问RefertoChapter5inthereferencebook“ARMCortex-M3权威指南”Cortex-M3存储器的分类ARM的存储结构及存储方式存储器操作数及变量操作数的寻址方式Cortex-M3存储器访问指令栈操作内容在系统中的地位•主存储器辅助存储器存储介质•磁存储器半导体集成电路存储器光存储器激光光盘存储器信息存取方式•随机存取存储器(RAM)只读存储器(ROM)Cortex-M3存储器的分类ARM支持以下6种数据类型:8位有符号和无符号字节(Byte)。16位有符号和无符号半字(Halfword)它们必须以两字节的边界对齐(半字对齐)。32位有符号和无符号字(word)它们必须以4字节的边界对齐(字对齐)。字对齐:字单元地址的低两位A1A0=0b00。即地址末位为0x0,0x4,0x8,0xc。半字对齐:半字单元地址的最低位A0=0b0(地址末位为0x0,0x2,0x4,0x6,0x8,0xa,0xc,0xe)。ARM存储结构及存储方式•一个字由四个字节组成,如果要说明一个字存储的地址,则是指这个字存储的最低的地址单元的地址,即一个字存储地址是A,则实际它占用的存储单元地址是A,A+1,A+2,A+3四个单元,一个半字(2个字节)占用的地址是A,A+1两个单元,若是一个字节,占用的地址是A的一个单元。•例如,地址0x10000000(8位十六进制数)中存放的是一个字节的数据,0x10000000、0x10000001、0x10000002、0x10000003四个存储单元中存放的是一个字数据。ARM存储结构及存储方式ARM存储结构及存储方式•ARM的每个地址是对应于一个存储字节而不是一个存储字,但ARM可以访问存储字,访问存储字时,其地址应该是字对齐的。•字对齐,就是字的地址可以被4整除。也就是说,若第1个字在存储空间中是在第0个地址对应的单元(32位),那么,第2个字则应在第4个地址对应的单元,第3个字应在第8个地址对应的单元,依此类推。一个字(32位二进制数)是由4个字节组成,假如某个字其地址是A(A能被4整除),那么,该字的4个字节对应的地址是A、A+1、A+2、A+3。字对齐分析:假设存储器从地址0(0x00000000)开始存放字数据,一个字数据占四个存储单元,即0(0x00000000)、1(0x00000001)、2(0x00000002)、3(0x00000003)四个单元,那么第二个字数据放在地址4(0x00000004)开始的单元里,第三个数据则放在地址8开始的单元里,依此类推。字对齐–即使存储了其他类型(半字或者字节)的数据,没有用到四个字节,那么下一个数据也必须按字对齐的原则,存放在能被4整除的地址单元里。–例如:一个字(32位)数据存放在4(0x00000004)、5(0x00000005)、6(0x00000006)、7(0x00000007)四个存储单元中,下面一个存储单元即8(0x00000008)存放了一个字节(8位)的数据,如果接着要存放一个字(32位)数据,则这个字数据不能存储在9(0x00000009)开始的存储单元中,而是必须存放在c(0x0000000C)、d(0x0000000D)、e(0x0000000E)、f(0x0000000F)这四个地址单元中,这样才符合地址对齐的规定。字对齐对于指令,ARM指令系统分为32位ARM指令集和16位的Thumb指令集,在存储时分别以32位和16位的两种不同长度存储。对于数据,ARM支持对32位字数据,16位半字数据,8位字节数据操作。因此数据存储器可以存储32位,16位,8位三种不同长度数据。在ARM内部,所有操作都面向32位的操作数,只有数据传送指令支持较短的字节和半字的数据类型。当从存储器读入一个字节或半字时,根据其数据类型将其扩展到32位。ARM存储结构ARM存储器以8位为一个单元存储数据(一个字节),每个存储单元分配一个存储地址。ARM将存储器看作是从零地址开始的字节的线性组合。作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB(232字节)。从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。32位的字数据要使用4个地址单元,16位半数据要使用2个地址单元。就存在一个所存储的字或半字数据的排列顺序问题。ARM体系结构可以用两种方法存储字数据,称为大端格式和小端格式。ARM存储结构数据存储格式–大端格式:字数据的高字节存储在低地址中,低字节存储在高地址中。–小端格式:字数据的高字节存储在高地址中,低字节存储在低地址中。例:0x12345678字数据的大、小端存储方式低位地址低位地址高位地址高位地址大端格式小端格式ARM存储结构存储器存储方式存储器以字节为基本存储单元。每个存储单元都有唯一的地址与之相对应。每个字节的二进制码占用一个存储单元。每个双字节的二进制码占用两个连续的存储单元。•低字节保存在低地址,高字节保存在高地址。每个四字节的二进制码占用四个连续的存储单元。•低字节保存在低地址,高字节保存在高地址。0xfe0xdc0xba0x980x760x540x320x100x200010000x200010010x200010020x200010030x200010040x200010050x200010060x200010070xfe0xdc0x98ba0x10325476存储器存储方式存储器每个存储单元都有唯一地址每个数据的地址都采用低地址来标识0xfe地址为0x200010000xdc地址为0x200010010x98ba地址为0x200010020x10325476地址为0x200010040xfe0xdc0xba0x980x760x540x320x100x200010000x200010010x200010020x200010030x200010040x200010050x200010060x200010070xfe0xdc0x98ba0x10325476Cortex-M3存储器的分类ARM的存储结构及存储方式存储器操作数及变量操作数的寻址方式Cortex-M3存储器访问指令栈操作内容存储器操作数存储器操作数都按一定规律在存储器中排列,为了便于描述,通常采用不同字符组合来标识。•存储在存储空间的数据通常称为存储变量或简称变量。变量声明{变量名}类型值1,值2,…•变量名•实质是所变量所在存储空间的地址。•主要用于对存储空间的标识,方便编程。•变量类型•字符型(char)DCB•半字型(short)DCW•字型(long)DCD变量定义以字节定义x1DCB0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10以半字定义x2DCW0xdcfe,0x98ba,0x5476,0x1032以字定义x3DCD0x98badcfe,0x10325476混合定义x4DCB0xfe,0xdcDCW0x98baDCD0x10325476变量定义对照xDCB1,2,3yDCW1,2,3zDCD1,2,3xDCB1charx[]={1};charx=1;在C语言中定义一个变量“charx=1;”,这样应用起来方便。但在汇编来看,所有值都放在存储器中,只有地址。汇编中使用的是&x。变量定义xDCD0x98badcfe,0x10325476DCDx0xfe0xdc0xba0x980x760x540x320x100x200010000x200010010x200010020x200010030x200010040x200010050x200010060x200010070x200010080x200010090x2000100a0x2000100blongx[]={0x98badcfe,0x10325476,x};0x000x100x000x20xDCD0x98badcfe,0x10325476DCD0x20001000变量定义批量字节空间分配变量名SPACEn;forKEIL•分配n个字节的空间,不赋初值。•常用于大数量的存储空间分配xSPACE4yDCD4charx[4];longy[]={4};:分配四个字节(1个字)空间:分配四个字节(1个字)空间,并将值4保存在其中。Cortex-M3存储器的分类ARM的存储结构及存储方式存储器操作数及变量操作数的寻址方式Cortex-M3存储器访问指令栈操作内容操作数的寻址方式立即数寻址MOVRd,#imm•(Rd)=imm•立即数imm•0-0xffff•0-0xff左移0-23位的值•奇偶字节均相等MOVWRd,#imm•(Rd)=imm•Rd的高16位清零•imm•0-0xffffMOVTRd,#imm•(Rd)=imm16•Rd的低16位不受任何影响其它立即数如何送至寄存器?操作数的寻址方式直接寻址[addr]•首地址为addr的存储空间•读取数值按操作类型确定[0x20001000]字符型:0xfe半字型:0xdcfe字型:0x98badcfe[0x20001003]字符型:0x98半字型:0x7698字型:0x325476980xfe0xdc0xba0x980x760x540x320x100x200010000x200010010x200010020x200010030x200010040x200010050x200010060x20001007操作数的寻址方式相对寻址相对寻址[Rn,offset]•Rn的值(Rn)为基址•地址=基址+偏移量•偏移量为立即数–[Rn,#imm]»Addr=(Rn)+imm»-0xfffimm0xfff•偏移量为寄存器值–[Rn,Rm]»Addr=(Rn)+(Rm)•偏移量为寄存器值的移位结果–[Rn,Rm,LSL#n]»Addr=(Rn)+(Rm)n»n=1、2、30xfe0xdc0xba0x980x760x540x320x100x200010000x200010010x200010020x200010030x200010040x200010050x200010060x20001007Cortex-M3存储器的分类ARM的存储结构及存储方式存储器操作数及变量操作数的寻址方式Cortex-M3存储器访问指令栈操作内容Cortex-M3存储器访问指令实例描述LDRBRd,[Rn,#offset]从存储器位置Rn+offset处读取字节LDRHRd,[Rn,#offset]从存储器位置Rn+offset处读取半字LDRRd,[Rn,#offset]从存储器位置Rn+offset处读取字LDRDRd1,Rd2,[Rn,#offset]从存储器位置Rn+offset处读取双字STRBRd,[Rn,#offset]往存储器位置Rn+offset处存储字节STRHRd,[Rn,#offset]往存储器位置Rn+offset处存储半字STRRd,[Rn,#offset]往存储器位置Rn+offset处存储字STRDRd1,Rd2,[Rn,#offset]往存储器位置Rn+offset处存储双字常用的存储器访问指令Cortex-M3存储器访问指令存储器只能与寄存器交换数据•读出•LDRRd,[Rn,offset];读一个字•LDRHRd,[Rn,offset];读一个半字•LDRBRd,[Rn,offset];读一个字节•LDRDRdL,RdH,[Rn,offset];读一个双字a=*(long*)(((char*)x)+m);a=*(short*)(((char*)x)+m);a=*(((char*)x)+m);a=*(longlong*)(((char*)x)+m);Cortex-M3存储器访问指令存储器只能与寄存器交换数据•写入•STRRd,[Rn,offset];写一个字•STR
本文标题:3存储系统访问
链接地址:https://www.777doc.com/doc-3763722 .html