汇编语言(一)- 寄存器的作用

汇编语言(一)- 寄存器

80x86寄存器组

80x86是Intel一系列cpu的代称,其中8088,8086,80286为16位cpu,80386为32位寄存器。其体系如下:
汇编语言(一)- 寄存器的作用_第1张图片

备注:通过寻址的方式可以使8088的最大寻址为1MB

cpu中的寄存器可以分为程序可见和程序不可见,汇编语言操作的就是程序可见的寄存器,程序不可见的寄存器为系统所使用。下面以80x86中16位的cpu为例展示其程序可见的寄存器:

程序可见的寄存器共分为:8个通用寄存器,2个专用寄存器,4个段寄存器共14个。

其体系大致如下:

汇编语言(一)- 寄存器的作用_第2张图片

 

通用寄存器

通用寄存器可以用于传送和暂存数据,也可以参与算术运算,并保存运算结果,除此之外不同的通用寄存器有各自特殊的用途。详细如下:

8088和8086中的通用寄存器又可以分为

数据寄存器:AX,BX,CX,DX 用来暂时存放计算过程中所用的操作数,结果或其他信息。

变址寄存器:SI,DI 用来与段寄存器一起使用进行内存器的变址寻址。

指针寄存器:BP,SP 主要用在堆栈中。

数据寄存器

AX寄存器

Accumulator register,16位寄存器,可以拆为AH(高8位)和AL(低8位)两个8位寄存器使用。

主要用在:

  • 可以作为累加器

  • 是算术运算的主要寄存器

  • 在乘除运算中用来存放操作数

  • IO指令都使用AX寄存器与外部设备传递信息

 

BX寄存器

Base register,16位寄存器,可以拆为BH(高8位)和BL(低8位)两个8位寄存器使用。

在计算存储器的地址时经常用作基址寄存器。可以使用[BX]来进行取地址操作,并且在AX,BX,CX,DX中只有该寄存器可以这么进行操作。

 

CX寄存器

Count register,16位寄存器,可以拆为CH和BL两个8位寄存器使用。

主要用在:

  • 保存计数值。

  • 保存移位指令,循环指令和串处理指令中作隐含的计数器。

 

DX寄存器

Data register, 16位寄存器,可以拆分为DH和DL两个8位寄存器使用

  • 一般用在字长的扩展当中,和AX寄存器扩展称为32位寄存器,其中DX为高16位。扩展所用的指令为CWD,扩展字长一般用在乘法和除法当中。
  • 对某些IO操作,DX可以用来存放IO端口地址。

 

变址指针寄存器

SI,DI,SP,DP四个变址指针寄存器除了用在算术运算过程外,还可以在存储器的寻址中作为偏移地址使用。

变址寄存器

SI(source index register)源变址寄存器

DI(destination index register)目的变址寄存器

这两个寄存器一般和数据段寄存器DS联用,用来确定数据段中某个存储单元的地址。这两个变址寄存器具有自增或者自减的功能,用来进行变址就非常方便,例如可以用来对两个串进行复制。其中SI和DS进行联用,DI和ES进行联用。

汇编语言(一)- 寄存器的作用_第3张图片

 

指针寄存器

BP(base pointer)基址指针寄存器

SP(stack pointer)堆栈指针寄存器

这两个寄存器可以和堆栈段寄存器联用用来确定堆栈中的某一段存储单元的地址。其中SP用来指示栈顶的偏移地址,BP可以用来指示在堆栈中的偏移地址

备注:类似于高程程序语言中的栈结构,SP可以看做是pop对应的操作,移动就会弹出栈顶。BP可以看成是top的操作,并且可以往下进行移动,不会弹出堆栈中的元素。

指令:mov BP, SP可以使两个指针指向相同的栈顶。

一般与堆栈段寄存器(SS)联用进行寻址:

SS:SP
 

专用寄存器

8086/8088中的专用寄存器是用来控制用的,或者是用来指示一些状态,包括IP指令指针寄存器,FLAGS标志寄存器。

指令指针寄存器-IP

IP寄存器用来存放代码段(CS)中的偏移地址,在程序运行的过程中保存下一条指令的首地址。在程序的执行中起着非常重要的作用,例如可以用来控制程序的执行流程(选择语句,循环语句等),CPU会根据该寄存器中的值进行取址-执行

备注:上述描述的CS:IP的联用方式的转化成物理地址的方式在实地址模式和保护地址模式有所区别。

 

标志寄存器-FLAGS

标志寄存器又称为程序状态寄存器(PSW),用来存放运算结果的标志(是否溢出,是否进位等),控制标志和系统标志的寄存器。其中这些状态都有该寄存器中的特定的位进行表征。该寄存器各个位所代表的状态如下图所示:

汇编语言(一)- 寄存器的作用_第4张图片

其他位也是有作用的,但是这里并不讲。

  • 条件码的标志

    这里标志由CPU在运行中自动设置的 ,这类指令经常用于指令的转移控制,有下面几种:

  1. 进位标志

    CF(Carry Flag),当运算结果的最高有效位产生进位时该位设置为1,否则设置为0。例如在加法运算中(补码表示),0111 + 1010 = 1 0011时最高有效位进位(注意此时并不是溢出)。

  2. 溢出标志

    OF(Overflow Flag),当运算的结果超出了计算机能表示的位数,则会发出溢出。

    进位和溢出的区别

    假设在4位机中,补码表示二进制数,最高位为符号位:

汇编语言(一)- 寄存器的作用_第5张图片

  1. 符号标志

    SF(Sign Flag),表示运算结果是否为负数,如果运算结果为负置为1,正置为0

  2. 零标志

    ZF(Zero Flag),表示运算结果是否为0,运算结果为0置为1,不为零置为0

  3. 辅助进位标志

    AF(Auxiliary Carry Flag),用来记录运算时第三位(半个字节)产生的进位值,例如在执行加法指令的时候如果第三位有进位时置1,否则置为0.

  4. 奇偶标志

    PF(Parity Flag),表示操作数中的1的个数是否为偶数个。用作数据传输的校验作用,当操作数中的1的个数为偶数个时置为1,否则置为0.

  • 方向标志

    DF(Direction Flag),用在串处理指令中控制处理信息的方向。

    1. DF=1时,在串处理的每次操作后都会使变址寄存器SI和DI的值同时减小,这样串处理进行就从高地址往低地址方向执行。
    2. DF=0时,在变址寄存器SI和DI的值同时增大,这样串处理进行就从低地址到高地址方向执行。
  • 系统标志

    这些标志位一般用于IO,中断和程序调试等工作的控制。

  1. 陷阱标志

    TF(Trap Flag),用于调试时的单步方式操作。计算机中的"陷阱"可以简单看成是程序从用户态陷入到内核态当中,可以使得用户程序访问硬件从而获得操作系统所提供的服务。

    当TF=1时,每条指令执行完毕后产生陷阱,由系统控制计算机。

    当TF=0时,每条指令执行完后不产生陷阱。

  2. 中断标志

    IF(Interrupt Flag),用于表示CPU是否响应可屏蔽中断的请求。

    当IF=1时,允许CPU响应可屏蔽中断。

    当IF=0时,不允许CPU响应中断。

在Debug的调试程序中上面那些标志的位都用不同的符号进行表示,如下表所示:

标志名称 标志等于1 标志等于0
CF(是否进位) CY NC
OF(是否溢出) OV NO
SF(是否为负数) NG PL
AF(辅助位是否进位) AC NA
ZF(是否为0) ZR NZ
DF(是否减少) DN UP
IF(是否允许中断) EI DI
PF(1的个数是否为偶数个) PE PO

在DOSBox中的Debug程序中如下位置:

汇编语言(一)- 寄存器的作用_第6张图片

 

段寄存器

在冯诺依曼的体系结构中,指令和数据都被放在内存当中。其中指令放在代码段(CS)中,数据放在数据段(DS)中,这样就不会造成混淆。而段寄存器专门用于存储器的寻址,在后面的存储器的寻址方式中有非常大的用途,可以用来直接或间接的存放段地址。分有代码段CS,数据段DS,堆栈段SS,附加段ES。段寄存器的具体用途会在下面的存储器的寻址方式中讲到。

 
总结:

  1. 寄存器是cpu用来执行程序的核心单元,cpu中的很多工作都是通过寄存器完成的。
  2. 在汇编语言中明确各个寄存器的作用是十分重要的。

你可能感兴趣的:(计算机基础,汇编语言,cpu)