汇编语言学习笔记 ( 第二章)

汇编语言学习笔记

第二章
2.0寄存器

  1. 一个CPU是由
          (1).运算器:进行信息处理;
          (2).控制器:各种器件进行工作;
          (3).寄存器:进行信息存储;
          (4).内部总线:连接各种器件,在他们之间进行数据的传送;
   等器件构成的,这些器件是由内部总线相连。
  2.对于一个汇编程序员来说,CPU中主要部件就是寄存器,而寄存器是CPU中程序可以用指令读写的部件。程序员可以通过改变各种寄存器中的内容来实现对CPU的控制;

//===============================================

2.1通用寄存器
   1.8086所有的寄存器都是16位的,可以存放两个字节;
   (1.)AX、BX、CX、DX
   (2.)AX可以分为 AH 和AL  
         BX可以分为 BH 和BL
         CX可以分为 CH 和CL
         DX可以分为 DH 和DL

AH,BH,CH,DH称之为:高八位;
AL,BL,CL,DL称之为:低八位;
为什么他们要分面两个寄存器:
        主要是8086要对上一代的CPU(8位)进行兼容对这样做的,如果不这样做的话,那么很多的8086上一代的CPU的软件是无法在16位的8086上进行工作的。

//===============================================

2.2字在寄存器中的存储
1.
    为了对兼容性的考虑,8086CPU可以一次性的处理以下的两种尺寸的数据;
       (1)字节:记为Byte,一个字节由8个bit组成,可以存在8位寄存器中;
    
       (2)字:记为word,一个字由两个字节组成的,这两个字节分别称为这个字的高位字节和低位字节;

2.一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。

//---------------------------------------------
                 计算机中的数制
任何数据,到了计算机中都是以二进制的形式存放的。
//---------------------------------------------

//===============================================

2.3几条汇编指令
mov ax, 18    将18送入寄存器AX当中;
mov ah, 78    将78送入寄存器AH当中;
add ax, bx    将寄存器AX和寄存器内容相加放到AX当中
mov ax, bx    将BX当中的数据移到AX当中;
add ax, bx    寄存器AX与寄存器BX同,内容相加放到AX当中;

//----------------------------------------------
//----------------------------------------------
检测点 2.1
(1)写出每条汇编指令执行后相关寄存器中的值;
mov ax,62627   ax=f4a3h
mov ah,31h     ax=31a3h
mov al,23h     ax=3123h
add ax,ax      ax=6246h
mov bx,826c    bx=826ch
mov cx,ax      cx=6246h
mov ax,bx      ax=826ch
add ax,bx      ax=04d8h
mov al,bh      ax=0482h
mov ah,bl      ax=6c82h
add ah,ah      ax=d882h
add al,6       ax=d888h
add al,al      ax=d810h
mov ax,cx      ax=6246h

(2)只能使用目前学过的汇编指令,最多使用4条指令,编程计算机2的4次方;
mov ax, 2; 2
add ax,ax; 4
add ax,ax; 8
add ax,ax; 16

//===============================================
2.4物理地址
   CPU访问内存单元时,要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间,第一个内存单元在这个空间中都有唯一的地址,我们这个唯一的地址称为物理地址;

   CPU通过地址总路线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总路线上发出物理地址之前,首先要是内部形成这个物理地址,不同的CPU可以有不同的形成物理地址的方式。

//===============================================

2.5 16位结构的CPU
    上一代的CPU(8080 8085等都是8位机)而8086是16位的,也可以说8086是16位结构的CPU;那这个16位的解释:
     1.运算器一次最多可以处理16位的数据;
     2.寄存器的最大宽度为16位;
     3.寄存器和运算器之间的通路为16位;
8086是16位结构的CPU,也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息最大长度是16位的。内存单元的地址在送上地址总线之前,必须在CPU中处理、传输、暂时存放,对于16位CPU,能一次性处理、传输、暂时存储16位的地址;


//===============================================

2.6 8086CPU给出物理地址的方法(这里是重点)

   8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次性处理传输、暂时存储的地址为16位。从8086内部结构来看,如果将地址从内部简单地发出,那么它中能送出16位的地址,表现出的寻址能力也就只有64kb;

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

地址加法器采用:
     物理地址=  段地址X16+偏移地址
的方法用段地址和偏移地址合成物理地址。


//===============================================

2.7“段地址X16+偏移地址=物理”的本质含义

        本质含义:CPU在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址;
         更一般的说:8086CPU的这种寻址功能是:“基础地址+偏移地址=物理地址”寻址模式的一种具体实现方案。8086CPU中,段地址X16可以看作是基础地址;


//===============================================

2.8 段的概念
   内存并没有分段,段的划分来自于CPU,由于8086CPU用“基础地址(段地址X16)+偏移地址=物理地址”的方式给出的内存单元的物理地址,使得我们可以用分段的方式来管理内存。
    注意点:段地址X16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB;

//----------------------------------------------
//----------------------------------------------检测点2.2
(1)给定段地址为00001H,仅通过变化偏移地址寻址,CPU的寻址范围为()到();

(2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到些单元。则SA应满足的条件是:最小为(),最大为();
提示,反过来思考一下,当段地址给定为多少,CPU无论怎么变化偏移地址都无法寻到20000H单元?

//===============================================

2.9 CS和IP
  CS和IP是8086中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器,从名称上我们可以看出它们和指令的关系。
  在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存:M X16+N 单元开始,读取一条指令并执行。
   也可以这样表述:8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。
    
  在8086CPU 加电启动或复位后(即CPU刚开始工作时)CS被设置为CS=FFFFH, IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H中读取指令执行,FFFF0H单元中
  的指令是8086PC机开机后执行的第一条指令。
  
  CPU根据什么将内存中的信息看作指令:
        CPU将CS:IP指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS、IP指向的内容当作指令的段地址和偏移地址,用它们全成指令的物理地址,到内存中读取指令码,执行,如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过;

//===============================================

2.11 修改CS、IP的指令
  1.
  CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容为控制CPU执行目标指令;
  
  2.设置CS:IP的值
   MOV指令不能用于设置CS:IP的值,因为8086没有提供这样的功能。如果现在我们想要修改的话那就用是JMP指令;用这个指令可以简单的修改CS和IP的值;
   
  3.JMP的格式:
       JMP  段地址:偏移地址;

//===============================================

2.12 代码段
    在编程时,可以根据需要,将一组内在单元定义为一个段,我们可以将长度为N(N<=64KB)的一组代码,存在一组连续、起始地址为16的倍数的内存单元中,我们可以认为,这段内在是用来存放代码的,从而定义了一个代码段;


8086CPU的工作过程:
   1.从CS:IP指向的内存单元读取指令,读取指令进入指令缓冲器;
   2.IP指向下一条指令;
   3.执行指令。
//----------------------------------------------
//----------------------------------------------
检测点2.3
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
MOV AX,BX    
SUB AX,AX
JMP AX

一共修改了4次
第一次是执行完MOV AX,BX
第二次是执行完SUB AX,AX
第三次是读入AX的值到IP中;
第四次是执行;
此时的AX的值是零;
     到这里第二章算是学完了,不过还得多复习。加强

你可能感兴趣的:(汇编语言学习笔记 ( 第二章))