基础汇编

168 阅读1分钟
通常,CPU会先讲内存中的数据存储到寄存器中,然后在对寄存器中的数据进行运算

假设内存中有红色内存的空间值是3 movq 红色的内存空间 %rax 然后让rax寄存器与1 相加 addq $0x1 ,%rax 最后将值赋值给内存空间 movq %rax 蓝色的内存

汇编语言通过编译进行处理 汇编语言与机器语言一一对应 AT&T -> ios模拟器 ARM汇编 -> ios 真机

  1. 16个常用寄存器
  1. %rax %rbx %rcx %rdx %rsi %rdi %rbp %rsp
  2. %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 0xa,0x9776(movq0xa, 0x9776(%rip) //内存地址:0x1000016bf + 0x9776 movq 0x14, 0x9773(%rip) //内存地址:rip + 0x9773 movq 0x1e,0x9770(movb0x1e, 0x9770(%rip) //内存地址:rip + 0x9770 movb 0x0 存储的是成员值内容信息

10 就是枚举变量的地址值 rip 存储的是指令的地址

cpu要执行的下一条指令地址就存在rip中 rip += 现在正在执行的指令数值大小