ARM 64指令小记

1 状态寄存器CPSR

ARM64下,该寄存器为32位,高4位N、Z、C、V均为条件码标志位。
SUBS和ADDS影响CPSR,而SUB和ADD则不影响

2 TEST

属于逻辑运算指令,做与操作,结果影响CPSR
如果与运算结果为0那么Z标志位为1,反之为0
Test用来测试一个位,例如寄存器
test eax, 100b; b后缀意为二进制
jnz **; 如果eax右数第三个位为1,jnz将会跳转

3 CMP

属于算术运算指令,做减法,但与SUB指令不同的是SUB指令执行过以后,原来寄存器中的被减数丢了,被换成了减法的结果,CMP指令执行过以后,被减数、减数都保持原样不变。
CMP指令影响CPSR
当比较结果为0时,即相等,Z位置1。
arm下的条件跳转
表达式 英文 中文
bl.eq equal 等于
bl.ne not equal 不等于
bl.gt greater than 大于
bl.ge greater equal 大于等于
bl.lt less than 小于
bl.le less equal 小于等于

x86下的跳转
je equal 等于
jne not equal 不等于
jg greater 大于
jge greater equal 大于等于
jl less 小于
jle less equal 小于等于

call 为x86的跳转指令
bl 为arm的跳转指令

其他

adrp 指令,将pc低12位清零,然后将立即数左移12位进行相加
adrp x8, 10,此时pc 0x00000001026c4478
x8 = 0x00000001026c4000 + 0xa000 = 0x00000001026ce000

在第一次由adrp取得页的基址(也就是lable,此例中10),然后再加上在页内的偏移,获取最终值。

br Xm:跳转到由Xm目标寄存器指定的地址处。
blr Xm:跳转到由Xm目标寄存器指定的地址处,同时将下一条指令存放到X30(lr)寄存器中。例如:blr x20,跳转后,即lr存放着blr x20的下一条指令。
b label,跳转到标签(内部或外部,外部指的是C函数)。
bl label,跳转到标签(内部或外部,外部指的是C函数),同时将下一条指令存放到X30(lr)寄存器中。

__asm volatile ("br x8\n");

void mytest(int a, int b) {
    
}
__asm volatile ("bl _mytest\n");


stp x8, x9, [sp, #-32]!       //把x8,x9 的值存到sp-32的地址后,sp=sp-32
stp x8, x9, [sp], #-0x10      //把x8,x9 的值存到sp的地址后,sp=sp+16
stp x8, x9, [sp, #16]         //把x8,x9 的值存到sp+16的地址中


ldp x0, x1, [sp], #0x10      // 把sp的地址里面的内容读到x0,x1后,sp=sp+16
ldp x0, x1, [sp, #0x10]!     // 把sp+16的里面的内容读到x0,x1后,sp=sp+16
ldp x19, x20, [sp, #16]      // sp+16 地址的值分别放回x19 x20

sp和偏移在一个括号内的,地址是sp+偏移,后面跟!则操作完成后sp自动变化,否则不变。
sp单独一个括号的,地址是sp,操作完成后sp会自动变化。

        asm volatile (
            "adrp x0, _func@PAGE\n"
            "add  x0,x0,_func@PAGEOFF\n"
            "blr x0\n"
        );
        将func的地址加载到x0寄存器中,并执行func

	cbz	x0, LGetImpMiss // x0为 0则跳转到LGetImpMiss。只能内部跳转,不能跳到外部的C函数。

cbz: xt寄存器是否为0,为0则跳转到label处,跳转范围+/1 1MB
cbnz: xt寄存器是否为0,不为0则跳转到label处,跳转范围+/1 1MB
tbz: 测试寄存器中某位是否为0,为0则跳转到label处,跳转范围+/1 32KB
tbnz: 测试寄存器中某位是否为0,为0则跳转到label处,跳转范围+/1 32KB

ubfx	x11, x0, #60, #4    //取x0的高4位到x11
ldr	x13, [x0]						// 加载x0里面的内容到x13寄存器
lip 用来加载内容到2个64位寄存器
	
汇编调用c时,函数前面加下划线_
汇编前面加下划线_,c调用汇编时不加下划线_
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: msub指令ARM64体系结构中的一条指令,用于进行带符号整数的乘法和减法操作。 在ARM64体系结构中,msub指令的格式为msub Rd, Rn, Ra, Rm,其中Rd表示目标寄存器,Rn、Ra和Rm表示源寄存器。 msub指令的作用是将源寄存器Rm中的值与Rn中的值进行乘法运算,然后将结果与Ra中的值进行减法运算,最后将结果存储到目标寄存器Rd中。 这条指令在一些特定的运算场景下非常有用。例如,当我们需要计算一个多项式的值时,可以使用msub指令来进行高效的乘法和减法操作。此外,在一些计算密集型的算法中,使用msub指令可以提高计算性能。 需要注意的是,msub指令是带符号整数的运算指令,它将使用源寄存器中的值的符号进行运算。因此,在使用msub指令时要确保寄存器的值符合运算要求,否则可能会得到不正确的结果。 总而言之,msub指令ARM64体系结构中用于进行带符号整数乘法和减法操作的一条指令,可以在某些特定的运算场景下提高计算性能。 ### 回答2: msub 指令是在ARM64架构中的一条乘加指令。在ARM处理器中,乘加指令用于执行两个操作数的乘法运算,然后将乘法结果与第三个操作数相加。 msub指令的完整形式为 msub Rd, Rn, Rm, Ra,其中Rd表示目标寄存器,Rn表示第一个操作数,Rm表示第二个操作数,而Ra表示第三个操作数。 该指令的执行顺序为:先执行Rn与Rm的乘法运算,然后得到的乘法结果与Ra进行相加,最后的结果将存储在目标寄存器Rd中。 msub指令在一些特定的应用中非常有用,比如数字信号处理和一些科学计算中的数值计算。通过将乘法和加法操作的结果直接汇总在一条指令中执行,可以提高程序的运行效率,减少指令的执行次数,从而优化程序性能。 总之,msub指令ARM64架构中的一条乘加指令,用于执行两个操作数的乘法运算,然后将乘法结果与第三个操作数相加,最后将结果存储在目标寄存器中。它在一些特定的应用中具有重要的作用,可以提高程序的运行效率和性能。 ### 回答3: msub是ARM64指令集中的一条指令,它用于执行64位整数的乘法和减法操作。msub指令的格式为msub Rd, Rn, Rm, Ra,其中Rd是目标寄存器,Rn、Rm是源寄存器,而Ra是要减去的操作数。 msub指令的作用是计算乘法操作的结果并与原有的数值相减,然后将结果存储到目标寄存器Rd中。这实际上等价于执行(Rn * Rm) - Ra的计算。 ARM64架构的msub指令在处理需要同时进行乘法和减法操作的情况下非常高效,因为它可以在一个指令周期内完成这两个计算步骤。 使用msub指令可以减少指令的数量,提高程序的执行效率。尤其是在需要频繁进行乘法和减法操作的算法和应用中,msub指令可以大幅度提高运算效率。 总而言之,msub指令ARM64指令集中用于执行64位整数乘法和减法操作的一条指令。它能够通过一次指令完成乘法和减法计算,并将结果存储到指定的寄存器中,从而提高程序的执行效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值