主讲:郑超ARMARMARMARM汇编基础汇编基础汇编基础汇编基础ARMARMARMARM简介ARM是AdvancedRISCMachines的缩写,更早称作:AcornRISCMachine),ARM架构,过去称作高级精简指令集机器,是一个32位精简指令集(RISC)处理器架构,其广泛地使用在许多嵌入式系统设计。由于节能的特点,ARM处理器非常适用于移动通信领域,符合其主要设计目标为低成本、高性能、低耗电的特性。公司的特点是只设计芯片,而不生产。它将技术授权给世界上许多著名的半导体、软件和OEM(代工生产)厂商,并提供服务。为了清楚地表达每个ARM应用实例使用的指令集,ARM公司定义了7种主要的ARM指令集体系结构版本,以版本号V1~V7表示。目前正在使用的版本是V4、V5、和V6、V7。ARMCPU主要有ARM7、ARM9、ARM10、ARM11系列,以及其变种:SecurCore、Xscale等。主讲:应用领域:•工业控制领域•无线通讯领域•网络应用•消费类电子产品•成像和安全产品主讲:处理器模式简介:•ARM体系结构支持7种处理器模式,分别为:用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式,如下表所示。这样的好处是可以更好的支持操作系统并提高工作效率。ARM完全支持这七种模式。主讲:处理器模式主讲:处理器模式说明备注用户(usr)正常程序工作模式不能直接切换到其它模式系统(sys)用于支持操作系统的特权任务等与用户模式类似,但具有可以直接切换到其它模式等特权快中断(fiq)支持高速数据传输及通道处理FIQ异常响应时进入此模式中断(irq)用于通用中断处理IRQ异常响应时进入此模式管理(svc)操作系统保护代码系统复位和软件中断响应时进入此模式中止(abt)用于支持虚拟内存和/或存储器保护用于MMU未定义(und)支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式处理器模式�用户模式:限制你的内存访问并且你不能直接读取硬件设备�系统模式(SVC模式):主要用于SWI(软件中断)和OS(操作系统)。这个模式有额外的特权,允许你进一步控制计算机。例如,你必须进入超级用户模式来读取一个插件(podule)。这不能在用户模式下完成。�中断模式(IRQ模式),用来处理发起中断的外设。这个模式也是有特权的。导致IRQ的设备有键盘、VSync(在发生屏幕刷新的时候)、IOC定时器、串行口、硬盘、软盘、等等...�快速中断模式(FIQ模式),用来处理发起快速中断的外设。这个模式是有特权的。导致FIQ的设备有处理数据的软盘,串行端口(比如在82C71x机器上的A5000)和Econet。�IRQ和FIQ之间的区别是对于FIQ你必须尽快处理你事情并离开这个模式。IRQ可以被FIQ所中断但IRQ不能中断FIQ。为了使FIQ更快,所以有更多的影子寄存器。FIQ不能调用SWI。FIQ还必须禁用中断。如果一个FIQ例程必须重新启用中断,则它太慢了并应该是IRQ而不是FIQ。主讲:内部寄存器简介•在ARM处理器内部有37个用户可见的寄存器。31个通用的,6个状态寄存器。•在不同的工作模式和处理器状态下,程序员可以访问的寄存器也不尽相同。主讲:主讲:寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15状态寄存器CPSRCPSRSPSR无SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq内部寄存器寄存器R0~R12是普通寄存器。R13是堆栈指针寄存器(又名SP,stackpointer),用于存放堆栈的栈顶指针。R14是链接寄存器(又名LR,LinkedRegister),用于存放子程序的返回地址。R15程序计数器(又名PC,ProgramCounter),它的值是当前正在执行的指令在内存中的位置。主讲:读R15R15R15R15的限制�当使用STR或STM指令保存R15时,会有一个例外。这些指令可能将当前指令地址加8字节或加12字节保存(将来可能还有其它数字)。偏移量是8还是12取决于具体的ARM芯片,但是对于一个确定的芯片,这个值是一个常量。�所以最好避免使用STR和STM指令来保存R15,如果很难做到,那么应当在程序中计算出该芯片的偏移量。�计算偏移量程序代码:正常操作时,写入R15的值被当作一个指令地址,程序从这个地址处继续执行(相当于执行一次无条件跳转)。主讲:SUBR1,PC,#4;R1=下面STR指令的地址STRPC,[R0];保存STR指令地址+偏移量LDRR0,[R0];然后重装SUBR0,R0,R1;计算偏移量程序状态寄存器简介:主讲:NZCVQ—IM0M1M2M3M4TF—...313029282726876543210条件代码标志保留控制位置1时结果溢出加法时置1表示进位,减法时置0表示借位置1时结果为零置0时结果为正数数或零置1时IRQ禁止置1时FIQ禁止置0时ARM状态下运行模式位NZCVIM0M1M2M3M4TFCPSR寄存器的格式Q:在ARM V5及以上版本的E系列处理器中,用Q标志位指示增强的DSP运算指令是否发生了溢出。主讲:CPSRCPSRCPSRCPSR模式位设置表模式位设置表模式位设置表模式位设置表主讲:M[4:0]模式可见的Thumb状态寄存器可见的ARM状态寄存器10000用户R0~R7,SP,LR,PC,CPSRR0~R14,PC,CPSR10001快中断R0~R7,SP_fiq,LR_fiq,PC,CPSR,SPSR_fiqR0~R7,R8_fiq~R14_fiq,PC,CPSR,SPSR_fiq10010中断R0~R7,SP_irq,LR_irq,PC,CPSR,SPSR_fiqR0~R12,R13_irq,R14_irq,PC,CPSR,SPSR_irq10011管理R0~R7,SP_svc,LR_svc,PC,CPSR,SPSR_svcR0~R12,R13_svc,R14_svc,PC,CPSR,SPSR_svc10111中止R0~R7,SP_abt,LR_abt,PC,CPSR,SPSR_abtR0~R12,R13_abt,R14_abt,PC,CPSR,SPSR_abt11011未定义R0~R7,SP_und,LR_und,PC,CPSR,SPSR_undR0~R12,R13_und,R14_und,PC,CPSR,SPSR_und11111系统R0~R7,SP,LR,PC,CPSRR0~R14,PC,CPSRSPSRSPSRSPSRSPSR(保存程序状态寄存器)与CPSR的值一样,由硬件自动将异常发生前的CPSR的值放到SPSR中,以便将来在异常处理结束后,程序能恢复原来CPSR的值。主讲:流水线�ARM处理器使用流水线来增加处理器指令流的速度。这样可使几个操作同时进行,并使处理和存储器系统连续操作,能提供0.9MIPS/MHz(MIPS表示每秒多少百万条指令)的指令执行速度。�ARM的流水线分3级,分别为:取指�译码�执行�ARM7是冯·诺依曼结构,采用了典型的三级流水线,而ARM9则是哈佛结构,采用五级流水线技术,而ARM11则更是使用了7级流水线。主讲:三级流水线的最佳运行图�PC总是指向第3条指令。�对于ARM状态下指令,PC值=当前程序执行位置+8是。�虽然存在多级别流水线,但ARM出于统一和前后兼容的考虑,但上诉结论是统一的。主讲:ARMARMARMARM处理器寻址方式寻址方式分类•寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM处理器基本寻址方式。•1.寄存器寻址;•2.立即数寻址;•3.寄存器移位寻址;•4.寄存器间接寻址;•5.基址寻址;•6.堆栈寻址;•7.块拷贝寻址;•8.相对寻址。主讲:ARMARMARMARM处理器寻址方式寻址方式分类——寄存器寻址•操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。寄存器寻址指令举例如下:•MOVR1,R2;将R2的值存入R1•SUBR0,R1,R2;将R1的值减去R2的值,结果保存到R0主讲:ARMARMARMARM处理器寻址方式寻址方式分类——立即数寻址•立即寻址指令中的操作码字段后面的地址码部分即是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(这样的数称为立即数)。立即寻址指令举例如下:•SUBSR0,R0,#1;R0减1,结果放入R0,并且影响标志位•MOVR0,#0xFF000;将立即数0xFF000装入R0寄存器主讲:ARMARMARMARM处理器寻址方式寻址方式分类——寄存器移位寻址•寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。寄存器移位寻址指令举例如下:•MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,;即是R0=R2×8•ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相;“与”操作,结果放入R1主讲:ARMARMARMARM处理器寻址方式寻址方式分类——寄存器移位寻址主讲:LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:CARMARMARMARM处理器寻址方式寻址方式分类——寄存器移位寻址•LLLLSLSLSLSL或ASL(logicshiftleft)ASL(logicshiftleft)ASL(logicshiftleft)ASL(logicshiftleft):逻辑左移或算术左移•可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充•LLLLSR(logicshiftright)SR(logicshiftright)SR(logicshiftright)SR(logicshiftright):逻辑右移•可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。•AAAASR(arithmeticshiftright)SR(arithmeticshiftright)SR(arithmeticshiftright)SR(arithmeticshiftright):算术右移•可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第31位的值来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。•RRRROROROROR(rotateshiftrightrotateshiftrightrotateshiftrightrotateshiftright):循环右移•可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。显然,当进行32位的循环右移操作时,通用寄存器中的值不改变。•RRRRRX(rotateshiftrightwithextend)RX(rotateshiftrightwithextend)RX(rotateshiftrightwithextend)RX(rotateshiftrightwithextend):带扩展的循环右移。•可完