第11、12节课(第3章第4节)_第1页
第11、12节课(第3章第4节)_第2页
第11、12节课(第3章第4节)_第3页
第11、12节课(第3章第4节)_第4页
第11、12节课(第3章第4节)_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主要内容1324ARM体系结构概述

编程模型ARM基本寻址方式ARM指令集5ARM9TDMI内核6ARM9与ARM7的比较ARM920T核73.4.1指令分类及格式

1、指令分类

ARM指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回到寄存器中。对系统存储器的访问则需要通过专门的Load/Store指令来完成。

2、指令格式

ARM指令使用的基本格式如下:

<opcode>{cond}{S}<Rd><Rn>{,operand2}

opcode:操作码cond:可选条件码S:可选后缀,若指定S,则根据指令执行结果更新CPSR中条件码Rd:目的寄存器Rn:存放第一操作数的寄存器operand2:第二个操作数3.4.1条件执行几乎所有的ARM指令均可包含一个可选的条件码,句法说明中以{cond}表示,只有在CPSR中的条件码标志满足指定的条件时,带条件码的指令才能执行。并使用后缀“S”来区分是否根据执行结果修改条件码标志。操作码[31:28]助记符后缀标志含义0000EQZ置位相等0001NEZ清零不等0010CS/HSC置位大于或等于(无符号>=)0011CC/LOC清零小于(无符号<)0100MIN置位负0101PLN清零正或零0110VSV置位溢出0111VCV清零未溢出1000HIC置位且Z清零大于(无符号>)1001LSC清零或Z置位小于或等于(无符号<=)1010GEN和V相同带符号>=1011LTN和V不同带符号<1100GTZ清零且N和V相同带符号>1101LEZ置位或N和V不同带符号<=1110AL任何总是(通常省略)3.4.2指令分类说明

32位ARM指令集由13种基本指令类型组成,分成4大类:3种类型的存储器访问指令:控制存储器和寄存器之间的数据传送。一种类型用于优化的灵活寻址;另一种类型用于快速上下文切换;第三种类型用于交换数据。3种类型的数据处理指令:使用片内ALU、桶形移位器和乘法器针对31个寄存器完成高速数据处理操作。4种类型的分支指令:控制程序执行流程、指令优先级以及ARM代码和Thumb代码的切换。3种类型的协处理器指令:专用于控制外部协处理器。这些指令以开放和统一的方式扩展了指令集的片外功能。

ARM存储器访问指令(1)LDR和STR——字和无符号字节字节加载是用“0”扩展到32位。LDR和STR都有如下4种可能的形式:

零偏移:Rn的值作为传送数据的地址。句法:

op{cond}{B}{T}Rd,[Rn]

前索引偏移:在数据传送之前,将偏移量加到Rn中。其结果作为传送数据的存储器地址。若使用后缀“!”,则结果写回到Rn中,且Rn不允许是R15。句法:

op{cond}{B}Rd,[Rn,Flexoffset]{!}

程序相对偏移:程序相对偏移是前索引形式的另一种版本。汇编器由PC计算偏移量,并将PC作为Rn生成前索引指令。不能使用后缀“!”。句法:op{cond}{B}Rd,label

后索引偏移:Rn的值用做传送数据的存储器地址。在数据传送后,将偏移量加到Rn中。结果写回到Rn。Rn不允许是R15。句法:op{cond}{B}{T}Rd,[Rn],Flexoffset

ARM存储器访问指令(1)LDR和STR——字和无符号字节[例子]LDR R8,[R10];R8[R0]LDRNER2,[R5,#960]!;(有条件地)R2[R5+960],R5R5+960STR R2,[R9,#consta-struc];consta-struc是常量的表达式,该

;常量值的范围为0~4095STRBR0,[R3,-R8,ASR#2];R0[R3-R8/4],存储R0的最低有效

;字节,R3和R8不变STR R5,[R7],#-8;R5[R7],R1R7-8LDR R0,localdata;加载一个字,该字位于标号lacaldata所在地址(2)LDR和STR——半字和带符号字节

ARM存储器访问指令这些指令有4种可能的形式:零偏移、前索引偏移、程序相对偏移和后索引偏移。以同样的顺序,4种形式的句法为op{cond}typeRd,[Rn]op{cond}typeRd,[Rn,offset]{!}op{cond}typeRd,labelop{cond}typeRd,[Rn],offset其中:type必须是以下所列的其中之一:SH对带符号半字(仅LDR);H对无符号半字;SB对带符号字节(仅LDR)。label程序相对偏移表达式。

label必须是在当前指令的±255字节范围内。offset加在Rn上的偏移量。

ARM存储器访问指令(2)LDR和STR——半字和带符号字节[例子]LDREQSHR11,[R6];(有条件地)R11[R6],加载16位半字,;带符号扩展到32位LDRHR1,[R0,#22];R1[R0+22],加载16位半字,零扩展到32位STRHR4,[R0,R1]!;R4[R0+R1],存储最低的有效半字到R0+R1;地址开始的两个字节,地址写回到R0LDRSB R6,constf;加载位于标号constf地址中的字节,带符号扩展(3)LDR和STR——双字

ARM存储器访问指令加载两个相邻的寄存器和存储两个相邻的寄存器,64位双字。这些指令有4种可能的形式:零偏移、前索引偏移、程序相对偏移、后索引偏移。以同样的顺序,4种形式的句法为op{cond}DRd,[Rn]op{cond}DRd,[Rn,offset]{!}op{cond}DRd,labelop{cond}DRd,[Rn],offset[例子]LDRD R6,[R11]LDRMID R4,[R7],R2STRD R4,[R9,#24]STRD R0,[R9,-R2]!LDREQD R8,abc4(4)LDM和STM

ARM存储器访问指令加载多个寄存器(LDM)和存储多个寄存器(STM)。可以传送R0-R15的任何组合。句法:op{cond}modeRn{!},reglist{^}其中:mode

是IA/IB/DA/DB/FD/ED/FA/EA中的一个.Rn

基址寄存器,装有传送数据的初始地址。Rn不允许是R15。!

可选后缀。若有“!”,则最后的地址写回到Rn。reglist

加载或存储的寄存器列表,包含在括号中。^可选后缀,不允许在用户模式或系统模式下使用。若op是LDM且reglist中包含PC(R15),那么除了正常的多寄存器传送外,将SPSR也拷贝到CPSR中。这用于从异常处理返回,仅在异常模式下使用。数据传入或传出的是用户模式的寄存器,而不是当前模式的寄存器。

ARM存储器访问指令(4)LDM和STM[例子]LDMIAR8,{R0,R2,R9}STMDBR1!,{R3-R6,R11,R12}STMFDR13!,{R0,R4-R7,LR};寄存器进栈LDMFDR13!,{R0,R4-R7,PC};寄存器出栈,从子程序返回(5)PLD

ARM存储器访问指令Cache预加载。使用PLD(PreLoaD)提示存储系统从后面几条新指令所指定的存储器地址加载。存储系统可使用这种方法加速以后的存储器访问。句法:PLD[Rn{Flexoffset}][例子]PLD [R2]PLD [R15,#280]PLD [R9,#-2481]PLD [R0,#av*4];av*4必须在汇编时求值,范围为-4095-4095PLD [R0,R2]PLD [R5,R8,LSL#2](6)SWP

ARM存储器访问指令在寄存器和存储器之间进行数据交换。使用SWP来实现信号量。句法:SWP{cond}{B}Rd,Rm,[Rn]其中:B可选后缀。若有B,则交换字节;否则,交换32位字。RdARM寄存器。数据从存储器加载到Rd。RmARM寄存器。Rm的内容存储到存储器。Rm可以与Rd相同。在这种情况下,寄存器的内容与存储器的内容进行交换。RnARM寄存器。Rn的内容指定要进行数据交换的存储器的地址。Rn必须与Rd和Rm不同。

ARM数据处理指令数据处理类指令格式:<opcode>{<cond>}{S}{Rd},{Rn},<shifter_operand>opcode:操作码,如ADD、SUB、ORRcond:条件码S:本指令是否更新CPSR中的状态标志位Rd:目标寄存器Rn:第一个源寄存器shifter_operand:复合的源操作数,其格式:立即数 ADDR1,R2,#0x35寄存器 SUBSR3,R2,R1寄存器移位 ADDEQSR9,R5,R5,LSL#3SUBR3,R2,R1,RORR7

ARM数据处理指令算术/逻辑运算指令

ADD指令

ADD指令的格式为:

ADD{条件}{S}目的寄存器,操作数1,操作数2

ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

指令示例:

ARM数据处理指令ADD

R0,R1,R2

;R0=R1+R2

ADD

R0,R1,#256

;R0=R1+256

ADD

R0,R2,R3,LSL#1

;R0=R2+(R3<<1)

ADC

带进位加法指令。将operand2的数据与Rn的值相加,再加上CPSR中的C条件标志位。结果保存到Rd寄存器。指令格式如下:

ADC{cond}{S}Rd,Rn,operand2

ADC指令举例如下:

ADDSR0,R0,R2

ADCR1,R1,R3;使用ADC实现64位加法,(R1、R0)=(R1、R0)+(R3、R2)

SUB

减法运算指令。用寄存器Rn减去operand2。结果保存到Rd中。指令格式如下:

SUB{cond}{S}Rd,Rn,operand2

SUB指令举例如下:

SUBSR0,R0,#1;R0=R0-1

SUBSR2,R1,R2;R2=R1-R2

SUBR6,R7,#0x10;R6=R7-0x10

RSB

逆向减法指令。用寄存器operand2减法Rn,结果保存到Rd中。指令格式如下:

RSB{cond}{S}Rd,Rn,operand2

SUB指令举例如下:

RSBR3,R1,#0xFF00;R3=0xFF00-R1

RSBSR1,R2,R2,LSL#2;R1=R2<<2-R2=R2×3

RSBR0,R1,#0;R0=-R1

SBC

带进位减法指令。用寄存器Rn减去operand2,再减去CPSR中的C条件标志位的非(即若C标志清零,则结果减去1),结果保存到Rd中。指令格式如下:

SCB{cond}{S}Rd,Rn,operand2

SBC指令举例如下:

SUBSR0,R0,R2

SBCR1,R1,R3;使用SBC实现64位减法,(R1,R0)-(R3,R2)

RSC

带进位逆向减法指令。用寄存器operand2减去Rn,再减去CPSR中的C条件标志位,结果保存到Rd中。指令格式如下:

RSC{cond}{S}Rd,Rn,operand2

RSC指令举例如下:

RSBSR2,R0,#0

RSCR3,R1,#0;使用RSC指令实现求64位数值的负数

AND

逻辑与操作指令。将operand2值与寄存器Rn的值按位作逻辑与操作,结果保存到Rd中。指令格式如下:

AND{cond}{S}Rd,Rn,operand2

AND指令举例如下:

ANDSR0,R0,#x01;R0=R0&0x01,取出最低位数据

ANDR2,R1,R3;R2=R1&R3

ORR

逻辑或操作指令。将operand2的值与寄存器Rn的值按位作逻辑或操作,结果保存到Rd中。指令格式如下:

ORR{cond}{S}Rd,Rn,operand2

ORR指令举例如下:

ORRR0,R0,#x0F;将R0的低4位置1

MOVR1,R2,LSR#4

ORRR3,R1,R3,LSL#8;使用ORR指令将近R2的高8位数据移入到R3低8位中

EOR

逻辑异或操作指令。将operand2的值与寄存器Rn的值按位作逻辑异或操作,结果保存到Rd中。指令格式如下:

EOR{cond}{S}Rd,Rn,operand2

EOR指令举例如下:

EORR1,R1,#0x0F;将R1的低4位取反

EORR2,R1,R0;R2=R1^R0

EORSR0,R5,#0x01;将R5和0x01进行逻辑异或,结果保存到R0,并影响标志位

BIC

位清除指令。将寄存器Rn的值与operand2的值的反码按位作逻辑与操作,结果保存到Rd中。指令格式如下:

BIC{cond}{S}Rd,Rn,operand2

BIC指令举例如下:

BICR1,R1,#0x0F;将R1的低4位清零,其它位不变

BICR1,R2,R3;将拭的反码和R2相逻辑与,结果保存到R1

CMP

比较指令。指令使用寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。指令格式如下:

CMP{cond}Rn,operand2

CMP指令举例如下:

CMPR1,#10;R1与10比较,设置相关标志位

CMPR1,R2;R1与R2比较,设置相关标志位

CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行两个数据大小判断时,常用CMP指令及相应的条件码来操作。

CMN

负数比较指令。指令使用寄存器Rn与值加上operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行,指令格式如下:

CMN{cond}Rn,operand2

CMNR0,#1;R0+1,判断R0是否为1的补码,若是Z置位

CMN指令与ADDS指令的区别在于CMN指令不保存运算结果。CMN指令可用于负数比较,比如CMNR0,#1指令则表示R0与-1比较,若R0为-(即1的补码),则Z置位,否则Z复位。

ARM指令集——指令格式ARM指令集——第2个操作数#immed_8r——常数表达式该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到。循环右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常数

ARM数据处理指令乘法指令

MUL指令将Rm和Rs中的值相乘,并将最低有效的32位结果放到Rd中。句法:MUL{cond}{S}Rd,Rm,RsMLA指令将Rm和Rs中值相乘,再加上Rn的值,并将最低有效的32位结果放到Rd中。句法:MLA{cond}{S}Rd,Rm,Rs,RnUMULL指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将结果的最低有效32位放在RdLo中,最高有效32位放在RdHi中。前导零计数CLZ指令对Rm中值的前导零的个数进行计数,结果放到Rd中。若源寄存器全为0,则结果为32。若位[31]为1,则结果为0。句法:CLZ{cond}Rd,RmUMLAL指令将Rm和Rs中的值解释为无符号整数。该指令将这两个整数相乘,并将64位结果加到RdHi和RdLo中的64位无符号整数上。SMULL指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘,并将结果的最低有效32位放在RdLo中,将最高有效32位放在RdHi中。SMLAL指令将Rm和Rs中的值解释为带符号的补码整数。该指令将这两个整数相乘,并将64位结果加到RdHi和RdLo中的64位带符号补码整数上。句法:op{cond}{S}RdLo,RdHi,Rm,Rs

ARM数据处理指令MUL

32位乘法指令。指令将Rm和Rs中的值相乘,结果的低32位保存到Rd中。指令格式如下:

MUL{cond}{S}Rd,Rm,Rs

MUL指令举例如下:

MULR1,R2,R3;R1=R2×R3

MULSR0,R3,R7;R0=R3×R7,同时设置CPSR中的N位和Z位

MLA

32位乘加指令。指令将Rm和Rs中的值相乘,再将乘积加上第3个操作数,结果的低32位保存到Rd中。指令格式如下:

MLA{cond}{S}Rd,Rm,Rs,Rn

MLA指令举例如下:

MLAR1,R2,R3,R0;R1=R2×R3+10

UMULL

64位无符号乘法指令。指令将Rm和Rs中的值作无符号数相乘,结果的低32位保存到RsLo中,而高32位保存到RdHi中。指令格式如下:

UMULL{cond}{S}RdLo,RdHi,Rm,Rs

UMULL指令举例如下:

UMULLR0,R1,R5,R8;(R1、R0)=R5×R8

UMLAL

64位无符号乘加指令。指令将Rm和Rs中的值作无符号数相乘,64位乘积与RdHi、RdLo相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:

UMLAL{cond}{S}RdLo,RdHi,Rm,Rs

UMLAL指令举例如下:

UMLALR0,R1,R5,R8;(R1,R0)=R5×R8+(R1,R0)

SMULL

64位有符号乘法指令。指令将Rm和Rs中的值作有符号数相乘,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:

SMULL{cond}{S}RdLo,RdHi,Rm,Rs

SMULL指令举例如下:

SMULLR2,R3,R7,R6;(R3,R2)=R7×R6

SMLAL

64位有符号乘加指令。指令将Rm和Rs中的值作有符号数相乘,64位乘积与RdHi、RdLo,相加,结果的低32位保存到RdLo中,而高32位保存到RdHi中。指令格式如下:

SMLAL{cond}{S}RdLo,RdHi,Rm,Rs

SMLAL指令举例如下:

SMLALR2,R3,R7,R6;(R3,R2)=R7×R6+(R3,R2)

ARM转移指令(1)B和BLB(Branch)指令引起处理器转移到label。

句法:B{cond}label

BL(BranchandLink)指令将下一条指令的地址拷贝到R14(LR,链接寄存器),并引起转移到label。

句法:BL{cond}label

(2)BX:引起处理器转移到Rm中的地址。若Rm的位[0]为1,则指令集变换到Thumb。句法:BX{cond}Rm(3)BLX:带链接转移并可选地交换指令集。句法:BLX{cond}RmBLXlabel

ARM协处理器指令

CDP

协处理器数据操作指令。ARM处理器通过CDP指令通知ARM协处理器执行特定的操作。该操作由协处理器完成,即对命令的参数的解释与协处理器有关,指令的使用取决于协处理器。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:

CDP{cond}coproc,opcodel,CRd,CRn,CRm{,opcode2}

其中:coproc指令操作的协处理器名。标准名为pn,n为0~15。

opcodel协处理器的特定操作码。

CRd作为目标寄存器的协处理器寄存器。

CRN存放第1个操作数的协处理器寄存器。

CRm存放第2个操作数的协处理器寄存器。

Opcode2可选的协处理器特定操作码。

CDP指令举例如下:

CDPp7,0,c0,c2,c3,0;协处理器7操作,操作码为0,可选操作码为0

CDPp6,1,c3,c4,c5;协处理器操作,操作码为1

LDC

协处理器数据读取指令。LDC指令从某一连续的内存单元将数据读取到协处理器的寄存器中。协处理器数据的数据的传送,由协处理器来控传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:

LDC{cond}{L}coproc,CRd,<地址>

其中:L可选后缀,指明是长整数传送。

coproc指令操作的协处理器名。标准名为pn,n为0~15

CRd作为目标寄存的协处理器寄存器。

<地址>指定的内存地址

LDC指令举例如下:

LDCp5,c2,[R2,#4];读取R2+4指向的内存单元的数据,传送到协处理器p5的c2寄存器中

LDCp6,c2,[R1];读取是指向的内存单元的数据,传送到协处理器p6的c2寄存器中

STC

协处理器数据写入指令。STC指令将协处理器的寄存器数据写入到某一连续的内存单元中。进行协处理器数据的数据传送,由协处理器来控制传送的字数。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:

STC{cond}{L}coproc,CRd,<地址>

其中:L可选后缀,指明是长整数传送。

coproc指令操作的协处理器名。标准名为pn,n为0~15

CRd作为目标寄存的协处理器寄存器。

<地址>指定的内存地址

STC指令举例如下:

STCp5,c1,[R0]

STCp5,c1,[Ro,#-0x04]

MCR

ARM寄存器到协处理器寄存器的数据传送指令。MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。若协处理器不能成功地执行该操作,将产生未定义指令异常中断。指令格式如下:

MCR{cond}coproc,opcodel,Rd,CRn,CRm{,opcode2}

其中:coproc指令操作的协处理器名。标准名为pn,n为0~15。

cpcodel协处理器的特定操作码。

CRD作为目标寄存器的协处理器寄存器。

CRn存放第1个操作数的协处理器寄存器

CRm存放第2个操作数的协处理器寄存器。

Opcode2可选的协处理器特定操作码。

MCR指令举例如下:

MCRp6,2,R7,c1,c2,

MCRP7,0,R1,c3,c2,1,

MRC

协处理器寄存器到ARM寄存器到的数据传送指令。MRC指令将协处理器寄存器中的数据传送到ARM处理器的寄存器中。若协处理器不能成功地执行该操作。将产生未定义异常中断。指令格式如下:

MRC{cond}coproc,opcodel,Rd,CRn,CRm{,opcode2}

其中:coproc指令操作的协处理器名。标准名为pn,n为0~15。

opcodel协处理器的特定操作码。

CRd作为目标寄存器的协处理器寄存器。

CRn存放第1个操作数的协处理器寄存器。

CRm存放第2个操作数的协处理器寄存器。

opcode2可选的协处理器特定操作码。

MRC指令举例如下:

MRCp5,2,R2,c3,c2

MRCp7,0,R0,c1,c2,1

杂项ARM指令(1)SWI,引起软件中断。这意味着处理器模式变换为管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量。句法:SWI{cond}immed_24其中:immed_24为表达式,其值为0~224-1范围内的整数。(2)MRS,将CPSR或SPSR的内容传送到通用寄存器。句法:MRS{cond}Rd,psr其中:Rd目标寄存器。Rd不允许为R15。psrCPSR或SPSR。(3)MSR,用立即数或通用寄存器的内容加载CPSR或SPSR的指定区域。句法:MSR{cond}<psr>_<fields>,#immed_8rMSR{cond}<psr>_<fields>,Rm其中:<psr>CPSR或SPSR。<fields>指定传送的区域。immed_8r值为数字常量的表达式。常量必须对应于8位位图在32位字中循环移位偶数位后的值。Rm源寄存器。(4)BKPT,引起处理器进入调试模式。句法:BKPTimmed_16其中:immed_16为表达式,其值为范围在0~65536内的整数。(1)从r14中减去4来获得SWI指令的地址。(2)把这个指令装载到一个寄存器。(3)清除这个指令的高端8位,去掉了OpCode而只剩下的SWI编号。(4)使用这个值来找到要被执行的代码的例程的地址(使用查找表等)。(5)恢复寄存器r0-r12。(6)使处理器离开超级用户模式。(7)跳转到这个例程的地址。读出SWI立即数:

T_bitEQU0x20

SWI_Hander

STMFDSP!,{R0_R3,R12,LR}

;现场保护

MRSR0,SPSR

;读取SPSR

STMFDSP!,{R0}

;保存SPSR

TSTR0,#T_bit

;测试T标志位

LDRNEHR0,[LR,#-2]

;若是Thumb指令,读取指令码(16位)

BICNER0,R0,#0xFF00

;取得Thumb指令的8位立即数

LDREQR0,[LR,#-4]

;若是ARM指令,读取指令码(32位)

BICNQR0,R0,#0xFF00000

;取得ARM指令的24位立即数

LDMFDSP!,{R0-R3,R12,PC}^;SWI异常中断返回

ARM伪指令——小范围的地址读取

ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADR{cond}register,exprADR伪指令格式指令执行的条件码加载的目标寄存器地址表达式

地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-255~255;当地址值是字对齐时,其取指范围为-1020~1020;ARM伪指令——小范围的地址读取

ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。...ADRR0,Delay...DelayMOVR0,r14...应用示例(源程序):使用伪指令将程序标号Delay的地址存入R0...0x20ADDr1,pc,#0x3c......0x64MOVr0,r14...ARM伪指令——小范围的地址读取

ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。...ADRLR1,Delay...DelayMOVR0,r14...应用示例(源程序):编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0地址程序代码ARM伪指令——小范围的地址读取

ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。...ADRLR0,Delay...DelayMOVR0,r14...应用示例(源程序):...0x20ADDr1,pc,#0x3c......0x64MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADR伪指令被汇编成一条指令ARM伪指令——小范围的地址读取

ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。

应用示例2(查表):

ADRR0,DISP_TAB ;加载转换表地址

LDRBR1,[R0,R2] ;使用R2作为参数,进行查表

…DISP_TABDCB0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8ARM伪指令——中等范围的地址读取

ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。ADRL{cond}register,exprADRL伪指令格式指令执行的条件码加载的目标寄存器地址表达式

地址表达式expr的取指范围:当地址值是字节对齐时,其取指范围为-64K~64K;当地址值是字对齐时,其取指范围为-256K~256K;ARM伪指令——中等范围的地址读取

ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。...ADRLR0,Delay...DelayMOVR0,r14...应用示例(源程序):使用伪指令将程序标号Delay的地址存入R0ARM伪指令——中等范围的地址读取

ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。...ADRLR0,Delay...DelayMOVR0,r14...应用示例(源程序):...0x20ADDr1,pc,#400x24ADDr1,r1,#FF00...0xFF68MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0地址程序代码ARM伪指令——中等范围的地址读取

ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。...ADRLR0,Delay...DelayMOVR0,r14...应用示例(源程序):...0x20ADDr1,pc,#400x24ADDr1,r1,#FF00...0xFF68MOVr0,r14...编译后的反汇编代码:使用伪指令将程序标号Delay的地址存入R0ADRL伪指令被汇编成两条指令ARM伪指令——大范围的地址读取

LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。LDR{cond}register,=[expr|label_exprLDR伪指令格式指令执行的条件码加载的目标寄存器基于PC的地址表达式或外部表达式注意:1.从指令位置到文字池的偏移量必须小于4KB;2.与ARM指令的LDR相比,伪指令的LDR的参数有“=”号。ARM伪指令——大范围的地址读取

LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载常量):LDRR2,=0xFF0;MOVR2,#0xFF0LDRR0,=0xFF000000;MOVR0,#0xFF000000LDRR1,=0xFFFFFFFE;MVNR1,#0x1ARM伪指令——大范围的地址读取

LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。应用示例(加载地址):...LDRR1,=InitStack...InitStackMOVR0,LR...使用伪指令将程序标号InitStack的地址存入R1ARM伪指令——大范围的地址读取

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论