zoukankan      html  css  js  c++  java
  • 《汇编语言》——王爽 第二章 寄存器

    一个典型的CPU由运算器,控制器,寄存器等器件构成,这些器件靠内部总线相连。前一章所说的总线,相对于CPU内部来说是外部总线。内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。简单地说,在CPU中:

    运算器进行信息处理;

    寄存器进行信息存储;

    控制器控制各个器件进行工作;

    内部总线连接各种器件,在它们之间进行数据的传送。

    对于一个汇编程序员来说,CPU中主要的部件是寄存器。

    不同的CPU,寄存器的个数,结构是不相同的。

    2.1通用寄存器

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

    8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于上代CPU编写的程序稍加修改就可以运行在8086之上,8086CPU的AX,BX,CX,DX这4个寄存器都可以分为两个可独立使用的8位寄存器来用。

    AX可分为AH和AL;....

    2.2字在寄存器中的存储

    出于对兼容性的考虑,8086CPU可以一次性处理以下两种尺寸的数据。

    字节

    字:一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节。

    2.3几条汇编指令

    写一条汇编指令或一个寄存器的名称时不区分大小写。

    CPU在执行这条指令时认为ah和al是两个不相关的寄存器。不要错误地认为,诸如add al,93H的指令产生的进位会存储在ah中,add al,93H进行的是8位运算。

    如果执行add ax,93H,低8位的进位会存储在ah中,CPU在执行这条指令时认为只有一个16位寄存器ax,进行的是16位运算。

    2.4物理地址

    CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以由不同的形成物理地址的方式。现在我们讨论8086CPU是如何在内部形成内存单元的物理地址的。

    2.5 16位结构的CPU

    描述了一个CPU具有下面几方面的结构特性:

    运算器一次最多可以处理16位的数据;

    寄存器的最大宽度为16为;

    寄存器和运算器之间的通路为16位。

    2.6 8086CPU给出物理地址的方法

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

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

    当8086CPU要读写内存时:

    1.CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址

    2.段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;(见书)

    3.地址加法器将两个16位地址合成为一个20位的物理地址

    4.地址加法器通过内部总线将20位物理地址送入输入输出控制电路

    5.输入输出控制电路将20位物理地址送上地址总线

    6.20位物理地址被地址总线传送到存储器

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

    我们可看出:一个数据的十六进制形式左移一位,相当于乘以16;一个数据的十进制形式左移一位,相当于乘以10,;....

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

    不管以多少种不同的逻辑意义去看待“段地址*16+偏移地址=物理地址”的寻址模式,一定要清楚地知道它的本质含义,这样才能更灵活地利用它来分析,解决问题。如果只拘泥于某一种引申出来的逻辑含义,而模糊本质含义的话,将从意识上限制对这种寻址功能的灵活应用。

    2.8 段的概念

    其实,内存并没有分段,段的划分来自于CPU。

    有两点需要注意:段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数,偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB。

    在8086PC机中,存储单元的地址用两个元素来描述,即段地址和偏移地址。

    2.9 段寄存器

    当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。本章中只看一下CS

    2.10 CS和IP

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

    在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行。

    CPU将CS:IP指向的内容当作指令执行(指令和数据的区别)

    8086CPU的工作过程可以简要描述如下:

    1.从CS:IP指向的内存单元读取指令,读取的指令进入指令寄存器

    2.IP=IP+所读取指令的长度,从而指向下一条指令;(如何知道这个指令的长度是多少呢?)

    3.执行指令,转到步骤(1),重复这个过程

    在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令

    2.11 修改CS,IP的指令

    在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令。

    mov指令不能用于设置CS,IP的值,原因很简单,因为8086CPU没有提供这样的功能,8086CPU提供了另外的指令来改变它们的值。

    我们现在介绍一个最简单的可以修改CS,IP的指令:jmp指令

    若想同时修改CS,IP的内容,可用“jmp 段地址:偏移地址”的指令完成。

    若想仅修改IP的内容,可用形如“jmp 某一合法寄存器”的指令完成。

    2.12代码段

    实验1 查看CPU和内存,用机器指令和汇编指令编程

    1.预备知识:Debug的使用

  • 相关阅读:
    一个Package Load Failed问题的解决方法

    .NET相关的最好东西--全球最新评价
    一年了...
    MSBuild 的简单入门
    开发基于.NET Compact Framework的程序时, 常遇到的问题(2) 为什么在Visual Studio 2003调试程序时不能通过ActiveSync连接PDA
    如何:显示用逗号分隔的项集合(摘自MSDN)
    每日一句(2008.10.8)
    每日一句(2008.10.16)
    男人这辈子
  • 原文地址:https://www.cnblogs.com/JasonPeng1/p/12116486.html
Copyright © 2011-2022 走看看