程序的本质
软件\程序的执行过程
软件\程序的执行过程.png寄存器和内存
通常 CPU会先将内存中的数据存储到寄存器中 然后再对寄存器内的数据进行运算
例子.png
编程语言的发展
1.机器语言
- 由0和1组成
2.汇编语言
- 用符号代替了0和1 比机器语言便于阅读和记忆
3.高级语言
- C/C++/Java/JavaScript
5C3FC3F4-147C-492C-B0CC-D2136B2A9736.png
1.汇编语言和机器语言一一对应 每一条机器指令都有与之对应的汇编指令
2.汇编语言可以通过编译得到机器语言 机器语言可以通过反汇编得到汇编语言
3.高级语言可以通过编译得到汇编语言/机器语言 但是汇编语言/机器语言几乎不可能还原成高级语言
汇编语言的种类
- 8086汇编(16bit)
- x86汇编(32bit)
- x64汇编(64bit)
- ARM汇编(嵌入式 移动设备)
x86 x64汇编根据编译器的不同 有2种书写格式
1.Intel Windows派系
2.AT&T Unix派系
ios 最主要的汇编语言 AT&T汇编 ios模拟器
ARM汇编 ios真机
lea 地址赋值 mov 值赋值
mov 是把地址里面的值取出来再复制 lea是把地址值直接赋值
jmp 是跳转到相应的地址 然后继续往下执行 永远不回头
call 函数调用 后面跟的函数地址 跳到这个地址 然后执行 跟retq配合使用 函数执行完 会跳回到call执行代码的下一行语句
寄存器
有16个常用寄存器
1.%rax %rbx %rcx %rdx %rsi %rdi %rbp %rsp
2.%r8 %r9 %r10 %r11 %r12 %r13 %r14 %r15
寄存器的具体用途
1.%rax 常用作函数返回值使用
2.%rcx %rdx %rsi %rdi %r8 %r9等寄存器常用于存放函数参数
3.%rsp %rbp用于栈操作
4 rip 作为指令指针
- 存储着CPU下一条要执行的指令的地址
- 一旦CPU读取一条指令 rip会自动指向下一条指令(存储下一条指令的地址)
r开头 64bit 8字节
e开头 32bit 4字节
ax bx cx 16bit 2字节
ah al 8bit 1字节
lldb常用指令
读取寄存器的值
register read rax 读取rax寄存器的值
修改寄存器的值
register write 寄存器名称 数值
register write rax 0
读取内存中的值
x/数量-格式-字节大小 内存地址
x/3xw 0x0000010
3 - 3组数据
x - 16进制
w - 字节大小 4个字节为一组
字节大小
- b ---- byte 1字节
- h ---- half word 2字节
- w ---- word 4字节
- g ---- giant word 8字节
格式
- x 16进制
- f 浮点
- d 是十进制
修改内存中的值
memory write 内存地址 数值
memory write 0x0000010 10
表达式
- 可以简写 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-over、 nexti、 ni
单步运行 把子函数当做一个整体一步执行(汇编级别)
thread step-insert 、stepi 、si
单步运行 遇到子函数会进入子函数(汇编级别)
thread step-out、 finish
直接执行完当前函数的所有代码 返回到上一个函数(遇到断点会卡主)
rip 存储的是指令的地址
CPU要执行的下一条指令地址就存储在rip中
网友评论