您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > (第3章 ARM寻址方式与指令系统) 11 12节
六、bootloader外部中断非向量中断响应过程六、bootloader中断向量表0x00000018六、bootloaderIsrIRQ中断服务器程序IsrIRQsubsp,sp,#4;保留PCstmfdsp!,{r8-r9};将r8,r9入栈ldrr9,=I_ISPR;中断寄存器地址=r9ldrr9,[r9];读出中断寄存器I_ISPR的值,存入R9中movr8,#0x00;局部标号movsr9,r9,lsr#1;LSR逻辑右移bcs%F1;%F向前搜索局部标号判断是否把置位Caddr8,r8,#4;根据I_ISPR的值b%B0;判断该中断在普通中断向量表中的偏移量,存入R8;%B向后搜索局部标号1;局部标号ldrr9,=HandleADC;HandleADC为普通中断向量表的起始地址,addr9,r9,r8;起始地址+偏移地址=实际的中断向量地址ldrr9,[r9];取出中断向量的值,即服务程序的地址strr9,[sp,#8]ldmfdsp!,{r8-r9,pc};跳转到普通中断服务程序,开始执行六、bootloader普通中断向量分配空间•外部中断包括的26种普通中断的向量空间分配HandleADC#4HandleRTC#4HandleUTXD1#4HandleUTXD0#4......HandleEINT3#4HandleEINT2#4HandleEINT1#4HandleEINT0#4;3.2指令格式一、ARM汇编语言组成1、汇编语言指令组成•机器指令:ARM指令和Thumb指令;•伪指令:•宏指令:2、指令含义•机器指令:能够被处理器直接执行的指令•伪指令:源程序汇编期间,由汇编程序执行的指令(定义段,定义变量等)•宏指令:是一段独立的程序代码,汇编时用宏体替代宏指令3.2指令格式二、编码格式1、ARM汇编指令格式(助记符格式)•ARM汇编指令:ADDEQSR0,R1,R2;•该指令的编码格式为:31~2827~2524~212019~1615~1211~~~~~~~~~~0condopcodeSRnRdop2000000101001000100000000000000103.2指令格式二、编码格式opcode{cond}{S}Rd,Rn,op2其中:是必选项{}是可选项opcode操作码,如ADD表示算术加操作指令;{cond}决定指令执行的条件域;{S}决定指令执行是否影响CPSR寄存器的值;Rd目的寄存器;Rn第一个操作数,为寄存器;op2第二个操作数。2、例如指令ADDEQSR1,R2,#5二、编码格式3、条件域cond•几乎所有的ARM指令都可以根据当前程序状态寄存器CPSR中标志位的值,有条件地执行。•ARM指令的条件域cond有16种类型。二、编码格式3、条件域cond二、编码格式3、条件域cond三、寻址方式9种:•立即数寻址•寄存器寻址•寄存器移位寻址•寄存器间接寻址•基址变址寻址•相对寻址•多寄存器寻址•块拷贝寻址•堆栈寻址三、寻址方式1、立即数寻址•在立即数寻址中,操作数包含在指令中。称此种操作数为立即数。•#后接0x或&表示十六进制数或0b表示二进制数或0d或缺省表示十进制数=〉表示立即数。•例:ADDR0,R1,#5;R0=R1+5MOVR0,#0x55;R0=0x55•其中:操作数5,0x55就是立即数,立即数在指令中要以“#”为前缀,后面跟实际数值。三、寻址方式2、寄存器寻址•所有操作数都为寄存器•例:ADDR0,R1,R2;R0=R1+R2MOVR0,R1;R0=R1三、寻址方式3、寄存器移位寻址•操作数由寄存器的数值做相应移位而得到。•移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。•例:ADDR0,R1,R2,ROR#5;R0=R1+R2循环右移5位MOVR0,R1,LSLR3;R0=R1逻辑左移R3位•移位操作在ARM指令集中不作为单独的指令使用,ARM指令集共有5种位移操作。ARM指令集的5种位移操作•LSL逻辑左移:Rx,LSLop1•LSR逻辑右移:Rx,LSRop1•ASR算术右移:Rx,ASRop1•ROR循环右移:Rx,RORop1•RRX带扩展的循环右移:Rx,RRX31003100310310C310三、寻址方式4、寄存器间接寻址•寄存器中的值为操作数的物理地址,而实际的操作数存放在此地址存储器中。•例:STRR0,[R1];[R1]=R0LDRR0,[R1];R0=[R1]三、寻址方式5、基址变址寻址•将寄存器(称为基址寄存器)的值与指令中给出的偏移地址量相加,所得结果作为操作数的物理地址。•例:LDRR0,[R1,#5];R0=[R1+5]LDRR0,[R1,R2];R0=[R1+R2]三、寻址方式6、相对寻址•相对寻址同基址变址寻址相似,区别只是将程序计数器PC作为基址寄存器,指令中的标记作为地址偏移量。•例:BEQprocess1……process1……三、寻址方式7、多寄存器寻址•在多寄存器寻址方式中,一条指令可实现一组寄存器值的传送。•连续的寄存器间用“-”连接,否则用“,”分隔。•例:LDMIAR0,{R1-R5};R1=[R0];R2=[R0+4];R3=[R0+8];R4=[R0+12];R5=[R0+16]•指令中IA表示在执行完一次Load操作后,R0自增4。该指令将以R0为起始地址的5个字数据分别装入R1,R2,R3,R4,R5中。三、寻址方式8、块拷贝寻址•块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。•例:LDRR0,=0x40003000LDRR1,=0x40003200LDMIAR0,{R2-R6};STMIAR1,{R2-R6};•第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。•实际上是多寄存器寻址的组合。三、寻址方式9、堆栈寻址•堆栈:按照“后进先出”(“先进后出”)的原则进行数据存储的特定区域。•使用专门的寄存器(堆栈指针SP(R13))指向堆栈栈顶。•堆栈种类:向上增长:数据进栈,堆栈指针递增.向下增长:数据进栈,堆栈指针递减.•满堆栈:堆栈指针指向最后压入堆栈的有效数据。•空堆栈:堆栈指针指向下一个要压入数据的地址。三、寻址方式9、堆栈寻址•满递增FA:数据进栈,地址向上增长,堆栈指针指向含有有效数据的最高地址.•满递减FD:数据进栈,地址向下递减,堆栈指针指向含有有效数据的最低地址.•空递增EA:数据进栈,地址向上增长,堆栈指针指向含有有效数据的最高地址的下一个字地址(空地址).•空递减ED:数据进栈,地址向下增长,堆栈指针指向含有有效数据的最地地址的下一个字地址(空地址).三、寻址方式9、堆栈寻址•堆栈寻址用于数据栈与寄存器组之间批量数据传输。•当数据写入和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这问题。•例:STMFDR13!,{R0,R1,R2,R3,R4};LDMFDR13!,{R0,R1,R2,R3,R4}•第一条指令,将R0-R4中的数据压入堆栈,R13为堆栈指针;•第二条指令,将数据出栈,恢复R0-R4原先的值。3.3ARM指令集6种类型(53种主要助记符):•数据处理指令(22种主要助记符)•跳转指令(4种主要助记符)•Load/Store指令(16种主要助记符)•程序状态寄存器指令(2种主要助记符)•协处理器指令(5种主要助记符)•软件中断指令(2种主要助记符)一、数据处理指令1.MOV数据传送指令•格式:MOV{cond}{S}Rd,op1;•功能:Rd=op1•op1可以是寄存器、被移位的寄存器或立即数。•例如:•MOVR0,#5;R0=5•MOVR0,R1;R0=R1•MOVR0,R1,LSL#5;R0=R1左移5位一、数据处理指令2.MVN数据取反传送指令•格式:MVN{cond}{S}Rd,op1;•功能:将op1表示的值传送到目的寄存器Rd中,但该值在传送前被按位取反,Rd=!op1;•op1可以是寄存器、被移位的寄存器或立即数。•例如:•MVNR0,#0;R0=0xFFFFFFFF一、数据处理指令3.ADD加法指令•格式:ADD{cond}{S}Rd,Rn,op2;•功能:Rd=Rn+op2•op2可以是寄存器,被移位的寄存器或立即数。•例如:•ADDR0,R1,#5;R0=R1+5•ADDR0,R1,R2;R0=R1+R2•ADDR0,R1,R2,LSL#5;R0=R1+R2左移5位一、数据处理指令4.ADC带进位加法指令•格式:ADC{cond}{S}Rd,Rn,op2;•功能:Rd=Rn+op2+carry•op2可以是寄存器、被移位的寄存器或立即数;carry为进位标志值。该指令用于实现超过32位的数的加法。•例如:•第一个64位操作数存放在(R3,R2)中;•第二个64位操作数存放在(R5,R4)中;•64位结果存放在(R1,R0)中。•64位的加法可由以下语句实现:•ADDSR0,R2,R4;低32位相加,S表示结果影响条件标志位的值•ADCR1,R3,R5;高32位相加一、数据处理指令5.SUB减法指令•格式:SUB{cond}{S}Rd,Rn,op2;•功能:Rd=Rn-op2•op2可以是寄存器、被移位的寄存器或立即数。•例如:•SUBR0,R1,#5;R0=R1-5•SUBR0,R1,R2;R0=R1-R2•SUBR0,R1,R2,LSL#5;R0=R1-R2左移5位一、数据处理指令6.RSB反向减法指令•格式:RSB{cond}{S}Rd,Rn,op2;•功能:同SUB指令,但倒换了两操作数的前后位置,即Rd=op2-Rn。•例如:•RSBR0,R1,#5;R0=5-R1•RSBR0,R1,R2;R0=R2-R1•RSBR0,R1,R2,LSL#5;R0=R2左移5位-R1一、数据处理指令7.SBC带借位减法指令•格式:SBC{cond}{S}Rd,Rn,op2;•功能:Rd=Rn-op2-!carry•解释op2可以是寄存器、被移位的寄存器或立即数。SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。•应用:超过32位的减法运算•例如:两个64位数相减第一个64位操作数存放在(R3,R2)中;第二个64位操作数存放在(R5,R4)中;64位结果存放在(R1,R0)中。64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:程序SUBSR0,R2,R4;低32位相减,S表示结果影响条件标志位的值SBCR1,R3,R5;高32位相减一、数据处理指令8.RSC带借位的反向减法指令•格式:RSC{cond}{S}Rd,Rn,op2;•功能:同SBC指令,但倒换了两操作数的前后位置,即Rd=op2-Rn-!carry。•例如:•前提条件与SBC例子相同,操作数1-操作数2的实现语句需改为:•SUBSR0,R2,R4;低32位相减,S表示结果影响寄存器CPSR的值•RSCR1,R5,R3;高32位相减一、数据处理指令9.MUL32位乘法指令•格式:MUL{cond}{S}Rd,Rn,op2;•功能:Rd=Rn×op2•该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。Rn和op2的值为32位的有符号数或无符号数。•例如:•MULSR0,R1,R2;R0=R1×R2,结果影响寄存器CPSR的N,Z位一、数据处理指令10.MLA32位乘加指令•格式:MLA{cond}{S}Rd,Rn,op2,op3;•功能:Rd=Rn×op2+op3•op2和op3必须为寄存器。Rn、
本文标题:(第3章 ARM寻址方式与指令系统) 11 12节
链接地址:https://www.777doc.com/doc-23295 .html