入了二进制的坑,真的是又爱又恨,入门难,进阶难,精通难。——-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
生活不易,多才多艺。