抄书笔记-汇编语言 第二章 寄存器

一个典型的CPU由运算起,控制器,寄存器(CPU)等器件组成,这些器件内部总线相连。

  • 运算器进行信息处理
  • 寄存器进行信息存储
  • 控制器控制各器件进行工作
  • 内部总线连接各种器件,在它们之间进行数据的传送

2.1通用寄存器

8086CPU的所有寄存器都是16位的,可以存放两个字节。AX,BX,CX,DX这四个寄存器用来存放一般数据,称为通用寄存器。

在8086中,上述四个寄存器都可以分为两个独立的8位寄存器使用:

  • AX可以分为AH和AL;
  • BX可以分为BH和BL;
  • CX可以分为CH和CL;
  • DX可以分为DH和DL;

2.2字在寄存器中的存储

  • 字节:记为Byte一个字由8个bit组成,可以存在8位寄存器中
  • 字:记为Word,一个字由两个字节组成,这两个字节分别称为该字的高位字节和地位字节,可以由一个16位的寄存器存放

2.3几条汇编指令

汇编指令 控制CPU完成的操作 用高级语言的语法描述
mov ax,18 将18送入寄存器AX AX=18
mov ah,78 将78送入寄存器AH AH=78
add ax,8 将寄存器AX中的值加上8 AX=AX+8
mov ax,bx 将寄存器BX中数据传送到AX AX=BX
add ax,bx 将寄存器AX和BX中数据相加,结果放在AX中 AX=AX+BX
注意:汇编语言是不区分大小写的
     在进行数据传送或者运算是,要保持操作数的位数是一致的

2.4物理地址

我们知道CPU在访问内存单元的时候,需要知道内存单元的地址,所有内存单元构成的存储空间是一个一维的线性空间,每个内存单元在这个空间中有一个唯一的地址,这就是物理地址。

CPU通过地址总线送入寄存器的时候,必须是一个内存单元的物理地址。

2.516位结构的CPU

16位结构=16位机=字长为16位

  • 运算器一次最多可以处理16位的数据
  • 寄存器的最大宽度是16位
  • 寄存器和运算器之间的通路是16位

8068是16位的CPU,所以在8086的内部,能够一次性处理,传输,暂时存储的信息最大的长度是16位的,内存单元的地址在送上地址总线的之前,必须在CPU中处理,传输,暂时存放,能够一次性处理,传输,暂时存储的也是16位。

2.68086CPU找出物理地址的方法

8086有20根地址总线,可以传送20位的地址,达到1M的寻址能力,但是其CPU是16位结构,在内部一次性处理,传输,暂时存放的地址是16位。如果只是简单的将地址从CPU中传出,那么它的传输能力就只有16K。

所以8086采用一种在内部使用两个16位的地址合成方法来形成一个20位的物理地址。

所以,CPU在读取内存的时候:

  • CPU的相关部件提供两个16位的地址,一个段地址,一个偏移地址
  • 段地址和偏移地址通过内部总线送入一个称为地址加法器的器件
  • 地址加法器将两个16位的地址合成一个20位的物理地址
  • 地址加法器通过内部总线将20位的物理地址送入到输入输出控制电路
  • 输入输出电路通过内部总线将20位的物理地址送上总线
  • 20位的物理地址被地址总线送到存储器

地址加法器采用物理地址=段地址✖️16+偏移地址的方法合成物理地址

2.7"段地址X6+偏移地址=物理地址"的本质含义

举例:

我要告诉你一个学校到操场的距离是2863米,但是我的手机短信,每次只能发送三个数字(不要问为什么),于是我就发200,863两次,你收到之后将200(段地址,就是一个基础数)X10=2000 加上 863(偏移地址,偏移数)得到2863的结果。

2.8段的概念

内存并没有分段,段的划分是来自CPU中,如果在以后的编程中,我们需要把一个内存单元看作是一个段,用段地址X16表示起始地址,用偏移地址定位段中的内存单元。

2.9段寄存器

段地址在8086中是存放在段寄存器中,8086有四个段寄存器:CS,DS,ES,SS,当8086CPU要访问内存地址时,由这四个段寄存器提供内存单元的段地址。

2.10CS和IP

CS和IP是8086CPU中最关键的两个寄存器,它们显示了CPU当前要读取的指令的地址。CS为代码段寄存器,IP为指令指针寄存器。

在8086中任意时刻,如果设置了CS的值为M,IP的值为N,那么CPU将从M✖️6+N单元开始,读取一条指令并执行。也就是说,在任意时刻,CPU将CS:IP指向的内容作为指令执行。

8086CPU工作过程可以描述为以下过程:

  1. 从CS:IP指向的内存单元读取指令,读取的指令进入到指令缓冲器;
  2. IP=IP+所读取的指令的长度,从而指向下一条指令;
  3. 执行指令。转到步骤1,重复该过程

在8086中,CPU加电或者是复位之后,CS=FFFFH,IP=0000H

在内存中,指令和数据是没有区别的,唯一的区别就是指令是会被CS:IP指向,拿来执行。如果一段代码被执行过,那么它所在的内存单元就是被CS:IP指向过。

2.11修改CS,IP的指令

一般来说,我们可以使用mov指令来给指定的寄存器传送数据,但是mov指令不能用于设置CS:IP的值,因为CPU不支持,能够改变CS:IP的指令称为转移指令。可以使用jmp(仅仅是改变IP的值)

jmp ax 含义好似:mov IP,ax

2.12代码段

如果我们编写好了一段汇编程序,要是该程序能够被CPU识别,但是代码来执行,我们需要将CS:IP所指向的地址修改为该代码段的起始地址,便于CPU执行。

2.9-2.12 小结

1. 段地址在8086的段寄存器中存放
2. CS存放指令的段地址,ip存放偏移地址
3. 8086CPU的工作过程:
   a.从CS:IP指向的内存单元读取指令,读取的指令进入到指令缓冲器;
   b.IP=IP+所读取的指令的长度,从而指向下一条指令;
   c.执行指令。转到步骤a,重复该过程
4. 8086提供转移指令修改CS:IP中的内容

共有 0 条评论

Top