什么是arm64
- 在iOS开发中常见的架构的ARMv7|ARM7s|ARM64,这些都是ARM处理器的指令集,真机32位处理器需要ARMv7,或者ARMv7s架构,真机64位处理器需要ARM64架构。
- 32位处理器,能同时处理32位的数据,所以对应寄存器为32位的,64位处理器,能同时处理64位的数据,所以对应寄存器为64位的,寄存器位数一般会对应处理器位数,两者一般相等,但也有例外8086。
MOV 指令
指令格式: MOV{条件} {S} 目标寄存器 源操作数 MOV指令可以完成从另外一个寄存器,被移位的寄存器,或者一个立即数加载到目标寄存器。其中S选项决定指令的操作是否影响状态寄存器CPSR中的标志位。没有S时,指令不会更新CPSR寄存器的值
示例:
MOV R1, R0 ;将目标寄存器RO的值传递到R1
MOV PC, R14 ;将目标寄存器R14的值传递到PC,常用于程序返回
MOV R1, R0, LSL#3 ; 将寄存器R0的值左移3位之后传递给R1
movk w10,#0x555
movk w10,#0x555
把#0x555 数据写入寄存器w10的最后三位,其他位置数据不变
movk w10,#0x555, lsl #16
把0x555 寄存器w10从右向左便宜16位之后写入#0x555
测试代码:
**(lldb)** **register read w10**
w10 = 0x81ca4d00
执行__asm volatile ("movk w10,#0x555\n");之后
**(lldb)** **register read w10**
w10 = 0x81ca0555
**(lldb)**
**(lldb)** **register read w10**
w10 = 0x80f81480
执行__asm volatile ("movk w10,#0x555, lsl #16\n");之后
**(lldb)** **register read w10**
w10 = 0x05551480
**(lldb)**
ADD 指令
指令格式: ADD{条件} {S} 目标寄存器 操作数1 操作数2 ADD指令用于把两个操作数相加,并将结果放到目标寄存器。操作数1应该是一个寄存器,操作数2可以使一个寄存器,被移位的寄存器,或者一个立即数 示例:
ADD R0 R1,R2 ; R0 = R1 + R2
ADD R0 R1,#265 ; R0 = R1 + 256
ADD R0 R1,R2 #LSL1 ; R0 = R1 + (R2 <<1)
SUB 指令
指令格式: SUB{条件} {S} 目标寄存器 操作数1 操作数2 SUB指令用于把操作数1减去操作数2之后把值放到目标寄存器。操作数1应该是一个寄存器,操作数2可以是寄存器,被移位的寄存器,或者一个立即数。该指令可以用于有符号或者无符号的减法。 示例:
SUB R0 R1,R2 ; R0 = R1 - R2
SUB R0 R1,#265 ; R0 = R1 - 256
SUB R0 R1,R2 #LSL1 ; R0 = R1 - (R2 <<1)
LDR 指令
LDR 指令的格式为:
LDR{条件} 目的寄存器,<存储器地址>
LDR 指令用于从存储器中将一个 32 位的字数据传送到目的奇存器中。该指令通常用于从存
中读取 32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器 PC 作为目的奇存器日指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序中比较常用,且寻址方式灵活多样,请读者认真学握
指令示例:
LDR R0, [R1] :将存储器地址为 R1 的字数据读入奇存器 RO。
LDR R0,[R1,R2] 将存储器地址为 R1+R2 的字数据读入奇存器 RO。
LDR R0,[R1,#8] 将存储器地址为 R1+8 的宇数据读入寄存器RO。
LDR R0,[R1,R2]! 将存储器地址为 R1+R2 的字数据读入奇存器R0,并将新地址R1+R2写入R1
LDR R0,[R1,#8]!将存储器地址为 R1+8 的字数据读入寄存器R0,并将新地址R1+8写入R1
:将存储器地址为 R1 的字数据读入奇存器R0,并将新地力
:将存储器地址为 R1+R2×4 的字数据读入奇存器R0,并
:将存储器地址为R1 的字数据读入奇存器R0,并将新地址
ldur与ldr的区别: ldr用于正数(偏移值是正数); ldur用于负数(偏移值是负数)。
查看xcode生成的汇编,ldr有一个查不到的骚操作如下
ldr x16, #0xaf54
这到底是一个怎么样的地址操作???
SCVTF指令
SCVTF Signed integer scalar convert to floating-point, using the current rounding mode (scalar form) 把整形转换成float类型的指令
寻址方式
立即寻址
立即寻址也叫做立即数寻址,这是一种特殊的寻址方式,操作数本身也在指令中个给出,只要取出指令也就取到立即数。这种操作数叫做立即数,对应的寻址方式叫做立即数寻址。
ADD R0 R1,#20 ; R0 = R1 + 20
ADD R0 R1,#0x1f ; R0 = R1 + 0xf1
上面两条指令中带#的就是立即数。
STR 指令
指令格式: STR{条件} 源寄存器, <存储器地址> STR 指令用于把源寄存器的32位数据存传输到存储器中。 示例:
STR R0 [R1,#8] ; 将R0的数据传输到R1+8的地址空间存储器中
STR R0 [sp,#8]! ; 将R0的数据传输到sp的地址空间存储器中,之后sp加8.
stp x8, x9, [sp, #-16]! ; 将x8,x9的数据传输到sp的地址空间存储器中,之后sp减去16.
adrp指令
小范围地址读取指令。
常用寄存器用途
lr 寄存器
用于保存函数返回地址
x0 ~ x7 寄存器
用于保存函数参数,当参数多于8个的时候,会把参数放在sp寄存器指向的堆栈上
sp寄存器
保存栈顶的地址
fp寄存器
在程序执行过程中(通常是发生了某种意外情况而需要进行调试),通过SP和FP所限定的stack frame,就可以得到母函数的SP和FP,从而得到母函数的stack frame(PC,LR,SP,FP会在函数调用的第一时间压栈),以此追溯,即可得到所有函数的调用顺序。(当前线程的栈底指针)
pc 寄存器
保存程序运行的地址
x8 寄存器
用于保存返回结果
持续更新ing