汇编语言就是机器码的一个助记符
计算机的寻址方式
在当前的主流操作系统中,都是以字节(B,Byte)为单位进行寻址
计算机的访问最小单位是一个字节(B,Byte)
特征
计算机并不能直接运行高级语言
高级语言程序需要经过编译后才能在计算机上运行
高级语言经过编译之后,经过编译处理,被打包成一个可执行文件的格式
在计算机中真正被运行的是机器码
汇编语言就是把这些机器指令代码以一个组记符的形式翻译,方便人类阅读
寄存器
- 指令都是由CPU来执行
- 在计算机系统结构中,CPU和内存是分开的
- 寄存器存在于CPU中,是CPU的直接操作对象
寄存器种类(64位)
寄存器名称 | 类型种类 | 备注 |
---|---|---|
RAX | 通用寄存器 | 低32位:EAX;低16位:AX;8-15位:AH;低8位:AL |
RBX | 通用寄存器 | 同上 |
RCX | 通用寄存器 | 同上 |
RDX | 通用寄存器 | 同上 |
RDI | 通用寄存器 | 低32位:EDI |
RSI | 通用寄存器 | 同上 |
R8 | 通用寄存器 | 低32位:R8D;低16位:R8W;低8位:R8B |
R9 | 通用寄存器 | 同上 |
R10 | 通用寄存器 | 同上 |
R11 | 通用寄存器 | 同上 |
R12 | 通用寄存器 | 同上 |
R13 | 通用寄存器 | 同上 |
R14 | 通用寄存器 | 同上 |
R15 | 通用寄存器 | 同上 |
RSP | 栈顶指针 | 低32位;ESP |
RBP | 栈底指针 | 同上 |
EFLAGS | 标志寄存器 | 记录状态标志,包括AF,PF,SF,ZF,OF,CF等标识位 |
RIP | 指令计数器 | 保持下一条将会执行的指令的地址 |
64位 AT&T汇编的寄存器
- 有16个常用的64位寄存器
- %rax, %rbx, %rcx , %rdx, %rsi, %rdi, %rbp, %rsp (和 8086汇编类似 )
- %r8, %r9, %r10, %r11, %r12, %r13, %r14, %r15
- 寄存器的具体用途
- %rax 作为函数返回值使用.
- %rsp 指向栈顶.
- %rdi, %rsi, %rdx, %rcx, %r8, %r9, %r10等寄存器用于存放函数参数.
64位, 32位, 16位, 8位 寄存器的显示.
- 通用寄存器,通常用于参数传递以及运算等同于场合
- RSP位栈顶指针,RBP位栈底指针,二者用于维护程序运行时的函数栈
- EFLAGS为标志位寄存器,用于存储CPU运行计算过程中的状态,如进位溢出
寻址方式
| 寻址方式 | 示例 | 实际访问 | | —- | —- | —- | | 立即寻址 | 1234h | 1234h这个数字本身 | | 直接寻址 | [1234h] | 内存地址1234h | | 寄存器寻址 | RAX | 访问RAX寄存器 | | 寄存器间接寻址 | [RAX] | 访问RAX寄存器存储的值的这一内存地址 | | 变址寻址 | [RAX+1234h] | 访问RAX寄存器存储的值+1234h这一内存地址 |
汇编指令
由基本操作组成,大多操作是对一些寄存器的值进行修改
这些指令通过排列组合,完成复杂的功能
- 基于 x86 架构 的处理器所使用的汇编指令一般有两种格式.
- Intel 汇编
- DOS(8086处理器), Windows
- Windows 派系 -> VC 编译器
- AT&T汇编
- Linux, Unix, Mac OS, iOS(模拟器)
- Unix派系 -> GCC编译器
- 基于ARM 架构 的处理器所使用的汇编指令一般有一种格式, 这种处理器常用语嵌入式设备, 移动设备, 以高性能, 低能耗见长
- ARM 汇编, iOS 真机.
指令类型 | 操作码 | Intel格式 | 实际效果 |
---|---|---|---|
数据传送指令 | mov | mov rax,rbx | rax=rbx |
取地址指令 | lea | lea rax [rbx] | rax=&*rbx |
算数运算指令 | add | add rax rbx | rax=rax+rbx |
sub | sub rax rbx | rax=rax-rbx | |
逻辑运算指令 | and | and rax rbx | rax=rax&rbx |
xor | xor rax rbx | rax=rax|rbx | |
函数调用指令 | call | call 1234h | 执行内存地址1234h处的函数 |
函数返回指令 | ret | ret | 函数返回 |
比较 | cmp | cmp rax rbx | 比较rax与rbx,结果保存在EFLAG寄存器 |
无条件跳转 | jmp | jmp 1234h | eip=1234h |
栈操作指令 | push | push rax | rsp-=8,讲rax存储的值压栈 |
pop | pop rax | 将栈顶的值赋给rax,rsp+=8 |
对于变量而言,[var]和var的效果是一样的
对寄存器而言,[eax]是eax的值所指向的地址的内存单元的值,,eax是eax中存放的值
call指令和jmp指令类似
call是函数调用,需要一些函数地址的保存压栈的参数传递操作
jmp类似ifelse,只涉及跳转,不能作为函数调用来使用