ARM 64指令小记
Posted FarmGuo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"
);
将func的地址加载到x0寄存器中
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调用汇编时不加下划线_
以上是关于ARM 64指令小记的主要内容,如果未能解决你的问题,请参考以下文章