第3章ARM指令集第5课.docx
《第3章ARM指令集第5课.docx》由会员分享,可在线阅读,更多相关《第3章ARM指令集第5课.docx(10页珍藏版)》请在冰豆网上搜索。
![第3章ARM指令集第5课.docx](https://file1.bdocx.com/fileroot1/2023-3/19/b29006b9-2abe-4d34-a358-0dfc32172d21/b29006b9-2abe-4d34-a358-0dfc32172d211.gif)
第3章ARM指令集第5课
c.逻辑运算指令
c-1.AND
·功能:
将两个源操作数按位作逻辑与操作,将结果保存到目标寄存器中,可能会更新条件标志位。
·语法格式及伪码:
·使用:
用于提取寄存器内容的某些位(用一个掩码和寄存器中值做与操作,掩码中对应寄存器中要提取的位设为1,其余位设置为0)。
c-2.ORR
·功能:
将两个源操作数按位作逻辑或操作,将结果保存到目标寄存器中,可能会更新条件标志位。
·语法格式及伪码:
·使用:
用于将寄存器中的某些位设置为1(设计一个掩码和寄存器做或操作,掩码中对应寄存器中欲设置的位置为1,其余设置为0)。
·举例(将R2的高8位传送到R3的低8位)
c-3.EOR
·功能:
将两个源操作数按位作逻辑异或操作,将结果保存到目标寄存器中,可能会更新条件标志位。
·语法格式及伪码:
·使用:
用于将寄存器中某些位取反(将掩码中对应于寄存器要取反的位设置为1,其余设置为0)。
d.比较指令
d-1.CMP
·功能:
将两个源操作数相减,并更新条件标志位(后续指令可根据条件标志位决定是否被执行)。
·语法格式及伪码:
·使用:
不保存操作结果,只用来修改条件标志位。
d-2.CMN
·功能:
将两个源操作数相加,并更新条件标志位(后续指令可根据条件标志位决定是否被执行)。
·语法格式及伪码:
·使用:
当OP2=0或0x80000000(负零)时,CMP和CMN的操作结果不同。
e.测试指令
e-1.TST
·功能:
将两个操作数按位做逻辑与操作,根据结果更新条件标志位(和比较指令一样只能修改,结果被丢弃)。
·语法格式及伪码:
·使用:
用于测试寄存器中某个/些位是1还是0(测试多个位时,可以一个一个测试;测试是利用“Z”条件标志位的取值来实现的)。
e-2.TEQ
·功能:
将两个操作数按位做逻辑异或操作,根据结果更新条件标志位(和比较指令一样只能修改,结果被丢弃)。
·语法格式及伪码:
·使用:
用于比较两个操作数是否相同(利用“Z”实现)或两个操作数的符号是否相同(利用“N”实现)。
f.乘法指令
ARM有两类乘法指令:
1.32位的乘法指令;2.64位的乘法指令。
细分下来共有6条指令:
f-1.MUL
·功能:
实现两个32位数(有符号/无符号均可)的乘积,将结果放入一个32位寄存器中,可以更新条件标志位。
·语法格式及伪码:
·使用:
只保存结果的低32位,对于有/无符号数而言执行结果相同;对于ARMv5版本及以上,指令不影响C位(以前版本中指令执行后C值不确定);Rm、Rs和Rd为R15时指令的执行结果不可预测(不能使用R15)。
f-2.MLA
·功能:
实现两个32位数(有符号/无符号均可)的乘积,再加上第三个操作数,将结果放入一个32位寄存器中,可以更新条件标志位。
·语法格式及伪码:
·使用:
同MUL(MLAR0,R1,R2,R3)。
f-3.SMULL
·功能:
实现两个32位有符号数的乘积,64位的结果存放在两个寄存器中,可能修改条件标志位。
·语法格式及伪码:
·使用:
对于ARMv5版本及以上,指令不影响C位(以前版本中指令执行后C值不确定);Rm、Rs和RdHi/RdLo为R15时指令的执行结果不可预测(不能使用R15)。
//SMULLR1,R2,R3,R4R2=(R3×R4)[63:
32],R1=(R3×R4)[31:
0]
f-4.SMLAL
·功能:
实现两个32位有符号数的乘积,并与目的寄存器中的值相加,64位的结果存放在目的寄存器中,可能修改条件标志位。
·语法格式及伪码:
·使用:
同SMULL。
f-5.UMULL
·功能:
实现两个32位无符号数的乘积,64位的结果存放在两个寄存器中,可能修改条件标志位。
·语法格式及伪码:
·使用:
同SMULL。
f-6.UMLAL
·功能:
实现两个32位无符号数的乘积,并与目的寄存器中的值相加,64位的结果存放在目的寄存器中,可能修改条件标志位。
·语法格式及伪码:
·使用:
同SMULL。
g.其它----位清除指令(BIC)
·功能:
将寄存器的值和OP2的反码做逻辑与操作,将结果保存到Rd,可能更新条件标志位。
·语法格式及伪码:
·使用:
用于将寄存器中某些位设置为0(将掩码中对应位的值设置为1)。
h.补充----前导0个数计数指令(CLZ)
·功能:
用于计算操作数最高端0的个数(ARMv5及以上版本包含)。
·语法格式及伪码: