iOS汇编指令集

本文详细介绍了ARM指令集中的内存读写操作,如str和ldr指令,以及栈操作如入栈保护和栈平衡。同时,探讨了条件判断指令如CMP和SUBS,以及它们在流程控制中的应用,如BL和B系列跳转指令。此外,还提到了SP和FP寄存器在栈管理中的作用,并解析了ubfx、adrp等指令的用法。
摘要由CSDN通过智能技术生成

关于内存读写指令

注意:读/写 数据是都是往高地址读/写

str(store register)指令

将数据从寄存器中读出来,存到内存中.

ldr(load register)指令

将数据从内存中读出来,存到寄存器中

此ldr 和 str 的变种ldp 和 stp 还可以操作2个寄存器.

sub    sp, sp, #0x40             ; 拉伸0x40(64字节)空间
stp    x29, x30, [sp, #0x30]     ;x29\x30 寄存器入栈保护
add    x29, sp, #0x30            ; x29指向栈帧的底部
... 
ldp    x29, x30, [sp, #0x30]     ;恢复x29/x30 寄存器的值
add    sp, sp, #0x40             ; 栈平衡
ret

if语句判断的指令集

cmp比较指令
   CMP 把一个寄存器的内容和另一个寄存器的内容或立即数进行比较。但不存储结果,只是正确的更改标志。
   一般CMP做完判断后会进行跳转,后面通常会跟上B指令!

  • BL 标号:跳转到标号处执行
  • B.GT 标号:比较结果是大于(greater than),执行标号,否则不跳转
  • B.GE 标号:比较结果是大于等于(greater than or equal to),执行标号,否则不跳转
  • B.EQ 标号:比较结果是等于,执行标号,否则不跳转
  • B.HI 标号:比较结果是无符号大于,执行标号,否则不跳转
  • B.LT标号: 比较结果小于,执行标号,否则不跳转
  • B.LE标号:比较结果小于等于,执行标号,否则不跳转
  • B.NE 标号:比较结果是不等于(not equal to),执行标号,否则不跳转
  • B.LO标号:比较结果是无符号小于,执行标号,否则不跳转
  • B.HS标号:比较结果是无符号大于等于,执行标号,否则不跳转
  • B.LS标号:比较结果是无符号的小于等于,执行标号,否则不跳转

我使用的比较语句却是SUBS 指令
CMP指令与SUBS指令的区别在于CMP指令不保存运算结果。在进行两个数据的大小判断时,常用CMP指令及相应的条件码来操作

br
根据你寄存器所存的值进行跳转

ubfx

ubfx x9 ,x9,#0,#32  

将x9的高32位清零

adrp

adrp x0 1
add x0,x0,#0xf69

个人看法就是将x0里面的值后三位清零第四位加一,在加上下一行的f69 假设adrp那一行的指针后四位一开始为45f8 那adrp那一行就是将45f8变成5000然后赋值于x0 然后add那一行就是将x0变为5f69

ldrsw

ldrsw x10,[x8,x11,lsl,#2]

这句话的意识是 先将x11的值左移(lsl)两位,在加上x8等到的结果作为地址取值赋值给x10

SP和FP寄存器
sp寄存器在任意时刻会保存我们栈顶的地址.
fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈底的地址!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值