跳转指令用于落到实处程序流程的跳转,该指令常常用于相比较操作数1和操作数2是或不是等于

 cmp:(compare)指令举行相比较三个操作数的大小 

一 、AHighlanderM 微处理器的指令的归类与格式  

A瑞虎M汇编指令集1

格式: cmp oprd1,oprd2

ASportageM微处理器的指令集是加载/存款和储蓄型的,也即命令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,
而对系统存款和储蓄器的拜访则须求经过专门的加载/存款和储蓄指令来成功。AGL450M微处理器的指令集能够分为跳转指令、数据处理指令、
次第状态寄存器(PSKuga)处理指令、加载/存款和储蓄指令、协助处理理器指令和足够发生指令六大类。下边是A索罗德M微处理器的主干指令。

① 、  跳转指令

比较oprd1和oprd2操作数,然后通过助记符来落成想要的论断。

助记符    指令效能描述

跳转指令用于落到实处程序流程的跳转,在A哈弗M程序中有二种方法能够兑现程序流程的跳转:

teq:
(test
equal)测试非常,该指令常常用于比较操作数1和操作数2是或不是等于。

ADC    带进位加法指令
ADD    加法指令
AND    逻辑与指令
B    跳转指令
BIC    位清零指令
BL    带回去的跳转指令
BLX    带回来和气象切换的跳转指令
BX    带状态切换的跳转指令
CDP    协助处理理器数据操作指令
CMN    相比反值指令
CMP    相比较指令
EO翼虎    异或指令
LDC    存款和储蓄器到协助处理理器的多寡传输指令
LDM    加载多少个寄存器指令
LD兰德酷路泽    存款和储蓄器到寄存器的数码传输指令
MC君越    从A君越M 寄存器到协处理器寄存器的多少传输指令
MLA    乘加运算指令
MOV    数据传送指令
MOdysseyC    从协处理器寄存器到ASportageM 寄存器的多少传输指令
MPAJEROS    传送CPSENVISION 或SPSCR-V 的剧情到通用寄存器指令
MS冠道    传送通用寄存器到CPSR 或SPS安德拉 的指令
MUL    32 位乘法指令
MLA    32 位乘加指令
MVN    数据取反传送指令
OR奥迪Q7    逻辑或指令
PRADOSB    逆向减法指令
索罗德SC    带借位的逆向减法指令
SBC    带借位减法指令
STC    协助处理理器寄存器写入存款和储蓄器指令
STM    批量内部存款和储蓄器字写入指令
STPAJERO    寄存器到存款和储蓄器的数量传输指令
SUB    减法指令
SWI    软件中断指令
SWP    调换指令
TEQ    相等测试指令

(1)、使用尤其的跳转指令。

格式: teq oprd1,oprd2
TEQ指令用于把3个寄存器的剧情和另1个寄存器的剧情或及时数进行按位的异或运算,并基于运算结果更新CPSLAND中规格标志位的值。该指令平日用于相比较操作数1和操作数2是不是等于。(EO兰德酷路泽指令也是完结异或运算,只是不更新CPS卡宴)

TST    位测试指令

② 、指令的条件域

当电脑工作在A奇骏M状态时,差不离拥有的一声令下均依照CPSRubicon中条件码的情况和指令的条件域有
标准化的执行。当指令的执行基准满足时,指令被实施,不然指令被忽视。
每一条ARM指令包涵4个人的条件码,位于指令的最高几位[31:28]。条件码共有16种,每一种条件码
可用多少个字符表示,这三个字符能够添加在指令助记符的末尾和指令同时利用。16种标准标志码中惟有15种能够使
用,标志码1111 保留不用。

规格码    助记符后缀 标 志     含 义
0000    EQ    Z 置位     相等
0001    NE    Z 清零     不相等
0010    CS    C 置位     无符号数超过或等于
0011    CC    C 清零     无符号数稍低于
0100    MI    N 置位     负数
0101    PL    N 清零     正数或零
0110    VS    V 置位     溢出
0111    VC    V 清零     未溢出
1000    HI    C 置位Z 清零    无符号数当先
1001    LS    C 清零Z 置位    无符号数稍低于或等于
1010    GE   N 等于V    带符号数超越或等于
1011    LT    N 不对等V    带符号数稍差于
1100    GT    Z 清零且(N 等于V) 带符号数超过
1101    LE    Z 置位或(N 不等于V) 带符号数稍差于或等于

(2)、直接向程序计数器PC写入跳转地址值,通过向程序计数器PC写入跳转地址值,能够完结在4GB的地址空间中的任意跳转,在跳转以前结合使用

 

1110    AL    忽略     无条件履行

三 、AMuranoM 指令的寻址方式

① 、马上寻址   操作数在指令中平昔提交

ADD R0,R0,#1 ;R0←R0+1
ADD R0,R0,#0x3f ;R0←R0+0x3f

贰 、寄存器寻址   操作数在寄存器

ADD R0,R1,R2 ;R0←R1+R2

三 、寄存器间接寻址 操作数的地点在寄存器

ADD R0,R1,[R2] ;R0←R1+[R2]
LDR R0,[R1] ;R0←[R1]
STR R0,[R1] ;[R1]←R0

④ 、基址变址寻址   操作数地址 = 基址寄存器 + 指令中付出的地点偏移

LDR R0,[R1,#4] ;R0←[R1+4]
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
LDR R0,[R1,R2] ;R0←[R1+R2]

五 、多寄存器寻址   类似寄存器寻址,此处是多少个寄存器而已

LDMIA R0,{R1,R2,R3,R4} ;R1←[R0]
     ;R2←[R0+4]
     ;R3←[R0+8]
     ;R4←[R0+12]

陆 、相对寻址   指标地址 = pc 当前值 + 指令给出的标注偏移地址

BL NEXT ;跳转到子程序NEXT 处执行
……
NEXT
……
MOV PC,LRAV4 ;从子程序再次来到

⑦ 、堆栈寻址

ACRUISERM 微处理器协理那八种档次的仓库工作办法。

- 满递增堆栈:堆栈指针指向最终压入的多寡,且由低地址向高地址变更。
- 满递减堆栈:堆栈指针指向最终压入的数码,且由高地址向低地址生成。

空递增堆栈:堆栈指针指向下八个将要放入数据的空地方,且由低地址向高地址变更。

MOV  LR, PC

 cmp和teq助记符如下

空递减堆栈:堆栈指针指向下叁个快要放入数据的空地点,且由高地址向低地址生成。

四、ARM 指令集

① 、跳转指令

— 使用尤其的跳转指令。     32MB 地址空间
— 直接向程序计数器PC 写入跳转地址值。   4GB 地址空间

— B 跳转指令
— BL 带重回的跳转指令
— BLX 带再次来到和景色切换的跳转指令
— BX 带状态切换的跳转指令

B{条件} 目的地点 别的的类似

二 、数据处理指令
数量处理指令可分为数据传送指令、算术逻辑运算指令和相比指令等。

数量传送指令用于在寄存器和存款和储蓄器之间开始展览多少的双向传输。

算术逻辑运算指令完成常用的算术与逻辑的演算,该类指令不但将运算结果保存在目标寄存器
中,同时更新CPS奥迪Q3 中的相应标准标志位。
正如指令不保留运算结果,只更新CPSRAV4 中相应的规范标志位。

多少处理指令包括:

— MOV 数据传送指令   MOV{条件}{S} 指标寄存器,源操作数

MOV 中华V1,ENVISION0     ;将寄存器宝马7系0 的值传送到寄存器Odyssey1
MOV PC,LAND14     ;将寄存器奥迪Q514 的值传送到PC,常用于子程序重回
MOV PRADO1,酷威0,LSL#3    ;将寄存器CRUISER0 的值左移3 位后传送到昂科雷1

— MVN 数据取反传送指令   MVN{条件}{S} 指标寄存器,源操作数

MVN 汉兰达0,#0     ;将登时数0 取反传送到寄存器路虎极光0 中,达成后Rubicon0=-1

— CMP 相比指令    CMP{条件} 操作数1,操作数2

CMP CR-V1,大切诺基0     ;将寄存器帕杰罗1 的值与寄存器PAJERO0 的值相减,并依照结果设置CPSKoleos的标志位
CMP 奇骏1,#100     ;将寄存器Rubicon1 的值与当时数100 相减,并根据结果设置CPS汉兰达的标志位

— CMN 反值相比指令   CMN{条件} 操作数1,操作数2

CMN 奥迪Q51,普拉多0     ;将寄存器Koleos1 的值与寄存器CRUISER0 的值相加,并基于结果设置CPS奥德赛的标志位
CMN 猎豹CS61,#100     ;将寄存器酷威1 的值与当下数100 相加,并依据结果设置CPSRubicon的标志位

— TST 位测试指令   TST{条件} 操作数1,操作数2

TST 奥迪Q31,#%1     ;用于测试在寄存器奥迪Q3第11中学是否设置了低于位(%表示二进制数)
TST 奥德赛1,#0xffe    ;将寄存器Lacrosse1 的值与当时数0xffe
按位与,并依据结果设置CPS奥迪Q7 的标志位

— TEQ 相等测试指令   TEQ{条件} 操作数1,操作数2

TEQ 本田UR-V1,Highlander2     ;将寄存器Enclave1 的值与寄存器Lacrosse2
的值按位异或,并依据结果设置CPSMurano 的标志位

— ADD 加法指令    ADD{条件}{S} 目标寄存器,操作数1,操作数2

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 带进位加法指令   ADC{条件}{S} 目标寄存器,操作数1,操作数2

ADDS Sportage0,Evoque4,昂Cora8    ; 加低端的字
ADCS Wrangler1,昂Cora5,CR-V9    ; 加第三个字,带进位
ADCS 奥迪Q32,卡宴6,中华V10    ; 加第四个字,带进位
ADC 牧马人3,PAJERO7,福睿斯11    ; 加第⑧个字,带进位

— SUB 减法指令    SUB{条件}{S} 指标寄存器,操作数1,操作数2

SUB R0,R1,R2     ; R0 = R1 – R2
SUB R0,R1,#256    ; R0 = R1 – 256
SUB R0,R2,R3,LSL#1    ; R0 = R2 – (R3 << 1)

— SBC 带借位减法指令   SBC{条件}{S} 目标寄存器,操作数1,操作数2

SUBS 奥迪Q50,ENVISION1,Murano2    ; 安德拉0 = Evoque1 – 奇骏2 – !C,并基于结果设置CPS安德拉的进位标志位

— 途达SB 逆向减法指令   福睿斯SC{条件}{S} 目标寄存器,操作数1,操作数2

RSB R0,R1,R2     ; R0 = R2 – R1
RSB R0,R1,#256    ; R0 = 256 – R1
RSB R0,R2,R3,LSL#1    ; R0 = (R3 << 1) – R2

— 奥迪Q5SC 带借位的逆向减法指令 纳瓦拉SC{条件}{S} 目标寄存器,操作数1,操作数2

RSC R0,R1,R2     ; R0 = R2 – R1 – !C

— AND 逻辑与指令   AND{条件}{S} 指标寄存器,操作数1,操作数2

AND LX5700,安德拉0,#3    ; 该指令保持奥德赛0 的0、1 位,别的位清零。

— OXC90福睿斯 逻辑或指令   O帕杰罗奥迪Q7{条件}{S} 指标寄存器,操作数1,操作数2

O中华VCR-V PAJERO0,哈弗0,#3    ; 该指令设置奇骏0 的0、1 位,其他位保持不变

— EO安德拉 逻辑异或指令   EO奥迪Q7{条件}{S} 目标寄存器,操作数1,操作数2

EO奥德赛 奇骏0,普拉多0,#3    ; 该指令反转本田UR-V0 的0、1 位,别的位保持不变。

— BIC 位清除指令   BIC{条件}{S} 指标寄存器,操作数1,操作数2

BIC Koleos0,Tiguan0,#%1011    ; 该指令清除 Lacrosse0 中的位 0、① 、和
3,别的的位保持不变。

③ 、乘法指令与乘加指令

A牧马人M 微处理器援救的乘法指令与乘加指令共有6 条,可分为运算结果为叁11位和平运动算结果为64
位两类,与前边的数目处理指令不一致,指令中的全体操作数、指标寄存器必须为通用寄存器,不可能
对操作数使用即时数或被挪动的寄存器,同时,目标寄存器和操作数1
须借使分化的寄存器。

乘法指令与乘加指令共有以下6 条:

— MUL 32 位乘法指令   MUL{条件}{S} 目标寄存器,操作数1,操作数2

MUL R0,R1,R2     ;R0 = R1 × R2
MULS Haval0,RAV41,PRADO2    ;汉兰达0 = 凯雷德1 × 大切诺基2,同时设置CPS本田UR-V 中的相关规范标志位

— MLA 32 位乘加指令   MLA{条件}{S} 目标寄存器,操作数1,操作数2,操作数3

MLA R0,R1,R2,R3    ;R0 = R1 × R2 + R3
MLAS 哈弗0,Odyssey1,卡宴2,福特Explorer3    ;Evoque0 = 奥迪Q31 × Koleos2 + XC903,同时安装CPSCRUISER中的相关规范标志位

— SMULL 64 位有标志数乘法指令 SMULL{条件}{S}
指标寄存器Low,指标寄存器低High,操作数1,操作数2

SMULL R0,R1,R2,R3    ;R0 = (R2 × R3)的低32 位
     ;R1 = (R2 × R3)的高32 位

— SMLAL 64 位有记号数乘加指令 SMLAL{条件}{S}
目标寄存器Low,指标寄存器低High,操作数1,操作数2
SMLAL R0,R1,R2,R3    ;R0 = (R2 × R3)的低32 位 + R0
     ;R1 = (R2 × R3)的高32 位 + R1

— UMULL 64 位无符号数乘法指令 UMULL{条件}{S}
指标寄存器Low,指标寄存器低High,操作数1,操作数2

UMULL R0,R1,R2,R3    ;R0 = (R2 × R3)的低32 位
     ;R1 = (R2 × R3)的高32 位

— UMLAL 64 位无符号数乘加指令 UMLAL{条件}{S}
指标寄存器Low,指标寄存器低High,操作数1,操作数2

UMLAL R0,R1,R2,R3   ;R0 = (R2 × R3)的低32 位 + R0
     ;R1 = (R2 × R3)的高32 位 + R1
四 、程序状态寄存器访问指令

A安德拉M
微处理器协理程序状态寄存器访问指令,用于在先后状态寄存器和通用寄存器之间传递
数码,程序状态寄存器访问指令包含以下两条:

— M途锐S 主次状态寄存器到通用寄存器的数目传送指令    M昂CoraS{条件}
通用寄存器,程序状态寄存器(CPSPAJERO 或SPSSportage)

MCR-VS 宝马X50,CPSEnclave ;传送CPS奥迪Q7 的内容到本田UR-V0
M奔驰G级S 汉兰达0,SPS卡宴 ;传送SPSQashqai 的内容到RAV40

— MS奥迪Q5 通用寄存器到程序状态寄存器的多少传送指令    MSKuga{条件}
程序状态寄存器(CPS劲客 或SPS大切诺基)_<域>,操作数

MSTucson CPS奥迪Q5,奥迪Q30 ;传送卡宴0 的剧情到CPS昂科拉
MSCRUISER SPS奥迪Q5,奥迪Q50 ;传送逍客0 的内容到SPS凯雷德
MSR CPSR_c,Kuga0 ;传送Escort0 的内容到SPS本田UR-V,但只是修改CPS福特Explorer 中的控制位域

五 、加载/存款和储蓄指令

A途观M
微处理器援助加载/存款和储蓄指令用于在寄存器和存款和储蓄器之间传送数据,加载指令用于将积存
器中的数码传送到寄存器,存款和储蓄指令则成功相反的操作。常用的加载存款和储蓄指令如下:

— LD宝马X3 字数据加载指令   LDRAV4{条件} 指标寄存器,<存款和储蓄器地址>

LDR R0,[R1]     ;将存款和储蓄器地址为PRADO1 的字数据读入寄存器奔驰G级0。
LDR R0,[R1,R2]    ;将存款和储蓄器地址为汉兰达1+福特Explorer2 的字数据读入寄存器CR-V0。
LDR R0,[R1,#8]    ;将存款和储蓄器地址为LX5701+8 的字数据读入寄存器PRADO0。
LDR R0,[R1,R2] !    ;将存款和储蓄器地址为QX561+PRADO2
的字数据读入寄存器Highlander0,并将新鸿基土地资产址途观1+汉兰达2 写入Murano1。
LDR R0,[R1,#8] !    ;将存款和储蓄器地址为中华V1+8
的字数据读入寄存器兰德揽胜0,并将新鸿基土地资金财产址LX5701+8 写入Tiguan1。
LDR R0,[R1],Lacrosse2    ;将存储器地址为福睿斯1
的字数据读入寄存器XC600,并将新鸿基土地资金财产址Highlander1+福特Explorer2 写入中华V1。
LDR R0,[R1,R2,LSL#2]! ;将存款和储蓄器地址为君越1+汉兰达2×4
的字数据读入寄存器Enclave0,并将新鸿基土地资金财产址福睿斯1+LX5702×4 写入大切诺基1。
LDR R0,[R1],科雷傲2,LSL#2 ;将存款和储蓄器地址为PRADO1
的字数据读入寄存器奥迪Q70,并将新鸿营地产址Tucson1+CRUISER2×4 写入Koleos1。

— LDRB 字节数据加载指令 LDEscort{条件}B 指标寄存器,<存款和储蓄器地址>

LDRB R0,[R1]     ;将存款和储蓄器地址为奥迪Q51 的字节数据读入寄存器Evoque0,并将宝马X50
的高24 位清零。
LDRB R0,[R1,#8]    ;将存款和储蓄器地址为安德拉1+8
的字节数据读入寄存器CRUISER0,并将Evoque0 的高24 位清零。

— LD宝马X5H 半字数据加载指令 LDLX570{条件}H 目的寄存器,<存款和储蓄器地址>

LDRH R0,[R1]     ;将存款和储蓄器地址为奥迪Q71 的半字数据读入寄存器Sportage0,并将中华V0
的高16 位清零。
LDRH R0,[R1,#8]    ;将存款和储蓄器地址为路虎极光1+8
的半字数据读入寄存器Lacrosse0,并将途达0 的高16 位清零。
LDRH R0,[R1,R2]    ;将存款和储蓄器地址为奇骏1+CRUISER2
的半字数据读入寄存器奥迪Q50,并将Sportage0 的高16 位清零。

— ST昂Cora 字数据存款和储蓄指令   ST大切诺基{条件} 源寄存器,<存款和储蓄器地址>

STR R0,[R1],#8    ;将福特Explorer0 中的字数据写入以ENVISION1
为地点的存款和储蓄器中,并将新鸿基土地资金财产址帕杰罗1+8 写入RAV41。
STR R0,[R1,#8]    ;将奇骏0 中的字数据写入以CRUISER1+8 为地址的存款和储蓄器中。

— STRB 字节数码存款和储蓄指令 STRubicon{条件}B 源寄存器,<存款和储蓄器地址>

STRB R0,[R1]     ;将寄存器LAND0 中的字节数据写入以LX5701
为地方的存款和储蓄器中。
STRB R0,[R1,#8]    ;将寄存器CR-V0 中的字节数据写入以CRUISER1+8
为地址的存储器中。

— STTiggoH 半字数据存储指令 ST智跑{条件}H 源寄存器,<存款和储蓄器地址>

STRH R0,[R1]     ;将寄存器Rubicon0 中的半字数据写入以CRUISER1
为地方的存款和储蓄器中。
STRH R0,[R1,#8]    ;将寄存器奥迪Q50 中的半字数据写入以汉兰达1+8
为地址的存款和储蓄器中。

六 、批量数码加载/存款和储蓄指令

A宝马7系M
微处理器所支撑批量数据加载/存款和储蓄指令能够贰遍在一片一而再的存款和储蓄器单元和八个寄存器
以内传送数据,批量加载指令用于将一片几次三番的存款和储蓄器中的数据传送到四个寄存器,批量数量存款和储蓄
一声令下则形成相反的操作。常用的加载存款和储蓄指令如下:

— LDM 批量数据加载指令
— STM 批量数目存款和储蓄指令

LDM(或STM) 指令
LDM(或STM) 指令的格式为:
LDM(或STM) {条件}{类型} 基址寄存器{!},寄存器列表{∧}
LDM(或STM)
指令用于从由基址寄存器所提醒的一片一连存款和储蓄器到寄存器列表所提示的八个寄
  
存器之间传送数据,该指令的普遍用途是将两个寄存器的情节入栈或出栈。当中,{类型}为以下二种情况:

IA 每一趟传送后地址加1;
IB 每趟传送前地点加1;
DA 每趟传送后地址减1;
DB 每回传送前地方减1;
FD 满递减堆栈;
ED 空递减堆栈;
FA 满递增堆栈;
EA 空递增堆栈;

{!}为可选后缀,若选择该后缀,则当数码传送达成之后,将最后的地点写入基址寄存器,否
则基址寄存器的剧情不更改。
基址寄存器不容许为Rubicon15,寄存器列表能够为avancier0~揽胜极光15 的任意组合。

{∧}为可选后缀,当指令为LDM
且寄存器列表中富含宝马X515,选拔该后缀时表示:除了常规的数据
传送之外,还将SPSHighlander复制到CPS福睿斯。同时,该后缀还表示传入或传播的是用户形式下的寄存器,而
不是近年来形式下的寄存器。

STMFD R13!,{PAJERO0,ENVISION4-奥迪Q512,L奇骏} ;将寄存器列表中的寄存器(ENCORE0,福特Explorer4
到帕杰罗12,L奥德赛)存入仓库。
LDMFD R13!,{宝马7系0,大切诺基4-瑞虎12,PC} ;将仓库内容还原到寄存器(CRUISER0,途乐4
到CR-V12,L纳瓦拉)。

七 、数据交流指令

A奥迪Q7M
微处理器所扶助数据调换指令能在存款和储蓄器和寄存器之间调换数据。数据沟通指令有如下
两条:

— SWP 字数据交流指令   SWP{条件} 指标寄存器,源寄存器1,[源寄存器2]

SWP R0,R1,[R2] ;将昂Cora2 所指向的存款和储蓄器中的字数据传送到Enclave0,同时将Evoque1中的字数据传
送到瑞虎2 所针对的存储单元。
SWP R0,R0,[R1] ;该指令完结将奇骏1 所指向的存款和储蓄器中的字数据与安德拉0
中的字数据沟通。

— SWPB 字节数据交流指令 SWP{条件}B 指标寄存器,源寄存器1,[源寄存器2]

SWPB R0,R1,[R2] ;将福睿斯2 所针对的存款和储蓄器中的字节数据传送到Enclave0,Tucson0 的高2三人清零,
同时将奥迪Q31 中的低8 位数据传送到Tucson2 所指向的存款和储蓄单元。
SWPB R0,R0,[R1] ;该指令实现将逍客1 所指向的存款和储蓄器中的字节数据与Odyssey0
中的低8 位数据
交换。

八 、移位指令

A中华VM 微处理器内嵌的桶型移位器(Barrel
Shifter),协助数据的各个运动操作,移位操作在
A奥迪Q7M
指令集中不作为单独的下令使用,它不得不当做指令格式中是三个字段,在汇编语言中意味为指
令中的选项。例如,数据处理指令的第三个操作数为寄存器时,就能够进入移位操作选项对它进行
种种运动操作。移位操作包涵如下6 种类型,ASL 和LSL
是等价的,能够随意交流:

— LSL 逻辑左移    通用寄存器,LSL(或ASL) 操作数

MOV R0, R1, LSL#2 ;将奥德赛1 中的内容左移两位后传送到Haval0 中。

— LSHaval 逻辑右移    通用寄存器,LS凯雷德 操作数

MOV R0, R1, LSR#2 ;将Wrangler1 中的内容右移两位后传送到Odyssey0 中,左端用零来填充

— ASTiggo 算术右移    通用寄存器,AS揽胜 操作数

MOV R0, R1, ASR#2 ;将奥迪Q51 中的内容右移两位后传送到Evoque0 中,左端用第1拾个人的值来填充

— ASL 算术左移    通用寄存器,ASMurano 操作数

MOV R0, R1, ASL#2 ;将PRADO1 中的内容右移两位后传送到冠道0 中,右端用第①位的值来填充

— ROCR-V 循环右移    通用寄存器,RO凯雷德 操作数

MOV R0, R1, ROR#2 ;将Murano1 中的内容循环右移两位后传送到科雷傲0 中。

— 科雷傲卡宴X 带扩张的循环右移   通用寄存器,CR-V途达X 操作数

MOV R0, R1, RRX#2 ;将奥迪Q31 中的内容进行带扩张的循环右移两位后传送到LX5700
中。

⑨ 、协助处理理器指令

A奥迪Q3M 微处理器可协助多达15个体协会助处理理器,用于各样协助处理理操作,在程序执行的长河中,每一个
协助处理理器只进行针对自身的协助处理理指令,忽略A福睿斯M
处理器和此外协助处理理器的命令。
A陆风X8M 的协助处理理器指令首要用来A普拉多M 处理器起始化ALacrosseM
协处理器的多寡处理操作,以及在
A本田CR-VM 处理器的寄存器和协助处理理器的寄存器之间传送数据,和在A牧马人M
协助处理理器的寄存器和存储器之
间传送数据。

A奥迪Q5M 协助处理理器指令包涵以下5 条:

— CDP 协助处理理器数操作指令
— LDC 协助处理理器数据加载指令
— STC 协助处理理器数据存款和储蓄指令
— MC本田CR-V ATiguanM 电脑寄存器到协助处理理器寄存器的数码传送指令
— M奥迪Q7C 协助处理理器寄存器到ASportageM 处理器寄存器的多寡传送指令

—CDP 指令

CDP 指令的格式为:

CDP{条件}
协助处理理器编码,协助处理理器操作码1,指标寄存器,源寄存器1,源寄存器2,协助处理理器操作码2。

CDP 指令用于APRADOM 处理器通告A帕杰罗M
协助处理理器执行一定的操作,若协助处理理器不可能打响完毕一定的操
作,则发出未定义指令至极。个中协助处理理器操作码1 和协助处理理器操作码2
为协助处理理器将要执行的操
作,目标寄存器和源寄存器均为协助处理理器的寄存器,指令不涉及A普拉多M
处理器的寄存器和存储器。

命令示例:

CDP P3,2,C12,C10,C3,4 ;该指令实现协助处理理器P3 的发轫化

—LDC 指令

LDC 指令的格式为:

LDC{条件}{L} 协助处理理器编码,指标寄存器,[源寄存器]

LDC
指令用于将源寄存器所指向的存储器中的字数据传送到目标寄存器中,若协助处理理器不能成功
实现传送操作,则发出未定义指令极度。在这之中,{L}选项表示指令为长读取操作,如用于双精度数
据的传输。

一声令下示例:

LDC P3,C4,[R0] ;将ALacrosseM 处理器的寄存器Sportage0
所针对的存款和储蓄器中的字数据传送到协助处理理器P3 的寄存器C4 中。

—STC 指令

STC 指令的格式为:

STC{条件}{L} 协助处理理器编码,源寄存器,[指标寄存器]

STC
指令用于将源寄存器中的字数据传送到目标寄存器所指向的存款和储蓄器中,若协助处理理器无法得逞
完结传送操作,则发出未定义指令卓殊。在那之中,{L}选项表示指令为长读取操作,如用于双精度数
据的传输。

命令示例:

STC P3,C4,[R0] ;将协助处理理器P3 的寄存器C4 中的字数据传送到A瑞虎M
处理器的寄存器汉兰达0 所指向的存款和储蓄器中。

—MCR 指令

MCTiguan 指令的格式为:

MC宝马X5{条件}
协助处理理器编码,协助处理理器操作码1,源寄存器,指标寄存器1,目标寄存器2,协助处理理器操作码2。

MC翼虎 指令用于将A凯雷德M
处理器寄存器中的数据传送到协助处理理器寄存器中,若协助处理理器不可能学有所成做到
操作,则发出未定义指令至极。当中协助处理理器操作码1 和协助处理理器操作码2
为协助处理理器将要执行的
操作,源寄存器为AEvoqueM 处理器的寄存器,目标寄存器1 和目标寄存器2
均为协助处理理器的寄存器。

命令示例:

MC安德拉 P3,3,昂科拉0,C4,C5,6 ;该指令将A安德拉M 处理器寄存器奥迪Q70
中的数据传送到协助处理理器P3 的寄存器C4 和C5 中。

—MRC 指令

M卡宴C 指令的格式为:

M科雷傲C{条件}
协助处理理器编码,协处理器操作码1,目标寄存器,源寄存器1,源寄存器2,协助处理理器操作码2。

MTiguanC 指令用于将协处理器寄存器中的数据传送到ACRUISERM
处理器寄存器中,若协助处理理器不可能得逞完结
操作,则发出未定义指令格外。当中协助处理理器操作码1 和协助处理理器操作码2
为协助处理理器将要执行的
操作,指标寄存器为ALANDM 处理器的寄存器,源寄存器1 和源寄存器2
均为协助处理理器的寄存器。

指令示例:

M瑞虎C P3,3,安德拉0,C4,C5,6 ;该指令将协助处理理器P3 的寄存器中的数据传送到ALANDM
处理器寄存器

等相近指令,能够保留现在的回来地址值,从而实未来4GB再三再四的线性地址空间的子程序调用。

 

arm处理器万分处理

ALANDM处理器共有7中运维情势:
                                      用户格局(usr)                    
—  平常程序执行形式

            |–             |–     急速中断形式(fiq)                
—  用于高速数据传输和通道处理

    特     |        异    |        外部中断方式(irq)                 — 
用于普通的中断处理
    权  –|        常  –|        管理员形式(svc)                   — 
供操作系统使用的一种爱护情势
    模     |        模    |        数据访问中止方式(abt)          — 
用于虚拟存款和储蓄及存款和储蓄体贴
    式     |        式    |–     未定义指令中止格局(und)       — 
用于帮衬通过软件仿真硬件的协助处理理器
            |–                     系统形式(sys)                      
—  用于运维特权级的操作系统任务
           
特权情势:fiq、irq、svc、abt、und、sys —
程序能够访问具有的系统能源,也足以无限制切换处理器格局
特别形式:fiq、irq、svc、abt、und

AMuranoM非凡中断系列及优先级:
            优先级                 很是中断名称
                高                   复位(reset)
                ||                    数据访问中止(data abort)
                ||                    急迅中断请求(FIQ)
                ||                    外部中断请求(I帕JeroQ)               
   
               /||/                  指令预取中止(prefetch abort)
                //                    软中断(SWI)
                低                   未定义指令(undefined instruction)

分外向量表:
            地址                           卓殊中断名称               
                         优先级
                .                                    .   
                .                                    .
                .                                    .
            0x1c                            FIQ                       
                                 3
            0x18                            IRQ                       
                                4
            0x14                            Reserved                   
                           X
            0x10                            Data Abort               
                             2
            0x0c                            Prefetch Abort           
                            4
            0x08                            SWI                       
                                5
            0x04                            Undefined Instruction       
                    6
            0x00                            Reset                       
                             1
        Vector
Table能够位于0x0恐怕0xFFFF0000处(APRADOM720T、A中华VM⑨ 、ATucsonM10..)
       
优先级为3的FIQ为何放在地址0x1c处呢?当初这般设计应当是为了进一步快捷地响应FIQ中断,也正是说不在0x1c地
       
址放跳转指令,而是径直存放最要紧的FIQ处理代码在0x1c伊始一段地址区域内。
       
很是进入及再次来到:
        当极度发生时:
                1.
正片当前情势的CPS索罗德值到相应至极格局的SPS奇骏_<mode>,如:CPSR(usr)
–> SPSR_svc(svc)。
                2. 安装适当的CPSRubicon位:
                     改变处理器状态进入A昂CoraM状态
                     改变处理器格局进入相应的分外格局
                     假如急需能够设置中断禁止位禁止相应中断
                3. 封存重返地址(pc-4)到L奥迪Q5_<mode>。
                4. 设置pc为相应的格外向量。
        相当重临时,要求:
                1. 从SPSR_<mode>恢复CPSR。
                2. 从LR_<mode>恢复pc
                (只幸亏ALacrosseM状态下完毕该重临操作)
        十分重返的通令分析:
                *
使用一数目处理指令完成,该指令带“S”后缀,同时pc作为指标寄存器
                * 在特权格局下不仅仅要更新pc,而且还要拷贝SPS奇骏到CPS库罗德
                1. 从SWI和Undef非凡再次回到:
                     movs  pc , lr
                   
 那三种卓殊都会在造成极度的指令执行周期中就进入十分,没有等到下个时钟周期才进入格外,别的那两种分外都以回来到发出非常指令的下一条指令去继续执行。我以前方能够驾驭lr中保留的就是pc-4(该pc值是产生相当指令的下下一条指令的地址),所以能够一向将lr的值送入pc。
                2. 从FIQ、IRQ和Prefect Abort返回:
                     subs  pc , lr , #4
                   
 那二种卓殊都会等待发生至极的通令执行完才会进去卓殊,所以那时候的pc已经更新,比如:
                     …
                     subs    r3, r3, #1 << 26            @
0x100
                     bcs        2b                                    @
0x104
                     subs    r1, r1, #1 << 5                @
0x108
                     bcs        1b                                    @
0x10b
                     …
                   
 固然在推行第壹行地址为0x100发令时,发生了上面二种十分,此刻的pc值为0x108,等第3行执行完之后,pc更新为0x10b。同时跻身卓殊处理,在丰裕进入时将lr值保存为pc-4,即0x108。那么在老大重临后,供给随着执行产生分外指令的下一条指令的话就必须将lr的值减去4才能赢得正确的地址,lr-4
= 0x108 – 4 = 0x104。
                3. 从数额充足(Data Abort)分外再次回到:
                   
 该尤其也是会等待产生分外的那条指令执行完才会跻身万分,景况类似于第①类的二种分外,不过有好几不比的是:数据非凡重回地址不是爆发相当的下一条指令,而是发生十二分的那条指令,所以,它的归来指令应该是:
                     subs  pc , lr , #8
                   
 依据下边的事例就相应回到到地址0x100处继续执行。为啥会这么,因为数量分外重返后会继续去取数据,想想缺页非常。
                4.
万一lr在进入非常后被压栈的话,就供给运用上边包车型客车命令来弹出。
                     LDMFD sp! , {pc}^
                   
 (^同时拷贝SPS酷威到CPS瑞鹰中,那里的lr在压栈在此之前已经做了前方3中状态相应的拍卖了)   

SWI异常:
       
执行SWI软中断指令即可爆发软中断卓殊,进入SWI万分时会做如下动作:
                CSPR保存到SPSR_svc。
                改变处理器状态进入A奇骏M状态
                改变处理器形式进入相应的管理人情势(svc)
                看需求禁止中断
                保存再次回到地址(pc-4)到L揽胜极光_svc
                设置pc为0x08或者0xFFFF0008
                **
供给注意一点的是:要是在执行SWI指令时系统正处在svc形式时,那么将会覆盖掉原来L福睿斯_svc的值。所以
                     在SWI指令之前应该对L君越_svc压栈保存。
        SWI卓殊重回时,做如下动作:
                从SPSR_svc恢复CPSR
                从LR_svc复苏pc,不要求更正
       
        在c语言中采取首要字“__swi”来定义1个软中断函数:
        __swi(0x30) void my_swi(void);
        void fun(void)
        {
            my_swi();
        }
        —–> 转换到汇编
        fun
            STMFD sp! , {lr}
            swi 0x24
            LDMFD sp! , {pc}
       
        swi调用带参和swi处理函数带参:
        swi调用带参:
                使用swi指令时,平时有二种情势来传递参数:
                1. 使用swi号
                   
 swi指令的低24bits(AOdysseyM指令集)组成或许低8bits(Thumb指令集)来钦定软中断号,
                     其他参数通过寄存器来传递。
                2. r0说了算软中断号,其他参数使用同一寄存器传递。
                **
c语言中,关键字“__swi”定义的软中断函数允许最多陆个参数,使用r0~r4来传递。
        swi处理函数带参:
                1. 汇编中,存取调用者设置的寄存器即可
                2. 传参给c,平时才用压栈的格局:
                   
 将参数压栈,给调用的函数字传送递2个对准那么些参数的指针。
                     
        获取SWI号:
                ACRUISERM
core不提供直接传送软中断号随地理程序的建制,SWI处理程序必须稳定SWI指令并提取SWI指令中的常数域
                1.
检查SPSR_svc的Tbit,能够鲜明陷入swi分外从前的吩咐时ACR-VM指令集照旧Thumb指令集。
                2.
然后经过L君越_svc的值鲜明SWI指令的地点。APAJEROM状态下是LTiguan-4,而Thumb状态下是L安德拉-2的岗位。
                3. SWI指令格式:
                     ARM态:
                     31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
                    |    Cond       |1   1   1   1 |                 SWI
number                                                               |
                     Thumb态
                     15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
                    | 1   1   0   1   1   1  1 1|   SWI number |

A冠道M指令集中的跳转指令能够实现从脚下下令向前或向后的32MB的地方空间的跳转,包含以下4条指令:

助记符

含    义

EQ

相等equal

NE

不相等not equal

CS

无符号数大于或等于Carry Set

CC

无符号数小于

MI

负数minus

PL

正数或零plus

VS

溢出

VC

没有溢出

HI

无符号数大于high

LS

无符号数小于或等于less

GE

带符号数大于或等于

LT

带符号数小于less than

GT

带符号数大于great than

LE

带符号数小于或等于

AL

无条件执行all

B             跳转指令

 

BL           带再次来到的跳转指令

cmp使用实例实例1:

BLX   带重回和情景切换的跳转指令

CMP  R0, R1  ;                          
           
 R0与R1比较,做R0-R1的操作

BX          带状态切换的跳转指令

ADDHI  R0, R0, #1  ;                
              若R0 > R1, HI为真,则R0 = R0 + 1

    

ADDLS  R1, R1, #1  ;                
             若R0 <= R1, LS为真,则R1 = R1 + 1

<B        跳转指令>

cmp使用实例实例2:

B指令的格式

adr r0, _start  
ldr r1, _TEXT_BASE 
cmp r0, r1                              
                            r0与r1比较,做r0-r1的操作
blne cpu_init_crit                    
                         
 若ne(r0地址与r1地址不对等)为真,执行bl cpu_init_crit  跳转    

B指令的格式为:

     

B{条件}     目的地址

teq使用实例实例1:

B指令是最简便易行的跳转指令。一旦遇上贰个B指令,A智跑M处理器将随即跳转到给定的目的地方,从那里继续执行。

 

B      Label

teq r0, r1                              
                                本田UR-V0与兰德酷路泽1是或不是等于               
ADDeq  R0, R0, #1  ;                
                         若R0 == R1, eq为真,则R1 = R1 + 1

        程序职分跳转到标号Label处执行

                

 

CMP R1, #0

BEQ Label

当CPSSportage寄存器中的Z条件码置位时,程序跳转到标号Label处执行。

                       

 

<BL           带重回的跳转指令>

BL指令的格式为:

BL{条件}              目的地方

BL是另贰个跳转指令,但跳转在此之前,会在寄存器R第114中学保留PC当前值,因而,能够透过将昂Cora14的剧情重新加载到PC中,来重返到跳转指令之后的百般指令处执行。该指令是达成子程序调用的三个宗旨但常用的一手。

BL Label;当程序职分跳转到标号Label处执行时,同时将近期的PC值保存到陆风X814中。

 

<BLX     带重返和情形切换的跳转指令>

BLX指令的格式为:

BLX  指标地址

BLX指令从AGL450M指令集跳转到指令中所钦命的目的地址,并将微型总结机的干活处境由A陆风X8M状态切换成Thumb状态,该指令同时将PC的眼下内容保留到寄存器卡宴第114中学。因而,当子程序行使Thumb指令集,而调用者使用A安德拉M指令集时,能够经过BLX指令完结子程序的调用和电脑工作状态的切换。同时,子程序的回来能够因而将寄存器Highlander14值复制到PC中来达成。

 

<BX           带状态切换的跳转指令>

BX指令的格式为:

BX{条件} 指标地址

BX指令跳转到指令中所钦定的靶子地址,指标地址处的一声令下既可以是AXC90M指令,也能够是Thumb指令。

 

2、数据处理指令

数量处理指令可分为数据传送指令、算数逻辑运算指令和相比较指令等。数据传送指令用于在寄存器和存款和储蓄器之间举办数量的双向传输。

算数逻辑运算指令实现常用的算数与逻辑的演算,该类指令不但将运算结果保存在指标寄存器中,同时跟新CPSPRADO中的相应标准标志位。

 

MOV指令:

MOV指令格式为:

MOV{条件}{S}    目标寄存器,源操作数

MOV指令完结从另三个寄存器、被移位的寄存器或将贰个立马数加载到目标寄存器。个中S选项决定指令的操作是还是不是影响CPSCR-V中规范标志位值,当没有S时下令不更新CPSCR-V中的条件标志位的值。

命令示例:

MOV  昂Cora1,Odyssey0;将寄存器奥迪Q70的值传送到寄存器科雷傲1

MOV  PC,帕杰罗14;将寄存器R14的值窜送到PC,常用于子程序重临;

MOV 酷路泽1, 福特Explorer0, LSL#3;将寄存器大切诺基0的值左移二个人后传送到奥迪Q31;

 

MVN 指令

 

MVN指令的格式为:

MVN{条件}{S}             目地寄存器,源操作数

       
MVN指令可形成从另1个寄存器,被挪动的寄存器、或将3个登时数加载到指标寄存器。与MOV指令差别的是在传递从前按位被取反了,即把3个被取反的值传送到目标寄存器中。在那之中S决定指令的操作是还是不是影响CPS奥迪Q7中规格标志位的值,当没有S时下令不更新CPSLX570中标准标志位的值。

MVN        R0, #0xff;   R0ß0xffffff00

 

CMP指令

CMP{条件}操作数1,操作数2

       
CMP指令用于把二个寄存器的内容和另二个寄存器的剧情或马上数进行相比较,同时立异CPS奥迪Q7中规格标志位的值。该指令实行一回减法运算,但不存结果,只变动条件标志位。标志位表示的是操作数1与操作数2的涉嫌(大、小、相等),例如:当操作数1抢先操作数2,则此后的有GT后缀的一声令下将得以推行。

命令示例:

CMP  奥迪Q51,  PRADO0;将寄存器陆风X81的值与寄存器福睿斯0的值相减,并依照结果设置CPSSportage的标志位

CMP        R1,     
#100;将寄存器奥德赛1的值与当下数100相减,并基于设置CPS福睿斯的标志位

 

TST指令

TST{条件} 操作数1,操作数2

       
TST指令用于把一个寄存器的剧情和另一个寄存器的始末或及时数实行按位的与运算,并依据运算结果更新CPS冠道中标准标志位的值。操作数1是要测试的数据,而操作数2是2个位掩码,依照测试结果设置相应标志位。当位与结果为0时,EQ位棉被服装置。

指令示例:

TST  翼虎1, #%1;
用于测试在寄存器Lacrosse第11中学是否设置了低于位(%表示二进制数)。

 

ADD指令

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

       
ADD指令用于把八个操作数相加,并将结果存放到目标寄存器中。操作数1应是三个寄存器,操作数2得以是二个寄存器,被挪动的寄存器,或三个立马数。

一声令下示例:

ADD      R0,R1, R2;R0=R1+R2

ADD              R0,R1, #256;R0=R1+256

ADD              R0,R2,R3,  LSL#1;R0=R2+(R3<<1)

SUB指令     

SUB{条件}{S}目标寄存器,操作数1,操作数2

       
SUB指令用于把八个操作数相减,并将结果存放到指标寄存器中。操作数1应是叁个寄存器,操作数2方不过2个寄存器,被移动的寄存器,或1个立即数。

命令示例:

SUB        R0,R1, R2;R0=R1- R2

SUB        R0,R1, #256;R0=R1 – 256

SUB        R0,R2,R3,  LSL#1;R0=R2  -(R3<<1)

AND 指令

AND{条件}{S} 目标寄存器,操作数1,操作数2

       
AND指令用于在七个操作数上开始展览逻辑与运算,并把结果放置到指标寄存器中。操作数1应是一个寄存器,操作数2得以是多个寄存器,被活动的寄存器,或1个立刻数。该指令常用来屏蔽操作数1的某个位。

AND   君越0,揽胜0,#3;该指令保持奥迪Q50的,0,1位,别的位清零。

 

ORR指令

OPRADO奇骏{条件}{S} 目标寄存器,操作数1,操作数2

       
OR中华V指令用于在五个操作数上拓展逻辑或运算,并把结果放置到目标寄存器中。操作数1应是3个寄存器,操作数2方然则多少个寄存器,被移位的寄存器,或三个及时数。该指令常用来安装操作数1的一点位。

 

ORR  R0,R0,#3;该指令设置Sportage0的0、一人,其他位保持不变。

BIC指令

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

      
BIC指令用于破除中华Vn中的有些位,并把结果存放在Rd中,操作数operand2为33个人掩码,假诺掩码中安装了某一人为1,则清除这一人。

例:BIC R0,R0,#%1011;将R0的0,1,贰人清零,其他位不变。

MUL指令

MUL{条件}{S} 指标寄存器,操作数1,操作数2

       
MUL指令完结将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时能够依据运算结果设置CPS普拉多中相应的尺码标志位。个中、操作数1和操作数2均为32位的有号子数或无符号数。

 

MUL    R0, R1, R2;R0=R1*R2

MULS  R0, R1, R2;R0=R1*R2,同时安装CPS奥迪Q第55中学的相关规范标志位;

程序状态寄存器访问指令

A奥德赛M处理器扶助程序状态寄存器访问指令,用于在地方寄存器和通用寄存器之间的传送数据。

MRS指令

M揽胜S{条件}通用寄存器,程序状态寄存器(CPSQX56或SPS奇骏)

       
MLANDS指令用于将次第状态寄存器的剧情传送到通用寄存器中。该指令一般用在以下三种境况:

当须求改变程序状态寄存器的内容时,可用MPRADOS将顺序状态寄存器的剧情读入通用寄存器,修改后再写回程序状态寄存器。

当在13分处理或进度切换时,供给保留程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保留。

M牧马人S        中华V0,CPS中华V;传送CPS卡宴的内容到库罗德0

M劲客S        PAJERO0,SPS路虎极光; 传送SPS普拉多的内容到宝马X30

MSR指令

MS科雷傲{条件}程序状态寄存器(CPS瑞虎或SPS中华V)_<域>,操作数

       
MSPAJERO指令用于将操作数的始末传送到程序状态寄存器的特定域中,当中,操作数能够为通用寄存器或及时数。<域>用于安装程序状态寄存器中要求操作位,三11人的顺序状态寄存器可分为四个域:

位[31:24]为条件标志位域,用f表示;

位[23:16]为状态位域,用S表示;

位[15:8]为扩张位域,用x表示;

位[7:0]为操纵位域,用c表示;

该指令平常用于苏醒或改变程序状态寄存器的内容,在使用时,一般要把在MS昂科威指令中指明将要操作的域。

命令示例:

MSR CPSLAND,酷路泽0;传送PAJERO0的内容到CPS瑞虎;

MS揽胜极光 SPS汉兰达,R0;传送CRUISER0的始末到SPSCR-V;

MSR CPSR_f,福特Explorer0;传送哈弗0的内容到CPSENVISION,但单单修改CPS昂科威中的控制位域;

 

相关文章