ARM64指令集2-算术与移位指令

接着上文,接着讲一下算术与移位指令,想要系统学习arm64指令的朋友们,添加一个关注,后面会持续更新的

条件操作码

添加图片注释,不超过 140 字(可选)

加法指令

普通的加法指令有下面几种用法。
使用立即数的加法。
使用寄存器的加法。
使用移位操作的加法。
1、使用立即数的加法指令

ADD <Xd|SP>,<Xn|SP>,#<imm>{,<shift>}

它的作用是把Xn/SP寄存器的值再加上立即数imm(0~4095),把结果写入Xd/SP寄存器里。Shift为0或12
2、使用寄存器的加法指令

ADD <Xd|SP>,<Xn|SP>,<R><m>{, <extend> {#<amount>}}

这条指令的作用是先把Rm寄存器做一些扩展,例如左移操作,然后再加上Xn/SP寄存器的值,把结果写入Xd/SP寄存器中
3、使用移位操作的加法指令

ADD <Xd>, <Xn>, <Xm>{, <shift> #<amount>}

这条指令的作用是先把Xm寄存器做一些移位操作,然后再加上Xn寄存器的值,结果写入Xd寄存器中。amount 0~63
4、ADDS指令
ADDS指令是ADD指令的变种,唯一的区别是指令执行结果会影响PSTATE寄存器的N、Z、C、V标志位,例如当计算结果发生无符号数溢出时,C=1。
5、ADC指令

ADC <Xd>, <Xn>, <Xm>

Xd寄存器的值等于Xn寄存器的值加上Xm寄存器的值加上C,其中C表示PSTATE寄存器的C标志位。

减法指令

普通的减法指令与加法指令类似,也有下面几种用法。
使用立即数的减法。
使用寄存器的减法。
使用移位操作的减法。
1、使用立即数的减法指令

SUB <Xd|SP>, <Xn|SP>, #<imm>{, <shift>}

把Xn/SP寄存器的值减去立即数imm,结果写入Xd/SP寄存器里。shift取值为0或12
2、使用寄存器的减法指令

SUB <Xd|SP>, <Xn|SP>, <R><m>{, <extend> {#<amount>}}

指令的作用是先对Rm寄存器做一些扩展,例如左移操作,然后Xn/SP寄存器的值减Rm寄存器的值,把结果写入Xd/SP寄存器中。
3、使用移位操作的减法指令

SUB <Xd>, <XnP>, <Xm>{, <shift> {#<amount>}}

先把Xm寄存器做一些移位操作,然后使Xn寄存器中的值减去Xm寄存器中的值,把结果写入Xd寄存器中。

4、SUBS指令
SUBS指令是SUB指令的变种,唯一的区别是指令执行结果会影响PSTATE寄存器的N、Z、C、V标志位。SUBS指令判断是否影响N、Z、C、V标志位的方法比较特别,

5、SBC指令
SBC是进位的减法指令,也就是最终的计算结果需要考虑PSTATE寄存器的C标志位。SBC指令的格式如下

SBC <Xd>, <Xn>, <Xm>

SBC指令的计算过程是,首先对第二个操作数做取反操作,然后把第一个操作数、第二个操作数相加,这个过程会影响PSTATE寄存器的C标志位,最后把C标志位加上。
SBC指令的计算公式为 Xd = Xn + NOT(Xm) + C

CMP指令

CMP指令用来比较两个数的大小。在A64指令集的实现中,CMP指令内部调用SUBS指令来实现。
1.使用立即数的CMP指令

CMP <Xn|SP>, #<imm>{,<shift>}

2.使用寄存器的CMP指令
使用寄存器的CMP指令的格式如下。

CMP <Xn|SP>, <R><m>{, <extend> {#<amount>}}

3、使用移位操作的CMP指令

CMP <Xn>,<Xm>{,<shift> #<amount>}

4.CMP指令与条件操作后缀
CMP指令常常和跳转指令与条件操作后缀搭配使用,例如条件操作后缀CS表示是否发生了无符号数溢出,即C标志位是否置位,CC表示C标志位没有置位。

cmp x1 , x2
b.cs label

移位指令

LSL 逻辑左移LSR 逻辑右移ASR 算术右移指令,最高位按照符号进行扩展ROR 循环右移指令

位操作指令

1、AND指令

AND  <Xd|SP> ,<Xn> , #<imm>AND <Xd>, <Xn>, <Xm>{,<shift #<amount>} shift表示移位操作,amount 0~63

2、ANDS指令

ANDS  <Xd|SP> ,<Xn> , #<imm>ANDS <Xd>, <Xn>, <Xm>{,<shift #<amount>} shift表示移位操作

与AND指令不一样的地方是它根据计算结果来影响PSTATE寄存器的N、Z、C、V 标志位
3、或操作指令

ORR  <Xd|SP> ,<Xn> , #<imm>ORR <Xd>, <Xn>, <Xm>{,<shift #<amount>} shift表示移位操作

4、异或指令

EOR  <Xd|SP> ,<Xn> , #<imm>EOR <Xd>, <Xn>, <Xm>{,<shift #<amount>} shift表示移位操作

位清除指令

BIC <Xd>, <Xn>, <Xm>{,<shift #<amount>} shift表示移位操作

先对Xm进行移位操作,然后再与Xn寄存器的值进行位清除操作,如果在掩码中置了某一位1,则清除这一位。未设置的掩码位保持不变,结果放到Xd寄存器中

CLZ指令

CLZ <Xd>,<Xn>

CLZ指令计算为1的最高位前面有几个为0的空位

位段操作指令

1、位段插入操作指令

BFI <Xd>,<Xn>,#<lsb>,#<width>

用Xn寄存器中的Bit[0,width-1]替换Xd寄存器中的Bit[lsb,lsb+width-1];Xd中的其他不变
2、位段提取指令

UBFX <Xd>,<Xn>,#<lsb>,#<width>

提取Xn中的Bit[lsb,lsb+width-1],然后存储到Xd中

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值