arm 汇编指令

2021-04-19  本文已影响0人  萌小菜

https://8biiit.github.io/2019/09/04/Arm%E6%8C%87%E4%BB%A4/

CSEL

替代方案是使用一组新的指令,包括CSEL(Conditional Select), CINC(Conditional Increase)和CSET(Conditional Set)等,以CSEL为例,它的用法是这样的:

CSEL <Xd>, <Xn>, <Xm>, <cond>
意思是如果条件(cond)满足,就选择(sel)Xn作为Xd,否则选择Xm作为Xd。比如下面这条语句:

CSEL X0, X0, X1, ge

表示的是如果X0>=X1(ge - greater or equal),那么X0=X0(保持不变),否则X0=X1。虽然比IT指令块的语法看起来要直观一些,但比起IT指令块能表达的层级关系,还是稍微弱了一点。

mov

mov 寄存器、 立即数 mov r0,#0x1 r0 = 0x1
mov 寄存器、 寄存器 mov r2, r1 r2 = r1

movz movk

https://stackoverflow.com/questions/53268118/whats-the-difference-between-mov-movz-movn-and-movk-in-armv8-assembly
instruction value of x0
mov x0, #0x1f88 | 0x1f88
movk x0, #0xb7fb, lsl #16 | 0xb7fb1f88
movk x0, #0x7f, lsl #32 | 0x7fb7fb1f88

ADD

;ADD加法指令
mov r0, #1
mov r1, #1
add r2, r1, r0  ;r2 = r1 + r0
add r2, r1, #2  ;r2 = r1 + 2
;ADC带进位加法指令,即除了加两个数以外,还要把CPSR的C值也要带进来
ADDS R0,R1,R2; R0=R1+R2,ADDS中S表示把进位结果写入CPSR
ADC R5,R3,R4 ;R5=R3+R4+C

SUB

;SUB减法指令
mov r0, #5
mov r1, #3
sub r2, r0, r1  ;r2 = r0 - r1
sub r2, r1, #2  ;r2 = r1 - 2
;SBC带进位减法指令,即除了加两个数以外,还要把CPSR的C值也要带进来,类似ADC
SUBS R0,R1,R2; R0=R1-R2,SUBS中S表示把进位结果写入CPSR
SBC R5,R3,R4 ;R5=R3-R4-C

AND 与操作

AND R0,R1,R2; R0=R1 & R2
AND R0,R1,#0xFF ;R0=R1 & 0xFF

ORR 或操作

ORR R0,R1,R2; R0=R1 | R2
ORR R0,R1,#0xFF ;R0=R1 | 0xFF

MADD

MADD Rd, Rn, Rm, Ra => Rd = Ra + Rn * Rm

MSUB

MSUB Rd, Rn, Rm, Ra => Rd = Ra - Rn * Rm

SMADDL

https://developer.arm.com/documentation/100076/0100/a64-instruction-set-reference/a64-general-instructions/smaddl?lang=en
Signed Multiply-Add Long multiplies two 32-bit register values, adds a 64-bit register value, and writes the result to the 64-bit destination register.
SMADDL Xd, Wn, Wm, Xa
Xd = Xa + Wn * Wm.

LSR

LSR(Logical shift right),逻辑右移或者说是无符号的右移。LSR #n操作可以对寄存器的内容进行逻辑右移n位,左边被移走的n位全部被清零
MOV R1,#0X80000001
LSR R0,R1,#3; R0 = (unsigned)R1>> 3

上一篇下一篇

猜你喜欢

热点阅读