版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARM的指令系统及汇编程序设计3指令系统简介寻址方式ARM指令集GNUARM汇编器支持的伪操作指令ARM汇编伪指令ARM汇编编程简介第3章ARM的指令系统及汇编程序设计3.1
指令系统简介
指令是规定处理器进行某种操作的命令,处理器能够执行的各种指令的集合称为指令系统。3.1.1
ARM指令分类1、ARM指令集ARM指令集主要包括数据处理和杂项指令、分支指令、存储器访问指令、程序状态寄存器处理指令、协处理器指令和异常中断指令六大类。所有ARM指令均为32位长度,指令以字对齐方式保存在存储器中。2、Thumb指令集
当处理器工作在Thumb状态时,执行Thumb指令集。所有的Thumb指令都是16位长度,指令以半字对齐方式保存在存储器中。第3章ARM的指令系统及汇编程序设计表3.1ARM指令的典型编码格式3.1.2
ARM指令的编码格式各部分编码含义如下:
cond:指令执行的条件码;opcode:指令操作符的编码;S:决定指令的执行是否影响CPSR(当前程序状态寄存器)的值;Rn:包含第一个源操作数的寄存器编码;第3章ARM的指令系统及汇编程序设计第3章ARM的指令系统及汇编程序设计3.1.3ARM指令的条件码域表3.2指令的条件码第3章ARM的指令系统及汇编程序设计
当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件地执行,如表3.2所示。当指令的执行条件满足时,指令被执行,否则指令被忽略,继续执行下一条指令。第3章ARM的指令系统及汇编程序设计3.2
寻址方式1.立即数寻址立即数寻址指令中,操作码字段后面的地址部分即操作数本身。SUBSR0,R0,#1;R0←R0–1,并且影响标志位ADDR0,R0,#0x3f;R0←R0+0x3f第3章ARM的指令系统及汇编程序设计2.寄存器寻址寄存器寻址就是利用寄存器中的数值作为操作数。ADDR0,R1,R2;R0←R1 + R2该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。第3章ARM的指令系统及汇编程序设计3.寄存器移位寻址寄存器移位寻址是ARM指令集特有的寻址方式。当第二个操作数是寄存器方式时,第二个寄存器操作数在与第一个操作数结合之前,先进行移位操作。MOVR0,R2,LSL#3 ;R2的值左移3位,结果放入R0ANDSR1,R1,R2,LSLR3;R2的值左移R3位,然后和R1相“与”,结果放入R1中第3章ARM的指令系统及汇编程序设计4.寄存器间接寻址寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。LDRR1,[R2];将R2指向的存储单元的数据读出,保存在R1中SWPR1,R1,[R2];将寄存器R1的值和R2指定的存储单元的内容交换第3章ARM的指令系统及汇编程序设计5.基址变址寻址基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。LDRR0,[R1,#4];将寄存器R1的内容加上4形成操作数的有效地址,从该地
址取得操作数存入寄存器R0中。LDRR0,[R1,R2];将寄存器R1的内容加上寄存器R2的内容,形成操作数的有效地址,从该地址取得操作数存入寄存器R0中。LDRR0,[R1],#4;寄存器R1的内容作为操作数的有效地址,从该地址取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。第3章ARM的指令系统及汇编程序设计6.多寄存器寻址该指令可以一次完成多个寄存器值的传送,这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。LDMIAR0,{R1,R2,R3,R4};R1←[R0],R2←[R0 + 4],R3←[R0 + 8],R4←[R0 + 12]第3章ARM的指令系统及汇编程序设计7.相对寻址相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到的操作数作为有效地址。8.堆栈寻址使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。第3章ARM的指令系统及汇编程序设计3.3
ARM指令集3.3.1
移位操作指令
移位操作包括LSL(逻辑左移)、ASL(算术左移)、LSR(逻辑右移)、ASR(算术右移)、ROR(循环右移)和RRX(带扩展的循环右移)6种类型。1.LSL(或ASL)LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)左移的操作。MOVR0,R1,LSL#2;将R1中的内容左移两位后传送到R0中。第3章ARM的指令系统及汇编程序设计2. LSRLSR可完成对通用寄存器中的内容进行逻辑右移的操作,按操作数所指定的数量向右移位,左端用零来填充。MOVR0,R1,LSR#2;将R1中的内容右移两位后传送到R0中,左端用零来填充。3. ASRASR可完成对通用寄存器中的内容进行算术右移的操作,按操作数所指定的数量向右移位,左端用位31的值来填充。MOVR0,R1,ASR#2;将R1中的内容右移两位后传送到R0中,左端用位31的值来填充第3章ARM的指令系统及汇编程序设计4. RORROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。MOVR0,R1,ROR#2;将R1中的内容循环右移两位后传送到R0中。5. RRXRRX可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位C来填充。MOVR0,R1,RRX#2;将R1中的内容进行带扩展的循环右移两位后传送到R0中。第3章ARM的指令系统及汇编程序设计3.3.2数据处理指令
数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令:
1)MOVMOVR1,R0;
将寄存器R0的值传送到寄存器R1中MOVPC,R14;
将寄存器R14的值传送到PC中,常用于子程序返回
第3章ARM的指令系统及汇编程序设计数据传送指令:
2)MOVN
与MOV不同的是在传送之前,将操作数按位取反,再进行传送。
MVNR0,#0;
将立即数0取反传送到寄存器R0中,完成后R0=-1
第3章ARM的指令系统及汇编程序设计算术逻辑运算指令:
1)AND
将两个操作数进行逻辑与操作,常用于屏蔽操作数1的某些位。
ANDR0,R0,#3(#00000011);指令保持R0的0、1位,其余位清零
2)ORR
将两个操作数进行逻辑或运算,常用于设置操作数1的某些位。ORRR0,R0,#3(#00000011);该指令设置R0的0、1位,其余位保持不变第3章ARM的指令系统及汇编程序设计算术逻辑运算指令:
3)EOR
将两个操作数进行异或操作,常用于反转操作数1的某些位。
EORR0,R0,#3(#00000011);
该指令反转R0的0、1位,其余位不变
4)ADD
将两个操作数进行算术相加运算。 ADDR0,R1,R2;该指令将寄存器R1的内容与R2的内容相加,结果放在寄存器R0里面第3章ARM的指令系统及汇编程序设计算术逻辑运算指令:
5)ADC
与ADD的区别是除了两个操作数进行相加外,还包括CPSR中的C标志位。
ADDSR0,R4,R8;
加低端的字
ADCSR1,R5,R9;
加第二个字,带进位
ADCSR2,R6,R10;
加第三个字,带进位 ADCR3,R7,R11;
加第四个字,带进位
上面四行指令的作用是实现两个128位数的加法运算。第3章ARM的指令系统及汇编程序设计算术逻辑运算指令:
6)SUB
将两个操作数进行相减操作。
SUBR0,R2,R3,LSL#1;
将R3寄存器的内容左移一位后的结果与R3相减
7)SBC
与SUB的区别是还要减去C标志位的反码。 SBCR0,R1,R2; R0=R1-R2-!C,并根据结果设置CPSR的进位标志位第3章ARM的指令系统及汇编程序设计算术逻辑运算指令:
8)RSB
与SUB的区别是:减数与被减数的位置颠倒一下。
RSBR0,R1,R2;
R0=R2–R1
9)RSC
与RSB的区别是:除了两个数相减外,还要减去C标志位的反码。
RSCR0,R1,R2;
R0=R2–R1-!C第3章ARM的指令系统及汇编程序设计算术逻辑运算指令:
10)TST
将操作数1和操作数2按位与运算之后,再更新GPSR中的条件标志位。一般用来检测是否设置了特定的位
TSTR1,#0xffee;
将寄存器R1的值与0xffe按位与,并根据结果设置CPSR的标志位
11)TEQ
将操作数1和操作数2按位异或运算之后,再更新GPSR中的条件标志位。一般用来检测操作数1和操作数2是否相等 TEQR1,R2;
检查两个操作数是否相等第3章ARM的指令系统及汇编程序设计比较指令:
1)CMP
将两个操作数进行比较,同时更新CPSR中的标志位。
CMPR1,R0 ;
将寄存器R1的值与寄存器R0的值相减,并根据结果设置CPSR的标志位
2)CMN
操作数1和取反后的操作数2进行比较,再更新CPSR中的标志位。 CMNR1,R0 ;
将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位第3章ARM的指令系统及汇编程序设计比较指令:
3)BIC
操作数2是32位的掩码,如果在掩码中设置了某一位,则相应的在操作数1中清除对应的那一位。
BICR0,R0,#%1011;该指令清除R0中的位0、1和3,其余的位保持不变
第3章ARM的指令系统及汇编程序设计3.3.3乘法指令与乘加指令
指令中的寄存器必须是通用寄存器,不能是立即数。乘法指令:
1)MUL
操作数1和操作数2进行相乘运算。
MULR0,R1,R2;R0=R1×R2
第3章ARM的指令系统及汇编程序设计乘法指令:
2)SMULL
完成操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中。
SMULLR0,R1,R2,R3;R0=(R2×R3)的低32位,R1=(R2×R3)的高32位
3)UMLAL
与SMULL的区别是操作数1和2均为无符号整数。
UMULLR0,R1,R2,R3;R0 = (R2 × R3)的低32位,R1 = (R2 × R3)的高32位第3章ARM的指令系统及汇编程序设计乘加指令:
1)MLA
完成操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中。
MLAR0,R1,R2,R3;
R0=R1×R2+R3
2)SMLAL
与SMULL的区别是将SMULL得到的结果低32位同目的寄存器的低32位相加放到目的寄存器low中,高32位是类似的。
SMLALR0,R1,R2,R3;R0 = (R2 × R3)的低32位 + R0,R1 = (R2 × R3)的高32位 + R1第3章ARM的指令系统及汇编程序设计乘加指令:
3)UMLAL
与SMLAL的区别是操作数1和2均为无符号的32位整数。
UMLALR0,R1,R2,R3;
R0 = (R2 × R3)的低32位 + R0,R1=(R2 × R3)的高32位 + R1第3章ARM的指令系统及汇编程序设计3.3.4加载/存储指令
加载/存储指令用于寄存器和存储器之间的数据传送。加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。加载指令:
1)LDR
从存储器中将一个32位的字数据传送到目的寄存器中。
LDRR0,[R1,R2];
将存储器地址为R1 + R2的字数据读入寄存器R0 LDRR0,[R1],R2;
将存储器地址为R1的字数据读入寄存器R0,并将新地址R1 + R2写入R1第3章ARM的指令系统及汇编程序设计加载指令:
2)LDRH
从存储器中将一个16位的半字数据传送到目的寄存器中,将寄存器的高16位清零。
LDRHR0,[R1,#8];
将存储器地址为R1 + 8的半字数据读入寄存器R0,并将R0的高16位清零
3)LDRB
与LDRH的区别是传送的是8位字节数据,将寄存器的高24位清零。 LDRBR0,[R1];
将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零第3章ARM的指令系统及汇编程序设计存储指令:
1)STR
将源寄存器的32位数据传送到存储器上面。
STRR0,[R1,#8];
将R0中的字数据写入以R1 + 8为地址的存储器中
2)STRH
将源寄存器的低16位数据传送到存储器上面。 STRHR0,[R1,#8];
将寄存器R0中的半字数据写入以R1 + 8为地址的存储器中第3章ARM的指令系统及汇编程序设计存储指令:
3)STRB
将源寄存器的低8位数据传送到存储器上面。
STRBR0,[R1];
将寄存器R0中的字节数据写入以R1为地址的存储器中第3章ARM的指令系统及汇编程序设计3.3.5批量数据加载/存储指令
批量数据加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。批量数据加载指令为LDM,批量数据存储指令为STM。 LDM(或STM)指令的格式为: LDM(或STM){条件}{类型}基址寄存器{!},寄存器列表{^}注意:基址寄存器不能为R15!!!!!第3章ARM的指令系统及汇编程序设计{类型}有以下几种情况: IA—每次传送后地址加1; IB—每次传送前地址加1; DA—每次传送后地址减1; DB—每次传送前地址减1; FD—满递减堆栈; ED—空递减堆栈; FA—满递增堆栈; EA—空递增堆栈;第3章ARM的指令系统及汇编程序设计STMFD R13!,{R0,R4-R12,LR};
将寄存器列表中的寄存器(R0,R4到R12,LR)存入堆栈LDMFD R13!,{R0,R4-R12,LR} ;将堆栈内容恢复到寄存器(R0,R4到R12,LR)第3章ARM的指令系统及汇编程序设计3.3.6跳转指令
跳转指令用于实现程序流程的跳转。一般有两种方法实现程序的跳转:(1)使用专门的跳转指令。(2)直接向程序计数器PC写入跳转地址值。
1)B
处理器将立即跳转到给定的目标地址,从那里继续执行。
B Label; 程序无条件跳转到标号Label处执行 CMP R1,#0; BEQ Label; 当CPSR寄存器中的Z条件码置位,程序跳转到标号Label处执行第3章ARM的指令系统及汇编程序设计跳转指令:
2)BL
与B的区别是:在跳转之前会将当前PC的值保存在R14中。
BLLabel;当程序无条件跳转到标号Label处执行时,将当前的PC值保存到R14中
3)BLX
与BL的区别是ARM处理器的状态由ARM状态转换到Thumb状态。
第3章ARM的指令系统及汇编程序设计3.3.7程序状态寄存器访问指令 ARM微处理器支持程序状态寄存器访问指令,这些指令用于在程序状态寄存器和通用寄存器之间传送数据。程序状态寄存器访问指令包括MRS指令和MSR指令。第3章ARM的指令系统及汇编程序设计 1)MRS
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。
MRS指令的语法格式为:MRS{条件}通用寄存器,程序状态寄存器(CPSR或SPSR) MRS R0,CPSR;
传送CPSR的内容到R0 MRS R0,SPSR;
传送SPSR的内容到R0第3章ARM的指令系统及汇编程序设计 2)MSR
MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。
MSR指令的语法格式为:MSR{条件}程序状态寄存器(CPSR或SPSR)_<域>,操作数 MSR CPSR,R0;
传送R0的内容到CPSR MSR SPSR,R0;
传送R0的内容到SPSR MSR CPSR_c,R0;
传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域第3章ARM的指令系统及汇编程序设计3.3.8数据交换指令 ARM微处理器支持数据交换指令,这些指令用于在存储器和寄存器之间交换数据。数据交换指令包括SWP(字数据交换指令)和SWPB(字节数据交换指令)。与之相对应的程序状态寄存器访问指令,它用于的是在程序状态寄存器和通用寄存器之间的数据交换。第3章ARM的指令系统及汇编程序设计 1)SWP
SWP指令用于将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。
SWP指令的语法格式为
SWP{条件}目的寄存器,源寄存器1,[源寄存器2] SWPR0,R1,[R2]; 将R2所指向的存储器中的字数据传送到R0,同时将R1中的字数据传送到R2所指向的存储单元第3章ARM的指令系统及汇编程序设计 2)SWPB
SWPB指令用于将源寄存器2所指向的存储器中的字节数据传送到目的寄存器中,目的寄存器的高24位清零,同时将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中。
SWPB指令的语法格式为SWPB{条件}目的寄存器,源寄存器1,[源寄存器2] SWPB R0,R0,[R1]; 将R1所指向的存储器中的字节数据与R0中的低8位数据交换第3章ARM的指令系统及汇编程序设计3.3.9协处理器指令 ARM的协处理器指令主要用于ARM处理器初始化、ARM协处理器的数据处理操作、在ARM处理器的寄存器和协处理器的寄存器之间传送数据、在ARM协处理器的寄存器和存储器之间传送数据。ARM协处理器指令包括CDP、LDC、STC、和MRC。第3章ARM的指令系统及汇编程序设计 1)CDP
CDP指令用于ARM处理器通知ARM协处理器执行特定的操作。若协处理器不能成功完成特定的操作,则产生未定义指令异常。
CDP指令的语法格式为CDP{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2 CDP P3,2,C12,C10,C3,4;
完成协处理器P3的初始化第3章ARM的指令系统及汇编程序设计 2)LDC
LDC指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中。若协处理器不能成功完成传送操作,则产生未定义指令异常。
LDC指令的语法格式为LDC{条件}{L}协处理器编码,目的寄存器,[源寄存器]
LDC P3,C4,[R0];
将ARM处理器的寄存器R0所指向的存储器中的字数据传送到协处理器P3的寄存器C4中第3章ARM的指令系统及汇编程序设计 3)STC
STC指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中。若协处理器不能成功完成传送操作,则产生未定义指令异常。 STC指令的语法格式为STC{条件}{L}协处理器编码,源寄存器,[目的寄存器]
STC P3,C4,[R0];
将协处理器P3的寄存器C4中的字数据传送到ARM处理器的寄存器R0所指向的存储器中第3章ARM的指令系统及汇编程序设计 4)MCR
MCR指令用于将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。若协处理器不能成功完成操作,则产生未定义指令异常。 MCR指令的语法格式为MCR{条件}协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2
MCR P3,3,R0,C4,C5,6;
将ARM处理器的寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中第3章ARM的指令系统及汇编程序设计 5)MRC
MRC指令用于将协处理器寄存器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功完成操作,则产生未定义指令异常。 MRC指令的语法格式为MRC{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2
MRC P3,3,R0,C4,C5,6;
将协处理器P3的寄存器中的数据传送到ARM处理器的寄存器中第3章ARM的指令系统及汇编程序设计3.3.10异常产生指令 ARM微处理器支持的异常指令有SWI指令(软件中断指令)和BKPT指令(断点中断指令)。
1)SWI
SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。SWI指令的语法格式为: SWI{条件}24位的立即数 SWI 0x02;
调用操作系统编号为02的系统例程第3章ARM的指令系统及汇编程序设计 2)BKPT
BKPT指令产生软件断点中断,可用于程序的调试。 BKPT指令的语法格式为: BKPT16位的立即数
第3章ARM的指令系统及汇编程序设计3.4GNUARM汇编器支持的伪操作指令
在ARM汇编语言程序中,有一些特殊指令助记符,它们与指令系统的助记符有所不同,没有相应的操作码,通常称这些特殊指令助记符为伪操作标识符。在汇编程序中,伪操作指令主要有符号定义伪操作指令、数据定义伪操作指令、汇编控制伪操作指令及其杂项伪操作指令等。第3章ARM的指令系统及汇编程序设计符号定义伪操作指令:
1)GBLA、GBLL
和GBLS GBLA:用于定义一个全局的数字变量;
GBLL:用于定义一个全局的逻辑变量; GBLS:用于定义一个全局的字符串变量。第3章ARM的指令系统及汇编程序设计符号定义伪操作指令:
2)LCLA、LCLL和LCLS LCLA:用于定义一个ARM程序中的局部变量; LCLL:用于定义一个局部的逻辑变量; LCLS:用于定义一个局部的字符串变量。第3章ARM的指令系统及汇编程序设计符号定义伪操作指令:
3)SETA、SETL和SETS SETA:用于给一个已经定义的全局变量或局部变量赋值; SETL:用于给一个逻辑变量赋值; SETS:用于给一个字符串变量赋值。第3章ARM的指令系统及汇编程序设计符号定义伪操作指令:
4)RLIST
RLIST伪指令用于对一个通用寄存器列表定义名称。该伪指令定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序需根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。 RLIST伪指令的语法格式为
名称RLIST{寄存器列表}第3章ARM的指令系统及汇编程序设计符号定义伪操作指令:
GBLATest1;
定义一个全局的数字变量,变量名为Test1
Test1SETA0xaa;
将该变量赋值为0xaa
LCLLTest5;
声明一个局部的逻辑变量,变量名为Test5
Test4SETL{TRUE};
将该变量赋值为真
LCLATest3;
声明一个局部的数字变量,变量名为Test3
Test3SETA0xaa;
将该变量赋值为0xaa
RegListRLIST{R0-R5,R8,R10};
将寄存器列表定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
1)DCB
DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。
DCB伪指令的语法格式为:
标号DCB表达式 StrDCB"Thisisatest!";
分配一片连续的字节存储单元并初始化第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
2)DCW(DCWU)
DCW(DCWU)伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。
DCW伪指令的语法格式为:
标号DCW(DCWU)表达式 DataTestDCW1,2,3;
分配一片连续的半字存储单元并初始化第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
3)DCD(DCDU)
DCD(DCDU)伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。
DCD(DCDU)伪指令的语法格式为:
标号DCD(DCDU)表达式 DataTestDCD4,5,6;
分配一片连续的字存储单元并初始化第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
4)DCFD(DCFDU)
DCFD(DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。
DCFD(DCFDU)伪指令的语法格式为:
标号DCFD(或DCFDU)表达式 FDataTestDCFD2E115,-5E7;
分配一片连续的字存储单元并初始化为指定的双精度数第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
5)DCFS(DCFSU)
DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。
DCFS(DCFSU)伪指令的语法格式为:
标号DCFS(或DCFSU)表达式 FDataTestDCFS2E5,-5E-7;
分配一片连续的字存储单元并初始化为指定的单精度数第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
6)DCQ(DCQU)
DCQ(DCQU)伪指令用于分配一片以8个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。
DCQ(DCQU)伪指令的语法格式为:
标号DCQ(DCQU)表达式 DataTestDCQ100;
分配一片连续的存储单元并初始化为指定的值第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
7)SPACE
SPACE伪指令用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。SPACE也可用“%”代替。 SPACE伪指令的语法格式为:
标号SPACE表达式 DataSpaceSPACE100 ;分配连续100字节的存储单元并初始化为0第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
8)MAP
MAP伪指令用于定义一个结构化的内存表的首地址。 MAP伪指令的语法格式为: MAP表达式{,基址寄存器} MAP0x100,R0;
定义结构化内存表首地址的值为0x100 + R0第3章ARM的指令系统及汇编程序设计数据定义伪操作指令:
9)FIELD
FIELD伪指令用于定义一个结构化内存表中的数据域。 FIELD伪指令的语法格式为:
标号FIELD表达式 MAP0x100;
定义结构化内存表首地址的值为0x100 AFIELD16;
定义A的长度为16字节,位置为0x100第3章ARM的指令系统及汇编程序设计汇编控制伪操作指令:
1).if….else….endif
.if….else….endif伪操作指令的语法格式为 .if逻辑表达式
指令1
… .elseif逻辑表达式2
指令2
… .endif第3章ARM的指令系统及汇编程序设计汇编控制伪操作指令:
2).macro….endm
.macro….endm伪操作指令的语法格式为 .macro {$标号}宏名{$参数1{,参数2,…}}
指令 .endm第3章ARM的指令系统及汇编程序设计汇编控制伪操作指令:
3).mexit
.mexit伪操作指令的语法格式为 .macro {$标号}宏名{$参数1{,参数2,…}}
指令 .endm第3章ARM的指令系统及汇编程序设计汇编控制伪操作指令:
4)WHILE、WEND
WHILE、WEND伪操作指令的语法格式为 WHILE逻辑表达式
指令序列
WEND第3章ARM的指令系统及汇编程序设计杂项伪操作指令:
1)AREA
AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“ | ”括起来,如 |1_test|。属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。第3章ARM的指令系统及汇编程序设计常用的属性如下:● CODE属性:定义代码段,默认为READONLY。●
DATA属性:定义数据段,默认为READWRITE。●
READONLY属性:指定本段为只读,代码段默认为READONLY。●
READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。●
COMMON属性:定义一个通用的段,不包含任何用户代码和数据。第3章ARM的指令系统及汇编程序设计杂项伪操作指令:
2)ALIGN 8)IMPORT 3)CODE16 9)EXTERN 4)ENTRY 10)GET 5)END 11)INCBIN 6)EQU 12)RN 7)EXPORT 13)ROUT第3章ARM的指令系统及汇编程序设计3.5ARM汇编伪指令ARM汇编程序中的伪指令不是真正的ARM指令或者Thumb指令。这些伪指令在汇编编译时被替换成对应的ARM或Thumb指令(序列)。ARM伪指令包括ADR、ADRL、LDR和NOP等。第3章ARM的指令系统及汇编程序设计汇编伪指令:
1)ADR(小范围地址的读取伪指令)
ADR指令将基于PC的地址值或基于寄存器的地址值读取到寄存器中。 ADR伪指令的语法格式为: ADR{cond}register,expr
其中,cond为可选的指令执行条件,register为目标寄存器,expr为基于PC或者基于寄存器的地址表达式。
第3章ARM的指令系统及汇编程序设计汇编伪指令:
startMOVr0,#10;
因为PC值为当前指令地址值加8字节 ADRr4,start;
本ADR伪指令将被编译器替换成SUBr4,pc,#0xc
第3章ARM的指令系统及汇编程序设计汇编伪指令:
2)ADRL(中等范围的地址读取伪指令)
ADRL指令将基于PC或基于寄存器的地址值读取到寄存器中。ADRL伪指令比ADR伪指令可以读取更大范围的地址。 ADRL伪指令的语法格式为: ADRL{cond}register,expr
其中,地址表达式expr的取值范围为:当地址值是字节对齐时,其取指范围为 -64 K~64 K;当地址值是字对齐时,其取指范围为 -256 K~256 K。
第3章ARM的指令系统及汇编程序设计汇编伪指令:
startMOVr0,#10;
因为PC值为当前指令地址值加8字节 ADRLr4,start + 60000;
本ADRL伪指令将被编译器替换成下面两条指令 ADDr4,pc,#0xe800 ADDr4,r4,#0x254
第3章ARM的指令系统及汇编程序设计汇编伪指令:
3)LDR(大范围的地址读取伪指令)
LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中。 LDR伪指令的语法格式为: LDR{cond}register,=[expr|label-expr]
其中,expr为32位的常量。label-expr为基于PC的地址表达式或者是外部表达式。
第3章ARM的指令系统及汇编程序设计汇编伪指令:
LDR伪指令主要有以下两种用途:
①当需要读取到寄存器中的数据超过了MOV及MVN指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。
②将一个基于PC的地址值或者外部的地址值读取到寄存器中。
第3章ARM的指令系统及汇编程序设计汇编伪指令:
LDRR1,=0xFF0;
将0xff0读取到R1中
汇编后将得到 MOVR1,0xFF0 LDRR1,=0xFFF;
将0xfff读取到R1中
汇编后将得到 LDRR1,[PC,OFFSET_TO_LPOOL]
… LPOOLDCD0xFFF LDRR1,=ADDR1;
将外部地址ADDR1读取到R1中
汇编后将得到 LDRR1,[PC,OFFSET_TO_LPOOL] 第3章ARM的指令系统及汇编程序设计程
序文件名后缀汇编*.SC程序*.C头文件*.H引入文件*.INC3.6ARM汇编编程简介3.6.1ARM汇编语言文件格式表3.3ARM源程序文件名的后缀名第3章ARM的指令系统及汇编程序设计3.6.2ARM汇编语言语句格式
ARM汇编语言的语句格式为: [标号]<指令|条件|S><操作数>[;注释]
ARM汇编语言中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。ARM汇编器对标示符大小写敏感,书写标号及指令时字母大小写要一致。第3章ARM的指令系统及汇编程序设计1、汇编语言程序中的标号1)标号
在ARM汇编程序中,标号代表一个地址,段内标号的地址在汇编时确定,而段外标号的地址值在连接时确定。根据标号的生成方式可将其分为三种:基于PC的标号基于寄存器的标号绝对地址第3章ARM的指令系统及汇编程序设计2)局部标号
局部标号主要用于局部范围代码中,也经常在宏定义中使用。
局部标号的定义格式为: N{routname}
其中,N为局部标号,范围为0~99;routname为局部标号作用范围的名称,由ROUT伪指令定义。第3章ARM的指令系统及汇编程序设计2、汇编语言程序中的符号1)常量(1)数字常量:
①十进制数,如12、4、987、0。
②十六进制数,如0x439、0xFF0、0x1。
③n进制数,用n-XXX表示,其中n = 2~9,XXX为具体的数。(2)字符常量。(3)布尔常量。第3章ARM的指令系统及汇编程序设计2)变量
变量是指其值在程序的运行过程中可以改变的量。ARM汇编程序所支持的变量有数字变量、逻辑变量和字符串变量。第3章ARM的指令系统及汇编程序设计3)汇编语言程序中的表达式和运算符
常用的表达式有数学表达式、逻辑表达式和字符串表达式,其运算的优先级次序如下:(1)优先级相同的双目运算符的运算顺序为从左到右;(2)相邻的单目运算符的运算顺序是从右到左,且单目运算符的优先级高于其他运算符;(3)括号运算符的优先级最高。第3章ARM的指令系统及汇编程序设计3.6.3C语言和汇编语言的混合编程1.汇编语言的程序结构
一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段。多个段在程序编译链接时最终形成一个可执行的映像文件。第3章ARM的指令系统及汇编程序设计以下是一个汇编语言源程序的基本结构: AREAInit,CODE,READONLY ENTRY Start LDR R0,=0x3FF5000 LDR R1,0xFF STR R1,[R0] LDR R0,=0x3FF5008 LDR R0,=0x01 STR R1,[R0]
… END第3章ARM的指令系统及汇编程序设计2.汇编语言与C语言的混合编程
在应用系统的程序设计中,若所有的编程任务都用汇
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年因病致贫重病患者救助政策竞赛题库
- 2026年电子商务物流配送体系研究题库
- 2026年水资源保护与节水科普题库
- 2026年医保缴费基数申报题库
- 2026年村社农产品电商增收致富案例知识题库
- 2026年教育法下的教育公平问题研究
- 医疗卫生行业政策法规含测试题2026
- 2026年征兵心理测评进取心与成就动机题
- 2025年湘乡市社区工作者招聘考试真题及答案
- 2026年福建压力容器操作工考试工艺参数控制与日常巡检要点
- 电泳质量协议书范本
- 抢救柜管理制度
- 2025年福建省高考生物试卷真题(含答案解析)
- 2025闵行七宝镇村(合作社)、镇属公司公开招聘20人模拟试卷(含答案详解)
- 2025年空军军队文职技能岗考试采购员练习题及答案
- 涉毒违法犯罪警示教育课件大纲
- 甜点草莓少司课件
- 高校大创项目申报书撰写指南
- 2024-2025学年辽宁省丹东市第十九中学七年级下学期期中考试数学试题
- 幼儿园中班数学课《认识数字1-10》课件
- 2024广东海洋大学教师招聘考试真题及答案
评论
0/150
提交评论