Sma11_Tim3's Studio.

逆向入门基础汇编语言

字数统计: 1k阅读时长: 3 min
2018/10/28 Share

入了二进制的坑,真的是又爱又恨,入门难,进阶难,精通难。——-TM什么都难。

通用寄存器

以下以8086CPU的寄存器为例(8086CPU的寄存器均为16位)。

8086下的通用寄存器有AX、BX、CX、DX。用于存放一般的数据,因此被称为通用寄存器。

AX,BX,CX,DX 称作为数据寄存器:

AX (Accumulator):累加寄存器,也称之为累加器;

BX (Base):基地址寄存器;

CX (Count):计数器寄存器;

DX (Data):数据寄存器;

SP 和 BP 又称作为指针寄存器:

SP (Stack Pointer):堆栈指针寄存器;

BP (Base Pointer):基指针寄存器;

SI 和 DI 又称作为变址寄存器:

SI (Source Index):源变址寄存器;

DI (Destination Index):目的变址寄存器;


由于在 8086 之前的 CPU 为 8 位 CPU,所以为了兼容以前的 8 位程序,

在 8086 CPU 中,每一个数据寄存器都可以当做两个单独的寄存器来使用,

由此,每一个 16 位寄存器就可以当做 2 个独立的 8 位寄存器来使用了 。

  • AX 寄存器可以分为两个独立的 8 位的 AH 和 AL 寄存器;

  • BX 寄存器可以分为两个独立的 8 位的 BH 和 BL 寄存器;

  • CX 寄存器可以分为两个独立的 8 位的 CH 和 CL 寄存器;

  • DX 寄存器可以分为两个独立的 8 位的 DH 和 DL 寄存器;

除了上面 4 个数据寄存器以外,其他寄存器均不可以分为两个独立的 8 位寄存器 ;

下面给出一幅 16 位数据寄存器的结构图:

表示 16 位 寄存器 AX 可以表示成两个 8 位寄存器,

其中 AH 表示高位的 8 位寄存器,AL 表示低位的 8 位寄存器 。

控制寄存器

IP (Instruction Pointer):指令指针寄存器;

FLAG:标志寄存器;

段寄存器

CS (Code Segment):代码段寄存器;

DS (Data Segment):数据段寄存器;

SS (Stack Segment):堆栈段寄存器;

ES (Extra Segment):附加段寄存器;

指针寄存器(BP,SP):

SS:存放栈的段地址

SP:堆栈寄存器SP(stack pointer)存放栈的偏移地址

BP: 基数指针寄存器BP(base pointer)是一个寄存器,它的用途有点特殊,是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到

在函数进入时:
push bp // 保存bp指针
mov bp,sp // 将sp指针传给bp,此时bp指向sp的基地址。

函数结束时:
mov sp,bp // 将原sp指针传回给sp
pop bp // 恢复原bp的值。
ret // 退出子函数

标志寄存器(FLAG):

前面呢,已经介绍了 8086 CPU 14 个寄存器中的 13 个了,下面我们将介绍最后一个寄存器也就是 FLAG 寄存器,

FLAG 寄存器之所以放到最后一个介绍,是因为其和其他的一些寄存器不同,像 AX,BX,CX,DX 这些寄存器来说,

它们都是用来存放数据的,当然 FLAG 中存放的也是数据啦,

呵呵,不过,AX,BX 这些寄存器中的数据是作为一个整体使用的,

最多也就分成一个 AL 和 AH 使用而已,但是在 FLAG 中,数据是按位起作用的,

也就是说,FLAG 中的每一个位都表示不同的状态,

由于一个位也就能表示 0 和 1 ,自然,FLAG 中的每一个位就是用来描述状态的,

而且 FLAG 寄存器中存储的信息通常又被称作程序状态字(PSW) 。

下面我给出一幅 FLAG 寄存器中各个位的示意图:

总结

上面介绍了一些简单的寄存器知识,要入门二进制要跳的坑还有点多,在此推荐一本汇编书:《汇编语言》—清华大学出版社 by王爽 有兴趣的小伙伴自己买书来看咯。

by Covteam-Sma11_Tim3
生活不易,多才多艺。

CATALOG
  1. 1. 通用寄存器
  2. 2. 控制寄存器
  3. 3. 段寄存器
  4. 4. 指针寄存器(BP,SP):
  5. 5. 标志寄存器(FLAG):
  • 总结