通常,CPU会先讲内存中的数据存储到寄存器中,然后在对寄存器中的数据进行运算
假设内存中有红色内存的空间值是3 movq 红色的内存空间 %rax 然后让rax寄存器与1 相加 addq $0x1 ,%rax 最后将值赋值给内存空间 movq %rax 蓝色的内存
汇编语言通过编译进行处理 汇编语言与机器语言一一对应 AT&T -> ios模拟器 ARM汇编 -> ios 真机
- 16个常用寄存器
- %rax %rbx %rcx %rdx %rsi %rdi %rbp %rsp
- %r8 %r9 %r10 %r11 %r12 %r13 %r14 %r15
寄存器的具体用途
%rax 常作为函数的返回值 %rdx %rsi %rdi %rcx %r8 %r9等寄存器常用于存放函数参数
%rbp %rsp常用于栈操作,存储的是栈空间的地址值,基本存储的是内存地址 rbp 局部变量操作展示 rip 作为指令指针,存储着CPU下一条要执行的指令的地址 一旦CPU读取一条指令,rip会自动指向下一条指令
movq %rax , %rdx 意思是把左边的rax的值,传递到rdx中
leap 取内存地址
movq -0x18(%rbp) , %rax
实际意义就是 , 1:取出rbp的内存地址 2:rbp的内存地址 - 0x18 地址的内存地址,得到地址结果 3:把地址空间存储的数据,赋值给rax的地址
leap -0x18(%rbp) , %rax 实际意义就是 , 1:取出rbp的内存地址 2:rbp的内存地址 - 0x18 地址的内存地址,得到地址结果 3:把空间地址 ,直接赋值给rax的地址
jmp 指令 跳转到指定的地址进行执行,发现jump指令,中间部分的指令全部跳出, 只负责跳,不结合return进行执行
call 函数地址,就是执行函数地址, retq return 函数执行之后的下一步指令,当初call执行结束之后需要执行的指令
call *%rax 间接跳转的内容 movl 操作数长度指令
r开头: 64bit , 8字节 eax e开头的操作指令,是兼容32位的寄存器,也就是4字节
lldb常用指令
读取寄存器的值 register read /格式 register read/x
修改寄存器的值 register write 寄存器的名称 数值 register write rax 0 数值接入寄存器
thread step-over / next n 效果是等价的 单步执行 ,跳过一句代码,把子函数当做整体一步执行 s 源码级别
ni si 是调试汇编代码执行 finish 跳转到下个断点位置进行执行
int a = 10 10 就是立即数,也就是字面量
var e = TextEnum.text1(10 , 20 , 30 ) movq 0x14, 0x9773(%rip) //内存地址:rip + 0x9773 movq 0x0 存储的是成员值内容信息
10 就是枚举变量的地址值 rip 存储的是指令的地址
cpu要执行的下一条指令地址就存在rip中 rip += 现在正在执行的指令数值大小