程序的本质
-
软件/程序的执行过程
1.程序/软件放在硬盘上
2.双击/打开软件就会装载到内存中 (0101的机器码就会装载到内存中,内存中放的就是机器指令010101)
3.内存指令就会交给CPU去执行,CPU会读取内存中的机器指令,CPU也会写一些数据到内存中
4.CPU一旦读取了机器指令后,理解了要干什么后,就会控制计算机的其他语言部件,如显示器,音响,话筒,其他设备等
-
CPU内部
1.寄存器 —> 信息存储
2.运算器 —> 信息处理
3.控制器 -
寄存器和内存
1.通常,CPU会先将内存中的数据存储到寄存器中,然后再对寄存器中的数据进行运算 : (先将内存中的数据拉到寄存器来,再进行计算)
假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间
CPU首先会将红色内存空间的值放到rax寄存器中: movq 红色内存空间, %rax
然后让rax寄存器与1相加: add $0x1, %rax
最后将值赋值给内存空间: movq %rax, 蓝色内存空间
tips:
movq : 就是将左边的东西送到右边
let a = 3
let b = a + 1
汇编语言的发展
汇编语言的种类
常见汇编指令
tips
0x1ff7(%rip) : 寄存器+ 0x1ff7的内存地址对应的存储空间
凡是看到小括号,就是代表里面存的是内存地址
//(%rbp) -0x18: 寄存器里面存的地址值 - 0x18
movq -0x18(%rbp),%rax : -0x18(%rbp)的内存地址的存储空间里面的数据赋值给rax
相当于房间里面的人赋值给rax : movq 赋值数据
leaq -0x18(%rbp),%rax : -0x18(%rbp)的地址值赋值给rax
相当于房间的地址赋值给rax : leaq 赋值地址
r开头: 64bit, 8个字节
e开头: 32bit, 4个字节
ax,bx,cx: 16bit, 2个字节
ah,al,bh,bl: 8bit, 1个字节
lldb常用指令1
- 读取寄存器的值
register read/格式
register read/x - 修改寄存器的值
register write 寄存器名称 数值
register write rax 0 - 读取内存中的值
x/数量-格式-字节大小 内存地址 - 修改内存中的值
memory write 内存地址 数值
memory write 0x0000010 10 - po 表达式
print 表达式
po/x $rax
格式
如x/3xw 0x00000000000321
3表示显示三组数据
x是16进制,是浮点 , d是十进制
字节大小有:
b - byte 1字节
h - half word 2字节
w - word 4字节
g - giant word 8字节
lldb常用指令2
- 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
直接执行完当前函数的所有代码,返回到上一个函数(遇到断点会卡住)