1、程序运行的本质:
程序运行时将存在硬盘中的软件装载进内存,计算机的CPU可读写内存,通过读写内存信息处理控制计算机的显示器、音响、话筒、其他设备。
CPU:主要由寄存器、运算器、控制器组成。寄存器负责对正在运行程序的数据存储。运算器负责信息处理,控制器控制计算机做出相应的响应。
2、寄存器与内存
一般CPU会将内存的数据存储到寄存器中,然后在对寄存器中的数据进行运算。
例如:内存中有一块a内存存储的值是2,现在想把他的值加1。
CPU会将a内存的值存储到CPU的RAX寄存器中:movq a, %rax
然后RAX寄存器与1相加:addq $0x1, %rax
最后在讲值给a内存空间:movq %rax, a
3、程序运行到计算机
高级语言——(编译)——>汇编语言<——(编译)——>机器语言——(运行)——>计算机
a、汇编语言与机器语言一一对应,每一条机器指令都有一条与之对应的汇编指令。
b、汇编语言可以编译成机器语言,机器语言可以反编译成汇编语言。
c、高级语言可以编译成汇编语言/机器语言,但是汇编语言/机器语言几乎不可能还原成高级语言。
4、汇编语言种类
8086汇编(16bit)
x86汇编(32bit)
x64汇编(64bit)
ARM汇编(嵌入式、移动设备组)
X86、x64汇编根据编译的不同有两种书写格式
Intel:windows派
AT&T:Unix派
IOS开发汇编
AT&T汇编:模拟器
ARM汇编:真机调试
5、常见的汇编指令
movx
其中 x 可以是下面的字符:
1、l用于32位的长字值
2、w用于16位的字值
3、b用于8位的字节值
实例:
movl %eax, %ebx #把32位的EAX寄存器值传送给32为的EBX寄存器值
movw %ax, %bx
movb %al, %lx
6、寄存器
16个常用的寄存器
rax、rbx、rcx、rdx、rsi、rdi、rbp、rsp
r8、r9、r10、r11、r12、r13、r14、r15
寄存器的具体用途
rax、rdx常用作程序的返回值使用
rdi、rsi、rdx、rcx、r8、r9等寄存器常用语存放函数参数
rsp、rbp用作栈操作
rip作为指令指针,存储着CPU下一条要执行的指令地址,一旦CPU读取一条指令,rip会自动只想下一条指令(存储下一条指令的地址)
r开头:64bit,8字节
e开头:32bit,4字节
ax,bx,cx:16bit,2字节
ah al bh bl:8bit,1字节
7、lldb常用指令
读取寄存器的值
register read/格式
register read/x
修改寄存器的值
register write 寄存器的名称 数值
register write rax 0
读取内存中的值
x/数量-格式-字节大小 内存地址
x/3xw 0x0000010
修改内存中的值
memory write 内存地址 数值
memory write 0x0000010 10
格式
x是16进制,f是浮点数,d是十进制
字节大小
b - byte 1字节
h - half word 2字节
w - word 4字节
g - giant word 8字节
expression 表达式
可以简写 expr 表达式
expression $rax
expression $rax=1
po表达式
print 表达式
po/x $rax
po(int) $rax
thread step-over、next、n
单步运行,把子函数当做整体一步执行(源码级别)
thread step-in、step、s
单步运行,遇到函数会进入子函数(源码级别)
thread step-inst-over、nexti、ni
单步运行,把子函数当做整体一步执行(汇编级别)
thread step-inst、stepi、si
单步运行,遇到子函数会进入函数(汇编级别)
thread step-out、finish
直接执行完当前函数的所有代码,返回到上一个函数(遇到断点会卡住)
规律
内存地址格式:0x4bdc(%rip),一般是全局变量,全局区(数据段)。
内存地址格式为:-0x78(%rbp),一般是局部变量,栈空间。
内存地址格式为:0x10(%rax),一般是堆空间。