汇编基础01:基础概念

Catalogue
  1. 1. 汇编基础01:基础概念
    1. 1.1. 汇编语言
    2. 1.2. 16/32/64位汇编的区别
    3. 1.3. 基本执行环境
      1. 1.3.1. EFLAGS 寄存器
    4. 1.4. VS中的标志位
      1. 1.4.1. MMX 寄存器
      2. 1.4.2. XMM 寄存器
    5. 1.5. 环境配置
    6. 1.6. 寄存器逻辑结构
    7. 1.7. 冯·诺依曼体系结构
    8. 1.8. 内存
      1. 1.8.1. 内存的寻址范围
      2. 1.8.2. 内存和寄存器的区别
      3. 1.8.3. 内存的5种表现形式
    9. 1.9. 数据存储模式
    10. 1.10. 操作数类型
    11. 1.11. 参考资料

汇编基础01:基础概念

汇编语言

为什么要学汇编

  • 开发
  • 高级语言内联汇编
  • Windows内核编程
  • 逆向分析(需要精通汇编)

汇编语言与机器语言的区别

  • 汇编语言是机器语言的助记符,几乎是一一对应的

16/32/64位汇编的区别

  • 16位汇编:实模式,16位处理器内部,最多处理存储长度为16位
  • 32位汇编:保护模式,32位处理器内部,最多处理存储长度为32位
  • 64位汇编:保护模式,64位处理器内部,最多处理存储长度为64位

16位处理器只能运行16位汇编,

64位处理器可以运行64和32位汇编,

32位处理器不能运行16位汇编,

因为模式不一样

基本执行环境

32位:

  • 8个32位通用寄存器

  • 标志寄存器:EFLAGS

  • 指令指针寄存器:EIP(记录下一条执行的地址)

64位:

  • 8个64位通用寄存器

  • 标志寄存器:RFLAGS

  • 指令指针寄存器:RIP(记录下一条执行的地址)

EFLAGS 寄存器

包含了独立的二进制位,用于控制CPU操作,或反应CPU执行的结果

VS中的标志位

image-20200526084223252

MMX 寄存器

MMX 寄存器实际上是浮点单元中使用的同样寄存器的别名

XMM 寄存器

SIMD的扩展指令集

环境配置

  • Ollydbg

  • Visual Studio 2015

    1. 新建空项目
    2. 选中项目右键“生成自定义”,选择MASM生成规则
    3. 新建一个.asm后缀的新文件
    4. 选中项目右键–属性–链接器–系统–子系统选<控制台(SUBSYSTEM:CONSOLE)>
    5. 选中项目右键–属性–链接器–高级–入口点–填写 “main”

寄存器逻辑结构

EAX:累加器,操作数和结果数据累加器,返回值运算结果一般都存在这里

64:RAX

32:EAX

16:AX

8:AH+AL

EBX:基地址,DS段的数据指针,在内存寻址的时候存放基地址

64:RBX

32:EBX

16:BX

8:BH+BL

ECX:计数器,字符串和循环操作的计数器

64:RCX

32:ECX

16:CX

8:CH+CL

EDX:存储部分乘法结果和部分除法被除数

64:RDX

32:EDX

16:DX

8:DH+DL

EBP:基址指针,SS段的数据指针

64:RBP

32:EBP

16:BP

ESP:栈帧指针,指向栈顶,也叫栈顶指针

64:RSP

32:ESP

16:SP

EDI:字符串操作的目标指针,ES段的数据指针

64:RDI

32:EDI

16:DI

ESI:字符串操作的原始指针,SS段的数据指针

64:RSI

32:ESI

16:SI

冯·诺依曼体系结构

分为5个部分

输入设备–存储器–输出设备,运算器–控制器

内存

冯诺依曼中用来存储程序和数据的部件叫做存储器,存储器分为主存储器(内存储器)和辅助存储器,主存储器也叫内存

内存的寻址范围

32位系统内存的寻址范围是0x00000000-0xFFFFFFFF

最大寻址范围:0xFFFFFFFF+1(4294967296)

1 Byte = 8 bit

1 KB = 1024 Byte

1 MB = 1024 KB

1 GB = 1024 MB

4294967296 Byte = 4 GB (32位系统最大内存是4 GB)

64位系统内存寻址范围:0x0000000000000000 – 0xFFFFFFFFFFFFFFFF

内存和寄存器的区别

内存:数量庞大,便宜,速度较慢

寄存器:数量少,昂贵,速度极快,位于CPU内部

内存的5种表现形式

立即数:就是阿拉伯数字

1
MOV EAX,DWORD PTR DS:0x????????]

把后面这个内存给EAX


寄存器:

1
2
MOV EBX ,0x????????
MOV EAX ,DWORD PTR DS:[EBX]

寄存器+立即数:

1
2
MOV EBX ,0x????????
MOV EAX ,DWORD PTR DS:[EBX + 4]

比例因子:

1
[REG + REG * {1,2,4,8}]

数组元素地址 = 数组首地址 + 元素索引 * 数组元素占用空间

1
2
3
MOV EAX ,0x????????
MOV EBX ,0x2
MOV ECX ,DWORD PTR DS:[EAX+EBX*4]

比例因子+立即数:

1
2
3
MOV EAX,0x????????
MOV EBX,0x2
MOV ECX,DWORDPTRDS:[EAX + EBX*4 +1]

数据存储模式

大端序:数据高位在内存低位,数据低位在内存高位,常用于ARM架构

小端序:数据高位在内存高位,数据低位在内存低位,常用于x86、AMD64架构

操作数类型

立即数:数字

  • imm 立即数
  • imm8 imm16 imm32

寄存器操作数

  • reg 通用寄存器
  • reg8 reg16 reg 32
  • sreg 段寄存器

内存操作数

  • mem 内存
  • mem8 mem16 mem 32

参考资料