当前位置:文档之家› ARM接口编程笔记

ARM接口编程笔记

ARM接口编程笔记一、ARM编程模式1.ARM的含义●ARM是一家公司的名字●ARM代表的是一种RISC技术●ARM是一种CPU体系结构的名称,同x86、PPC、MIPS等并列2.ARM体系结构中对字节、半字、字、双字的定义●字节:8 bit●半字:16 bit●字:32 bit●双字:64 bit3.ARM指令集●ARM指令集,32 bit,功能最全●Thumb指令集,16 bit,是ARM指令集的子集,完成部分功能●Thumb‐2指令集,16 bit和32 bit混合●Thumb‐EE指令集,16 bit和32 bit混合●Java指令集,直接执行绝大部分的Java字节流,但需要授权4.ARM处理器的权限●非特权级:部分指令不能执行,是一种硬件的保护机制,通常用户应用程序运行在该权限级别●特权级:能执行所有指令,通常操作系统运行在该权限级别5.ARM的工作模式,处理对应模式下的特定事务,使得这些特定事务能够在硬件资源的使用上部分地独立开来,这是通过各种模式下有对应的私有硬件资源来实现的。

●User:应用程序一般运行在该模式下●Supervisor:操作系统一般运行在该模式下●IRQ:中断处理程序一般运行在该模式下●FIQ:快速中断处理程序一般运行在该模式下●Abort:发生存取异常后会进入该模式●Undef:执行未定义的指令会进入该模式●System:为解决中断不可重入而设计的一种特殊模式●Monitor:Cortex‐A特有的模式,执行监控代码●除User模式外,其他7种模式都是特权模式6.ARM寄存器寄存器最靠近CPU中的ALU,存取速度最快,没有地址,只有编号。

部分寄存器有别名,在汇编程序中本名和别名可以混用。

●R0‐R7:各模式都共用的寄存器,物理上共8个寄存器。

●R8‐R12:FIQ模式下有对应的私有寄存器,即FIQ模式下使用其私有的这组寄存器,另外7中模式都共用另外一组寄存器,物理上共有10个寄存器●R13:User和System模式共用,另外6种模式都有各自私有的寄存器,物理上共7个寄存器●R14:User和System模式共用,另外6种模式都有各自私有的寄存器,物理上共7个寄存器●R15:各模式都共用的寄存器,物理上只有1个●CPSR:各模式都共用的寄存器,物理上只有1个●SPSR:User和System模式下无此寄存器,另外6种模式都有各自私有的寄存器,物理上共6个寄存器7.ARM寄存器使用说明●虽然上表中各模式下的私有寄存器都跟有后缀,但在汇编中都使用统一的名字。

如,在FIQ模式下的汇编代码要表示R13寄存器,只能在汇编中写R13,而不能写R13_fiq●虽然总共有40个寄存器,但是处理器在某一个特定时刻,只能处于一种模式下,所以处理器在同一时间内只能见到本模式下的寄存器,最多有18个可见,最少有17个可见(User和System模式)●R13寄存器的别名为SP,是栈指针,各模式有私有的栈指针,则意味着各模式下的栈空间可以彼此独立。

通常由编译器和CPU来维护,使用前需初始化●R14寄存器的别名为LR,链接寄存器,用于自动保存返回地址。

特别需要注意的是:如果程序执行流程的改变不涉及模式的切换,则返回地址保存在当前模式下的LR寄存器中;如果程序执行流程的改变伴随着模式的切换,则返回地址保存在被切换后的模式下的LR寄存器中。

注意对LR寄存器的保护●R15的寄存器别名为PC,程序计数器,用于指示被取指令的地址,通常由CPU自动维护,也可以通过程序手动修改●CPSR寄存器,用于反映当前的程序状态,如处理器所处的模式,处理器所处的状态,中断是否被屏蔽,数据运算的结果是否发生了借位、进位,结果是否为0,结果是否为负,是否发生溢出等●SPSR寄存器,定义同CPSR寄存器。

在模式发生切换后用于保存模式切换前的模式下的CPSR寄存器,如果要切换回以前的模式,则可用切换后所在模式的SPSR去恢复切换前模式的CPSR,需要由特殊的指令来实现8.ARM指令特点●定长32 bit●大部分为单周期指令●大部分指令可条件执行,即在常规指令后跟上执行条件●采用Load/Store架构,典型的限制是不能在存储器和存储器间直接拷贝,必须通过寄存器中转9.ARM处理器核●流水线使得指令流可并行处理,提高效率●PC指向正被取指的指令,而非正在执行的指令●Cache因为存取速度高于内存,用于缓存指令和数据,提高执行速度●Write Buffer用于暂存向内存写入的数据●MMU用于程序的保护和实现虚拟内存●CP15协处理器用于控制Cache、Write Buffer和MMU等10.SoC的概念:片上系统,将CPU核同其他外围接口电路(如串口,LCD控制器等)集成在一片芯片上二、ARM指令集1.条件码CMP r3, #0 CMP r3, #0BEQ Skip ADDNE r0,r1,r2ADD r0,r1,r2Skip: Skip:合理使用条件码,可以提高代码密度,减少分支跳转指令的数目(避免清空流水线),提高了性能2.后缀S的作用:刷新CPSR寄存器中的条件码标志位,使得后续的指令可以根据带S指令的执行结果来判断本条指令是否要执行。

比较指令不用加S后缀3.分支指令B/BLBL相对于B指令,CPU会自动将返回地址保存在LR寄存器当中,从分支返回可以用LR寄存器的值恢复PC,从而完成调用的返回。

两条指令用24 bit 来存放偏移量,对于ARM指令集来说,每条指令4个字节长,则指令按照4字节对齐,那么指令地址的最低两位比特始终为0,在跳转指令中并未表示最低的两位,所以真正的偏移量是26 bit。

其中1 bit用来表示符号,所以跳转的范围为+/‐2^25 = +/‐32M。

如要实现长跳转,则可多次跳转,也可以将跳转的目的地址先保存到存储器中,然后将该地址从存储器中取出,赋给PC 4.数据处理指令Cond:指令的条件码。

Opcode:指令操作码。

S:操作是否影响cpsr,S=0不影响,S=1影响。

Rn:包含第一个操作数的寄存器编码。

Rd:目标寄存器编码。

Operand2:第2操作数、RmI:用于区别Operand2是立即数(I=1),还是寄存器移位(I=0)Shift amount:移位数Shift:移位方式关于比较指令的助记如下,但是比较指令不会保存结果,只影响标志CMP<‐>SUBSCMN<‐>ADDSTST<‐>ANDSTEQ<‐>EORS注意,MVN指令是取反传送指令,并非取负数传送指令减法指令对C标志的影响是反的,不过这由CPU自动处理移位操作LSL: x << yLSR: (unsigned)x >> yASR: (signed)x >> yRORRRX合法立即数:立即数保存在指令中,一条ARM指令是32 bit,所以不能存放一个32 bit的立即数,在一条指令中只有12 bit来表示立即数,但是并未将立即数就此限定在0~4095,而是用8 bit来表示一个数,另外4 bit来表示对这8 bit数的移位,最终的移位结果就是要表示的立即数。

显然这种方式也不能表示完32 bit 的立即数,只是相对于前一种方式,将不同的数分散在数轴上,而不是集中在一小段范围。

故而,有些立即数能被正确表示,而有的则不能被表示。

判断一个数是否是合法的立即数,或者说能否在指令中被正确表示的方法是:将数写成2进制,通过循环移位的方式,将为1的位尽量靠在一起,放在低8位,然后查看为1的比特位数跨度是否不大于8,如果是,再进一步判断移位的次数是否为偶数次,如果是则表明该数是一个合法的立即数,反之则不是。

对于非法立即数,使用LDR伪指令,编译器会自动处理。

5.单据传送指令LDR STR WordLDRB STRB ByteLDRH STRH HalfwordLDRSB 带符号的byte loadLDRSH 带符号的halfword load指令中的S表示符号扩展,如将0xFF扩展为0xFFFFFFFF6.块数据传送指令LDM STM WordIA: I ncrement A fter (先操作,后增加)IB: I ncrement B efore (先增加,后操作)DA: D ecrement A fter (先操作,后递减)DB: D ecrement B efore (先递减,后操作)寄存器传送顺序是固定的,不能被改变最小数字的寄存器总是被对应到存储器的最低地址上STM FD (Push) 块存储‐ Full Descending stack [STMDB]LDM FD (Pop) 块装载‐ Full Descending stack [LDMIA]7.信号量操作指令SWP{<cond>}{B} Rd, Rm, [Rn]一次存储器读和一次存储器写组成的原子操作,适用于信号量操作Rd和Rm可以是同一寄存器,这样可以完成寄存器和存储单元的原子数据交换不能由C编译器产生,只能由汇编语言来编写8.软中断指令SWI{<cond>} <SWI number>关键在于软中断号的获取和参数的传递常用作于系统调用的实现9.状态寄存器访问指令MRS{<cond>} Rd,<psr> ; Rd = <psr>MSR{<cond>} <psr[_fields]>,Rm ; <psr[_fields]>对状态寄存器的访问只能使用这两条指令状态寄存器被划分为4个域,分别是控制域(c),扩展域(x),状态域(s)和标志位域(f)对于MSR指令,可直接将一立即数写入状态寄存器在用户模式下对所有域可读,但只对标志位域可写,实现特权级和非特权级的关键。

这也意味着用户模式下不能修改处理器模式,不能使能或屏蔽中断10.协处理器指令MRC:从协处理器寄存器移到ARM 寄存器MCR:从 ARM 寄存器移到协处理器寄存器。

相关主题