ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、RSB、MUL、AND、ORR、EOR、BIC、CMP、TST、TEQ、LSL、LSR、ASR、RORV

ARM汇编:数据处理指令集:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、RSB、MUL、AND、ORR、EOR、BIC、CMP、TST、TEQ、LSL、LSR、ASR、RORVARM指令集——数据处理指令数据处理指令有:MOV、ADD、ADDS、ADC、SUB、SUBS、SBC、RSB、MUL、AND、ORR、EOR、BIC、CMP、TST、TEQ、LSL、LSR、ASR、RORV数据处理指令语法<操作{<cond>}{S}><Rd>,<Rn&gt…

大家好,又见面了,我是你们的朋友全栈君。

                  ARM指令集——数据处理指令

数据处理指令有:

MOV、ADD、ADDS、ADC、SUB、

SUBS、SBC、RSB、MUL、AND、

ORR、EOR、BIC、CMP、TST、

TEQ、LSL、LSR、ASR、RORV

数据处理指令语法

<操作{<cond>}{S}> <Rd>, <Rn>, <Operand2>
<操作码> <目标寄存器Rd> <第一操作寄存器Rn> <第二操作数Operand2>
;第一个位置必须是寄存器,第二操作数可以是寄存器,也可以是立即数

数据传送指令  MOV

mov r1, #0x1        ;r1 = 0x1    0x1 是立即数
mov r2, r1          ;r2 = r1 
mvn r3, r2          ;r3 = ~r2
mov r1, 0xffffff00  ;0xffffff00 不是立即数,只是编译器在编译阶段对其进行了替换
mvn r1, 0x000000ff  ;替换的指令

;一条数据传送指令 mov reg, #n mov reg占用 bit[31:12],bit[11:0]留给立即数使用,因此立即数自包含2^12个
;一个立即数由 bits[8:0]循环右移 2 * bits[11:9]得到。(一个八位的数循环右移偶数次得到)
;立即数的本质是包含于指令中的数,占用指令本身的空间

加法指令 ADD

;加法指令执行时,若没有进位 CPSR 'C' 位置 0
mov r0, #1
mov r1, #1
add r2, r1, r0  ;r2 = r1 + r0
add r2, r1, #2  ;r2 = r1 + 2

 数据操作对CPSR的影响 

;默认情况下,数据处理指令不影响条件码标志位,但可以选择通过添加“S”来影响标志位。
mov r1, #0mov r2, #-1
adds r3, r1, r2 

带进位的加法指令 ADC

;两个64位数相加,第一个64位的低32位放在 r0,高位放到 r1,第二个64位数的低32位放在 r2 高32位放在 r3
;编写代码实现两个64位数的和,结果的低32位放在 r4 高32位放在 r5
mov r0, #0xfffffffe  ;第一个数的低32位
mov r1, #1  ;第一个数的高32位
mov r2, #0x5  ;第二个数的低32位 
mov r3, #1  ;第二个数的高32位
adds r4, r0, r2 
adc r5, r1, r3  ; adc运算的实质是 r5 = r1 + r3 + 'C'  'C'位 CPSR 进位标志

减法指令 SUB

;减法指令执行时,没有借位时 CPSR 'C' 位置 1
mov r0, #5
mov r1, #3
sub r2, r0, r1  ;r2 = r0 - r1

带借位的减法指令 SBC

mov r0, #1  ;第一个数的低32位
mov r1, #3  ;第一个数的高32位
mov r2, #3  ;第二个数的低32位
mov r3, #1  ;第二个输的高32位
subs r4, r0, r2  
sbc r5, r1, r3

逆向减法指令 RSB

mov r0, #3
rsb r1, r0, #5  ;r1 = 5 - r0

乘法指令 MUL

;为了提高效率,任何乘法指令不可以使用立即数
mov r0, #3
mov r1, #5
mov r2, r0, r1  ;r2 = r0 * r1

乘——累加指令 MLA

mla r3 ,r0, r1, r2  ;r3 = (r0 * r1) + r2

逻辑与指令 AND

mov r0, #0xf0
mov r1, #0x0f
and r2, r0, r1  ;r2 = r0 & r1

逻辑或指令 ORR

ORR指令的格式为:ORR{条件}{S} 目的寄存器,操作数1,操作数2

ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应该是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。
指令示例:ORR R0,R0,#3;该指令设置R0的0、1位,其余位保持不变。

orr r0,r0,#0xd3

0xd3=1101 0111
将r0与0xd3作算数或运算,然后将结果返还给r0,即把r0的bit[7:6]和bit[4]和bit[2:0]置为1

mov r0, #0xf0
mov r1, #0x0f
orr r2, r0, r1 ;r2 = r0 | r1

逻辑异或运算指令 EOR

mov r0, #0xf0
mov r1, #0x0f
eor r2, r0, r1  ;r2 = r0 ^ r1

位清零指令 BIC
指令格式:BIC{cond}{S} Rd,Rn,operand2 
BIC指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。指令示例:BIC R0,R0,#0x0F ;将R0最低4位清零,其余位不变。

mov r0, #0xff
bic r0, r0, #0xf  ;第二个操作数的每一位为 1 就把第一个操作数对应的位清零

 比较指令 CMP

cmp(compare)指令进行比较两个操作数的大小

例:cmp oprd1,oprd2

为第一个操作减去第二个操作数,但不影响第两个操作数的值,它影响flag的CF,ZF,OF,AF,PF

我们怎么判断大小呢?若执行指令后

(1)ZF

ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0。

(2)CF

当无符号时:

CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2

CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2

当有符号时:

若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2

若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2

若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2

若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2

最后两个可以作出这种判断的原因是,溢出的本质问题:

两数同为正,相加,值为负,则说明溢出

两数同为负,相加,值为正,则说明溢出

故有,正正得负则溢出,负负得正则溢出

补充: 两数相减,同号,则不溢出;两数为异号,结果与减数符号相同,则溢出。

;实质是一条减法指令
;没有目标register,用来比较两个数是否相等,结果放到 CPSR 的 'Z' 位判断
mov r0, #2
mov r1, #1
cmp r0, r1

 位测试指令 TST

;实质是与运算 常用于用来测试某一位或某几位是 0 还是 1,结果通过 CPSR 的 'Z' 位判断
tst r0, #0x3

 相等测试指令 TEQ

;实质是异或运算,测试两个数是否相等,两个数相等时异或结果位 0,通过 CPSR 的 'Z' 位判断
teq r0, r1

 移位指令 LSL、LSR、ASR、ROR

;需要与mov配合,不能够单独使用
mov r0, #0xff
mov r1, r0, lsl #4  ;将 r0 逻辑左移 4 位放入 r1 中
;LSL 逻辑左移:高位移出,低位补零
;LSR 逻辑右移:低位移出,高位补零
;ASR 算是右移:低位移出,高位补符号位
;ROR 循环右移:低位移出,高位补低位移出位

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135201.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 全网最详细ENSP安装教程,零基础网工小白必看![通俗易懂]

    全网最详细ENSP安装教程,零基础网工小白必看![通俗易懂]全网最详细ENSP安装教程,零基础网工小白必看!学习更多网络技术,扫码即可免费报名听课,更多资料加QQ群414605852材料准备在下载ENSP之前先安装这3个软件1.1.安装WinPcap1.2.安装Wireshark1.3.安装VirtualBoXENSP安装2.1.软件安装2.2.设备注册在注册设备之前,先保证没有任何设备在界面上然后点击菜单—>工具—>注册设

    2022年10月14日
  • BN 层原理解析_解析器

    BN 层原理解析_解析器1训练数据为什么要和测试数据同分布?看看下图,如果我们的网络在左上角的数据训练的,已经找到了两者的分隔面w,如果测试数据是右下角这样子,跟训练数据完全不在同一个分布上面,你觉得泛化能力能好吗?2为什么白化训练数据能够加速训练进程如下图,训练数据如果分布在右上角,我们在初始化网络参数w和b的时候,可能得到的分界面是左下角那些线,需要经过训练不断调整才能得到穿过数据点的分界面,这个…

  • JAVA位移运算「建议收藏」

    JAVA位移运算「建议收藏」1、java将负整数转成二进制这里以8位为例,只是为了表明过程,实际中java的int类型是4byte,也就是32位。二进制的首位是符号位,0表示正数,1表示负数,在java中,会对负数进行取反加一操作,进而计算出实际的十进制值。如10101010,此8位的二进制数首位是1,表示负数,所以对后面的七位进行取反加一操作,即0101010–>1010110,换成十进制的数就是86,再加上首位的1表示负数,结果就是-86。2、位移运算1)正数的右移:如10>>2,左边自动补0,右边移出

  • scala swing

    scala swing

  • SQL索引使用初步,(转)

    SQL索引使用初步,(转)

  • WSGI服务器

    WSGI服务器

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号