转载自<https://www.jianshu.com/u/85e7cb4c5145>
字数 2,801阅读 1,728
- * *bl* 指令 跳转到标号出执行
o *b.le* :判断上面cmp的值是小于等于 执行标号,否则直接往下走
o *b.ge* 大于等于 执行地址 否则往下
o *b.lt* 判断上面camp的值是 小于 执行后面的地址中的方法 否则直接往下走
o *b.gt* 大于 执行地址 否则往下
o *b.eq* 等于 执行地址 否则往下
o *B.HI* 比较结果是无符号大于,执行地址中的方法,否则不跳转
* *ret* 返回
* *mov* x0,#0x10 x0 = 0x10
* *str* w10 ,[sp] 将w10寄存器的值存到 sp栈空间内存
* *stp* x0,x1,[sp.#0x10] x0、x1 的值存入 sp + 0x10
* *orr* x0,wzr,#0x1 x0 = wzr | 0x1
* *stur* w10 ,[sp] 将w10寄存器的值存到 sp栈空间内存
* *ldr* w10 ,[sp] w10 = sp栈内存中的值
* *ldp* x0,x1,[sp] x0、x1 = sp栈内存中的值
* *adrp* 通过基地址 + 偏移 获得一个字符串(全局变量)
1. 将1的值,左移12位 1 0000 0000 0000 == 0x1000
2. 将PC寄存器的低12位清零
3. 将1 和 2 的结果相加
adrp 是计算指定的数据地址 到当前PC值的相对偏移
由于得到的结果是低12bit为0
10 1024
12 == 4KB
总结
adrp找到的是一个目标数据偏移的相对地址,他是一个不准确的地址,偏移的
误差有4KB
为什么偏移的误差是4KB呐? 在地址总线上面,10条地址总线的寻址能力是
1024,12条地址总线的能力是4*1024 4KB
* *cmp*:
ZF=1则AX=BX
ZF=0则AX!=BX
CF=1则AX<BX
CF=0则AX>=BX
CF=0