程序的本质
寄存器与内存
- 通常,CPU会先将内存中的数据存储到寄存器中,然后再对寄存器中的数据进行运算
- 假设内存中有块红色内存空间的值是3,现在想把它的值加1,并将结果存储到蓝色内存空间
- CPU首先会将红色内存空间的值放到rax寄存器中:movq 红色内存空间,%rax
(mac平台,寄存器前边有%)
- 然后让rax寄存器与1相加:addq $0x1,%rax
- 最后将值赋值给内存空间:movq %rax,蓝色内存空间
编程语言的发展
- 机器语言:由0和1组成
- 汇编语言:用符号代替了0和1,比机器语言便于阅读和记忆
- 高级语言:C\C++\Java\JavaScript\Python等,更接近人类自然语言
- 操作:将寄存器BX的内容送入寄存器AX
- 机器语言:1000100111011000
- 汇编语言:move %bx, %ax
- 高级语言:ax = bx
-
汇编语言
与机器语言
一一对应,每一条机器指令都有与之对应的汇编指令 -
汇编语言
可以通过编译得到机器语言
,机器语言
可以通过反汇编得到汇编语言
-
高级语言
可以通过编译得到汇编语言
`机器语言,但
汇编语言\
机器语言几乎不可能还原成
高级语言`
汇编语言的种类
- 汇编语言的种类
- 8086汇编(16bit)
- x86汇编(32bit)
- x64汇编(64bit)
- ARM汇编(嵌入式、移动设备)
- ...... - x86、x64汇编根据编译器的不同,有2种书写格式
- Intel:Windows派系
- AT&T:Unix派系 - 作为iOS开发工程师,最主要的汇编语言是
- AT&T汇编 -> iOS模拟器
- ARM汇编 -> iOS真机设备
常见汇编指令
movq -0x18(%rbp),%rax
: 把%rbp-0x18
地址对应的内容赋值给raxleaq -0x18(%rbp),%rax
:把%rbp-0x18
地址值赋值给raxcall 0x100001c70
跳到函数地址值,与retq配合使用,执行到retq之后就跳回到call的下一句汇编语言指令jmp 0x100006640
跳到某行代码所在位置,然后继续一直往下执行
寄存器
- 有16个常用的寄存器
- %rax、%rbx、%rcx、%rdx、%rsi、%rdi、%rbp、%rsp
- %r8、%r9、%r10、%r11、%r12、%r13、%r14、%r15、
-r开头的都是64位(bit)--8字节的寄存器
-e开头的是32位(bit)--4字节的寄存器
-ax、bx、cx开头的是16位(bit)--2字节的寄存器
-ab、al、bh、bl开头的是8位(bit)--1字节的寄存器
- 寄存器的具体用途
- %rax常作为函数返回值使用
- %rdi、%rsi、%rdx、%rcx、%r8、%r9等寄存器常用于存放函数参数
- %rsp、%rbp用于栈操作
lldb常用指令
- rip存储的是指令的地址
- CPU要执行的下一条指令地址就存储在rip中
- 内存地址格式为:0x4bdc(%rip),一般是全局变量,全局区(数据段)
- 内存地址格式为:-0x78(%rbp),一般是局部变量,栈空间
- 内存地址格式为:0x10(%rax),一般是堆空间