寄存器
寄存器是微机原理中非常重要的概念,几乎绝大多数的操作都要涉及寄存器。 对于寄存器的理解在结构上可以认为寄存器就是一个大工厂的储物间,数据要放到储物间中寄存,再由工厂的流水线直接拿去处理。 (考)因此,在问到什么样的指令用时最少** 在编程上可以认为寄存器就是一些固定名字、有专门用途的变量**。比如在C语言中我们写一个循环语句:
int i;
for ( i=20, i!= 0, i--){
// codes
}
需要指定一个变量i作为循环的计数器,i!=0作为循环继续的条件。在汇编语言中,功能相近的LOOP指令的循环计数器默认(就是规定死咯)为CX寄存器,而循环条件、步进等等也都是已经规定好的,后面本喵会继续介绍。
寄存器分类很多,但是也是需要一一记忆的,所以针对寄存器的学习本喵给出的建议是“记住中英文名称、记住常用的功能、带入到指令功能和例题中记忆”,此外,正在建设的题库也会针对寄存器收集题目,贴上tags和解释。(此处应该有掌声 ))|)
如何记忆寄存器
寄存器的名称和功能是相对应的,所以先要记住英文名称,自然功能、助记符就记住了。
数据寄存器
毕竟人和数据打交道多一些的嘛。四兄弟由A排到D,是巧了,真的是巧了:
- AX (Accumulator)累加器
- BX (Base)基址寄存器
- CX (Counter)计数寄存器
- DX (Data)数据寄存器 注意,这四个寄存器是分为高八位和低八位的,高八位用H(high)表示,低八位用L(low)表示,至于为什么整体用X表示鬼才知道。
指针和变址寄存器
顾名思义,从两个方面来记忆,指针和变址。所谓指针,也就是一个特定的地址。
- SP (Stack Pointer)堆栈指针寄存器。(先了解一下堆栈的概念,参见+++++)
- BP (Base Pointer)基址指针寄存器
- SI (Source Index)源变址寄存器
- DI (Destination Index)目的变址寄存器
这两个寄存器最常用在向内存中读写数据时。因为在操作内存时需要寻址,知道某个内存单元的地址才能进行各种操作(详细参见++++)。它们的区别就在于使用串指令完成内存的读取、写入时以
SI为读取的数据的地址,DI为写入的数据的地址,并且会自动对SI,DI的值自增或自减(取决于DF标志位的情况)。如果不用串指令,用普通的写法(参见+++)来完成,SI、DI是没有什么区别的,都是可以作为寄存器间接寻址,但是习惯上还是要用SI作为数据的读取地址,DI作为数据的写入地址。
段寄存器组
这里的四个寄存器能够体现计算机结构的思想。为什么这么说呢?作为一个常识,我们知道计算机的关键组成是数据和指令,
- CS (Code Segment)代码段寄存器
- DS (Data Segment)数据段寄存器
- SS (Stack Segment)堆栈段寄存器
- ES (Extra Segment)附加段寄存器
控制寄存器组
IP (Instruction Pointer)指令指针寄存器 指令指针寄存器是由操作系统自动改变的,它的意义就是指向要执行的代码的地址。 考点可能有:IP不能出现在MOV语句中。
FLAGS 标志寄存器
所谓标志寄存器就是当前的一条指令执行后会根据一些条件自动修改标志寄存器里的数值。举个例子:在小学学习减法的时候,如果个位数相减不够了,我们会向十位借1,这时候会在十位上点个点,避免在运算十位时忘记了借位。同样的,FLAGS标志寄存器也是这样的作用。但是有下面几个方面需要重点区分一下:
FLAGS标志寄存器的某一位就是个特定的开关。什么意思呢?首先,FLAGS标志寄存器是一个寄存器,而8086的寄存器均为16位,因此FLAGS标志寄存器也是16位的。那么每一位有特定的标记。比如第0位的CF标志位表示的是进位标志,如果运算最高位出现了进(借)位,那么这时候CF就为1,如果没有进(借)位,那么为0。再看一个例子,第6位的ZF标志位是零标志位。如果运算结果为0(0000/0000 0000都是0的),注意,那么此时ZF=1,如果不为0,ZF=0,注意这里容易产生误区。- 执行一条指令
FLAGS标志寄存器就会被影响。
不会对FLAGS标志位产生影响的指令