汇编语言就是机器码的一个助记符

计算机的寻址方式

在当前的主流操作系统中,都是以字节(B,Byte)为单位进行寻址

计算机的访问最小单位是一个字节(B,Byte)

特征

计算机并不能直接运行高级语言

高级语言程序需要经过编译后才能在计算机上运行

高级语言经过编译之后,经过编译处理,被打包成一个可执行文件的格式

在计算机中真正被运行的是机器码

汇编语言就是把这些机器指令代码以一个组记符的形式翻译,方便人类阅读

寄存器

  1. 指令都是由CPU来执行
  2. 在计算机系统结构中,CPU和内存是分开的
  3. 寄存器存在于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汇编的寄存器

  1. 有16个常用的64位寄存器
  • %rax, %rbx, %rcx , %rdx, %rsi, %rdi, %rbp, %rsp (和 8086汇编类似 )
  • %r8, %r9, %r10, %r11, %r12, %r13, %r14, %r15
  1. 寄存器的具体用途
  • %rax 作为函数返回值使用.
  • %rsp 指向栈顶.
  • %rdi, %rsi, %rdx, %rcx, %r8, %r9, %r10等寄存器用于存放函数参数.

64位, 32位, 16位, 8位 寄存器的显示.
20181227125825389.png

  1. 通用寄存器,通常用于参数传递以及运算等同于场合
  2. RSP位栈顶指针,RBP位栈底指针,二者用于维护程序运行时的函数栈
  3. EFLAGS为标志位寄存器,用于存储CPU运行计算过程中的状态,如进位溢出

    寻址方式

    | 寻址方式 | 示例 | 实际访问 | | —- | —- | —- | | 立即寻址 | 1234h | 1234h这个数字本身 | | 直接寻址 | [1234h] | 内存地址1234h | | 寄存器寻址 | RAX | 访问RAX寄存器 | | 寄存器间接寻址 | [RAX] | 访问RAX寄存器存储的值的这一内存地址 | | 变址寻址 | [RAX+1234h] | 访问RAX寄存器存储的值+1234h这一内存地址 |

汇编指令

由基本操作组成,大多操作是对一些寄存器的值进行修改
这些指令通过排列组合,完成复杂的功能

  1. 基于 x86 架构 的处理器所使用的汇编指令一般有两种格式.
  • Intel 汇编
    • DOS(8086处理器), Windows
    • Windows 派系 -> VC 编译器
  • AT&T汇编
    • Linux, Unix, Mac OS, iOS(模拟器)
    • Unix派系 -> GCC编译器
  1. 基于ARM 架构 的处理器所使用的汇编指令一般有一种格式, 这种处理器常用语嵌入式设备, 移动设备, 以高性能, 低能耗见长
  • ARM 汇编, iOS 真机.

1208639-57a365ea07d02322.png

指令类型 操作码 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,只涉及跳转,不能作为函数调用来使用