. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->自由讨论区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  《汇编语言》第二版 文本版手工录入中.....(有朋友帮忙一起打印吗)  [待解决] 回复[ 7次 ]   点击[ 435次 ]  
chns811
[帖 主]   [ 发表时间:2009-12-27 22:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-04 00:24
《汇编语言》第二版 
               作者:王爽 
版次:2008年4月第2版 字数:527千字
出版发行:清华大学出版社
               内容简介

  汇编语言是各种CPU提供的机器指令的助记符的集合,人们可以用汇编语言直接控制硬件系统进行工作。汇编语言是很多相关课程(如数据

结构、操作系统、微机原理等)的重要基础。为了更好地引导、帮助读者学习汇编语言,作者以循序渐进的思想精心创作了这本书。本书具有如

下特点:采用了全新的结构对课程的内容进行组织,对知识进行最小化分割,为读者构造了循序渐进的学习线索;在深入本质的层面上对汇编

语言进行讲解;对关键环节进行深入的剖析。
  本书可用作大学计算机专业本科生的汇编教材及希望深入学习计算机科学的读者的自学教材。

       前 言

  汇编语言是很多相关课程(如数据结构、操作系统、微机原理等)的重要基础。其实仅从课程关系的角度讨论汇编语言的重要性未免片面,

概括地说,如果你想从事计算机科学方面的工作的话,汇编语言的基础是必不可缺的。原因很简单,我们的工作平台、研究对象都是机器,汇

编语言是人和计算机沟通的最直接的方式,它描述了机器最终所要执行的指令序列。想深入研究英国文化,不会英语行吗?汇编语言是和具体的

微处理器相联系的,每一种微处理器的汇编语言都不一样,只能通过一种常用的、结构简洁的微处理器的汇编语言来进行学习,从而达到学习

汇编的两个最根本的目的:充分获得底层编程的体验,深刻理解机器运行程序的机理。这两个目的达到了,其他目的也廉洁自然而然地达到了

。举例来说,你在学习操作系统等课程时,对许多问题就会有很通透的理解。
  学习不能在一台抽象的计算机上来进行,必须对一台具体的计算机来完成学习过程。为了使学习的过程容易展开,我们采用了以8086CPU为

中央处理器的PC机来进行学习。8086CPU满足的条件:常用而结构简洁,常用保证了可以方便地进行实践,结构简洁则便于进行教学。纯粹的

8086PC机已经不存在了,对现今的机器来讲,它已经属于古玩。但是,现在的任何一台PC机中的微处理器,只要是和Intel兼容的系列,都可以

8086的方式进行工作。可以将一个奔腾系列的微处理器当作一个快速的8086微处理器来用。整个奔腾PC的工作情况也是如此,可以当作一台高

速的8086PC来用。关于微处理器及相关的一些问题请参看附注1。
  为了更好地引导、帮助学习者学习汇编语言,作者精心创作了这本书。下面对教学思想和教学内容的问题进行一些探讨,希望在一些重要

的问题上和读者达到共识。

  1.教学思想

  一门课程是由相互关联的知识构成的,这些知识在一本书中如何组织则是一种信息组织和加工艺术。学习是一个循序渐进的过程,但并不

是所有的教学都是以这种方式完成的,这并不是我们所希望看到的事情,因为任何不以循序渐进的方式进行的学习,都将出现盲目探索和不成

系统的情况,最终学习到的也大都是相对零散的知识,并不能建立起一个系统的知识结构。非循序渐进的学习,也达不到循序渐进学习所能达

到的深度,因为后者是步步深入的,每一步都以前一步为基础。
  你也许会问:“我们不是一直以循序渐进的方式学习吗?有哪本书不是从第一章到最后一章,又有哪门课不是从头讲到尾的呢?”
  一本书从第一章到最后一章,一门课从头到尾,这是一个时间先后的问题,这并不等于就是以循序渐进的方式在学习。我们是否常有这样

的感受?想认真地学习一门较难的课程,可是却经常看不懂书上的内容;有时觉得懂了,可又总有一种不能通透的感觉,觉得书上的内容再反复

看,也不能深入下去了。这些情况都说明,我们并未真正以循序渐进的方式学习。
  不能循序渐进地学习的根本原因在于:学习者所用的教材并未真正按循序渐进的原则来构造。这不是一个简单的问题,不是按传统的方法

划分一下章节就可以解决的。举例来说,在传统的汇编教材中,一般都在开始的章节中集中讲CPU的编程结构,这一章往往成为大多数初学者的

障碍。这章所讲的内容有的需要了解其他的知识才能深入理解,可是这些知识都被忽略了;有的需要有编程经验才能深入理解,或不进行具体

编程就根本无法理解,可编程要在后面的章节里进行……
  为学习都构造合理的学习线索,这个学习线索应真正地遵循循序渐进的原则。我们需要打破传统的章节草分,以一种新的艺术来对课程的

内容进行补充、分割、重组,使其成为一个个串联在学习线索上的完成特定教学功能的教学节点。本书以此作为创作的核心念,打破了传统的

章节划分,构造了合理的学习线索,将课程的内容拆解到学习线索中的各个教学节点中去。学习主线索上的教学节点有4类:①知识点(即各小

节内容);②检测点;③问题分析;④实验。还有一种被称为附注的教学节点不在学习主线索之中,是由知识点引出的节点,属于选看内容。
  应用这本书,读者将沿着学习线索来学习一个个知识点,通过一个个检测点,被线索引入到一个个问题分析之中,并完成一个个实验,线

索上的每一个教学节点都是后续内容的基础。每一个节点的信息量或难度,又只比前面的多一点,读者在每一步的学习中都会有一种有的放矢

的感觉。大的困难被分割,读者在学习的过程中可逐步克服。
  这好似航行,我们为学习者设计一条航线,航线上分布着港口,每一个港口都是一下个港口的起点。漫长的旅途被一个个港口分割,我们

通过到达每个港口来完成整个航行。
  为了按循序渐进的原则构造学习线索,本书采用了一种全新的信息组织和加工艺术,我们称其为:知识屏蔽。有的教材只注重知识的授予

,并不注重知识的屏蔽。在教学中知识的屏蔽十分重要,这是一个重点突出的问题。计算机是一门交叉学科,一部分知识往往还连带着其他的

相关内容,这些连带的相关内容如果处理不好,将影响学习者对目前要掌握的知识的理解。本书采用了知识屏蔽的方法,对教学内容进行了最

小化分割,力求使我们的在学习过程中所接触到的每一个知识点都是当前唯一要去理解的东西。我们在看到这个知识点之前,已理解了以前所

有的内容;在学习这个知识的过程中,以后的知识也不会对我们造成干扰。我们在整个学习过程中,每一步都走得清楚而扎实,不知不觉中,

由当初的一个简单的问题开始,在经历了一个每一步都相对简单的过程之后,被带入了一个深的层次。这同沿着楼梯上高楼一样,迈出的每一

步都不高,结果却上了楼顶。

  2.本书的结构

  本书由若干章构成,一章包含若干知识点,根据具体内容,还可能包含检测点、问题和分析、实验、附注等教学节点。书中的所有教学节

点,除附注之外,都在一个全程的主线索之中。
  由于本书具有很强的线索性,学习一定要按照教学的线索进行,有两点是必须要遵守的原则:①没有通过检测点不要向下学习;②没有完

成当前的实验不要向下学习。
  下面的表格详细说明了书中的各种教学节点和它们的组织情况。
  教学节点详表(原表格,手打个人重排)
  知识点:学习者的主要知识来源。知识点以小节的形式出现,一个知识点为一个小节。每一个知识点都有一个相对独立的小主题。
  附注:有些内容是对主要内容的拓展、加深和补充。这些内容如果放入正文中,会分散学习者对主体内容的注意力,同时也破坏了主体内

容的系统性。我们把这些内容在附注中给出,供学习者选看。附注不在主线索之中,是主线索的引出内容。
  检测点:检测点用来取得学习情况的反馈。只要通过了检测点,我们就得到了一个保证:已掌握了前面的内容。这是对学习成果的阶段性

的肯定,有了这个肯定,可以信心十足地继续学习。如果没有通过检测点,需要回头再进行复习。有的检测点中也包含了一些具有教学功能的

内容。
  问题分析:引导学习者对知识进行深入的理解和灵活的应用。
  实验:在本书中,实验也是在学习线索中的。有的教学内容就包含在编程的依据材料中。每一个实验都是后续内容的基础,实验的任务必

须独立完成。我们可以这样看待实验的重要性,如果你没有完成当前的实验,就应停止继续学习,直到你独立完成实验。

  3.教学重心和内容特点

  本书的教学重心是:通过学习关键指令来深入理解机器工作的基本原理,培养底层编程意识和思想。本着这个原则,本书的内容将和传统

的教材有着很大的不同。
  (1)不讲解每一条指令的功能
  指令仅仅是学习机器基本原理和设计思想的一种实例。面逐条地讲解每一条指令的功能,不是本书的职责所在,它应该是一本指令手册的

核心内容。这就好像文学作品和字典的区别,前者的重心在于用文字表达思想,后者        讲解每个字的用法。
  (2)编程的平台是硬件而不是操作系统
  这一点尤为重要,直接影响到以后的操作系统的教学。我们必须通过一定的编程实践,体验一个裸机的环境,在一个没有操作系统的环境

中直接对硬件编程。这样的体会和经验非常重要,这样我们才能真正体会到汇编语言的作用,并县看到没有操作系统的计算机系统是怎样的。

这为以后的操作系统的学习打下了一个重要的基础。
  (3)着重讲解重要指令的关键概念
  本书的所有内容都是围绕着“深入理解机器工作的基本原理”和“培养底层编程意识和思想”这两个核心目标来进行的。对所有和这两个

目标关系并不密切的内容,都进行了舍弃。使学习者可以集中注意力真正理解和掌握那些具有普遍意义的指令和关键概念。

  4.读者定位

  本书可用作大学计算机专业本科的汇编教材,和希望深入学习计算机科学的学习者的自学教材。本书的读者应具备以下基础:
  (1)具有计算机的使用经验;
  (2)具有二进制、十六进制等基础知识;
  (3)有有一门高级语言(BASIC、PASCAL、C...)的基本编程基础。

  5.联系方法

  作者的E-mail地址为:fewstu@163.com。
chns811
[第1楼]   [ 回复时间:2009-12-27 22:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-04 00:24
点座位
chns811
[第2楼]   [ 回复时间:2009-12-27 22:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-04 00:24
完成后可以方法在手机中阅读,走到哪学到哪,呵呵
wujie6533213
[第3楼]   [ 回复时间:2009-12-27 22:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-24 09:39
一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。
内部总线实现CPU内部各个器件之间的联系,简单的讲,在CPU中:

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

        CPU中主要的器件是寄存器,寄存器是CPU中程序员可以用指令读写的部件,程序员通过改变各种寄存器中的内容来实现对CPU的控制。

不同的CPU,寄存器的个数、结构是不同的。8086CPU有14个寄存器,每个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。


通用寄存器
8086寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,被称为通用寄存器
以AX为例,寄存器的逻辑结构如图2.1所示。

        8086CPU的上一代CPU中的寄存器都是8位的,为了保证兼容,使原来基于上代CPU编写的程序稍作修改就可以运行在8086之上,8086 的AX、BX、CX、DX这4个寄存器都可以分为两个可独立使用的8位寄存器来用:
AX可分为AH和AL
BX可分为BH和BL
CX可分为CH和CL
DX可分为DH和DL

AX的低8位(0~7)构成了AL寄存器,高8位(8~15)构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器。


字 在寄存器中的存储
        由于对兼容性的考虑,8086CPU可以一次性处理以下两种尺寸的数据。
字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中;
字:  记为word,一个字由两个字节组成,这两个字节分别称为这个字的        高位字节和地位字节
       
       一个字可以存储在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位和低8位寄存器中。
                                              十六进制的一位为二进制的四位
十六进制 H 表示             二进制 B 表示 

              
几条汇编指令
通过汇编指令控制CPU工作,看一下2.1中的几条汇编指令。
汇编指令        控制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        
在写一条汇编指令或者一个寄存器的名称时不区分大小写。 如:mov ax,18和MOV AX,18的意义含义相同


程序段中的指令        指令执行后AX中的数据        指令执行后BX中的数据        
mov ax,4E20H        4E20H        0000H        
add ax,1406H        6226H        0000H        
mov bx,2000H        6226H        2000H        
add ax,bx        8226H        2000H        
mov bx,ax        8226H        8226H        
add ax,bx        ?        8226H        
                        
指令执行后AX的数据是多少? 思考后看分析:
        分析:
          程序中最后一条指令add ax,bx执行前寄存器AX、BX中的内容都为8226H,两者相加后等于1044CH,但是AX是16位寄存器,而16位寄存器只能存储4位16进制数,所以最高位的1不能存储到AX中,所以最后为044CH.
        
        在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的
        
        一些错误的例子:
        mov ax,bl                (在8位寄存器和16位寄存器之间传送数据是错误的)
        mov bh,ax                (在16位寄存器和8位寄存器之间传送数据是错误的)
        mov al,20000              (8位寄存器最大只可存储255的数据)
        add al,100H                (将一个高于8位的数据添加到一个8位寄存器中)
 以上一些都是错误的指令,错误的原因是指令的两个操作对象位数不一样

    检测点2.1
(1) 写出每条汇编指令执行后相关寄存器中的值。
                                                                           
        mov ax,62627    AX=                       将十进制数62627送入AX寄存器
        mov ah,31H      AX=                       将31H送入AX寄存器的高八位
        mov al,23H       AX=                       将23H送入寄存器AX的低八位
        add ax,ax        AX=                       将AX寄存器的值与AX寄存器的值相加
        mov bx,826cH    BX=                        将826CH送入寄存器BX
        mov cx,ax        CX=                       将AX寄存器的内容送入CX寄存器
        mov ax,bx        AX=                       将BX寄存器的内容送入AX寄存器
        add ax,bx        AX=                       将AX的值与BX的值相加 结果保存在AX
        mov al,bh        AX=                       将BX的高八位送入AX的低八位
        mov ah,bl        AX=                       将BX的低八位送入AX的高八位
        add ah,ah        AX=                       将AX的高八位与AX的高八位相加
        add al,6          AX=                       将AX的低八位al的值加6
        add al,al          AX=                       将AX的低八位与AX的低八位相加
        mov ax,cx         AX=                       将CX寄存器的内容送入AX

(2)只能用目前所学过的汇编指令,最多使用4条指令,编程计算2的4次方。
物理地址
CPU访问内存单元时,要给出内存单元的物理地址。所有内存单元构成的存储空间是一个一维线性空间,每个内存单元在这个空间中都有一个唯一的地址,称为物理地址。
CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同 的CPU有不同的形成方式。


16位结构的CPU
概括的讲(16位机、字长为16位等常见说法,与16位结构含义相同)16位结构CPU具有以下几方面结构特性:
运算器一次最多可以处理16位的数据;
寄存器的最大宽度为16位;
寄存器和运算器之间的通路为16位。
       
      8086 是16位机构的cpu,能一次处理、传输、暂时存储16位的地址。

 
8086 CPU给出物理地址的方法
8086 CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。但8086CPU内部是16位机构,一次处理、传输、暂时存储的地址为16位,如果只简单的发出地址信息,那么它只能送出16位地址,,表现出的寻址能力只有64KB。
所以8086 CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址
        8086 内部逻辑结构图如2.6所示
如图所示,当8086 CPU要读写内存时:
CPU中的相关部件提供两个16位的地址,称为段地址和偏移地址;
段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
地址加法器将两个16位地址合成一个20位的物理地址;
地址加法器通过内部总线将20位物理地址送入输入输出电路;
输入输出控制电路将20位物理地址送上地址总线;
20位物理地址被地址总线送到存储器。

        地址加法器采用 基础地址(段地址×16)+偏移地址=物理地址 的方法用段地址和偏移地址合成物理地址。
     
     “段地址×16”有一个更为常用的说法是左移四位,四位指的是二进制的位。
     
     例子:一个数据为2H,二进制10B,左移运算:
左移位数          二进制        十六进制        十进制        
0        10B        2H        2        
1        100B        4H        4        
2        1000B        8H        8        
3        10000B        10H        16        
4        100000B        20H        32        
         仔细观察,发现:
一个二进制左移一位,相当于该数据乘以二、左移N位相当于乘以2的N次方
地址加法器是以二进制形式存放的段左移四位来完成段地址×16的运算。
一个数据的16进制的数左移一位相当于乘以16,十进制左移一位相当于乘以10,一个X进制的数据左移一位,相当于乘以X。


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

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



段的概念
存储器是被划分为若干个单元的一维线性存储空间,所以这里的段并不是指存储器中的段,而是相对于8086CPU的内部。
段的划分来自于CPU ,由于8086CPU用“基础地址(段地址×16+偏移地址+物理地址)”的方式给出内存单元的物理地址,使得我们可以用段的方式来管理内存。

以后,在编程时可以根据需要,将若干个地址连续的内存单元看作一个段,用段地址×16 定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两点需要注意:  段地址×16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位,16位地址寻址能力为64KB,所以一个段的大小为64KB。

内存单元地址小结
CPU 访问内存单元时,必须向内存提供内存单元的物理地址。8086 CPU内部用段地址和偏移地址相加的方法形成最终的物理地址。

结论:CPU可以 使用不同的段地址和偏移地址来形成一个物理地址。
比如CPU要访问21F60H单元,则它给出段地址SA和偏移地址EA满足SA×16+EA=21F600H即可。

如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可定为多少单元?
结论: 偏移地址16位,变化范围0~FFFFH,仅用偏移地址寻址最多可寻64KB个内存单元
比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H~1FFFFH。

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

监测点2.2
给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围      到      。
   物理地址=段地址×16+偏移地址,所以这里段地址为0001H×16,偏移地址最大为64K=65535=FFFF 所以结果为 10H 到 1000FH
有一数据存放在内存20000H单元中,现给定段地址位SA,若想用偏移地址寻址到此单元,则SA应满足的条件是:最小为       ,最大为        。
段地址*16+偏移地址=20000H (偏移地址的变化范围:0~FFFFH) (内存单元的物理地址20000H一定,偏移地址越小,段地址则越大;偏移地址越大,段地址则越小) 当偏移地址的值为最小值0时,段地址取得最大值2000H; 当偏移地址的值为最大值FFFFH时,“段地址*16”的值为10001H,不为16的倍数,所以,偏移地址最大只能取到FFF0H才能使“段地址*16”的值为16的倍数,此时“段地址*16”取得最大值:10010H;段地址取得最大值:1001H
段寄存器
         段地址在8086的段寄存器中存放,8086共有4个段寄存器:CS、DS、SS、ES。当CPU要访问内存时,由这四个段寄存器提供内存单元的段地址。 本章只看下CS。


CS和IP
        CS和IP是8086 CPU中两个最关键的寄存器,它们指示了CPU当前读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器,从名称上可以看出它们的关系。
8086 CPU机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M×16+N单元开始,读取一条指令并执行。
     也可以这样表示:8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行
图2.10的说明:
8086cpu当前状态:CS中的内容为2000H,IP中的内容为0000H;
内存20000H~20009H单元存放着可执行的机器码;
内存20000H~20009H单元中存放的机器码对应的汇编指令如下:
地址:20000H~20002H,内容:B8 23 01,长度3Byte,对应汇编指令:mov ax,0123H
地址:20003H~20005H,内容:BB 03 00,长度:3Byte,对应汇编指令:mov bx,0003H
地址:20006H~20007H,内容:89 D8,长度:2Byte,对应汇编指令:mov ax,bx
地址:20008H~20009H,内容:01 D8,长度:2Byte,对应汇编指令:add ax,bx

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


修改CS、IP的指令
        在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器的内容实现对CPU的控制。CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
        
8086CPU中,能够改变CS、IP内容的指令被统称为转移指令,目前只介绍一个可以修改CS、IP值的指令:jmp 指令

若想同时修改CS、IP的内容,可用形如“jmp段地址:偏移地址”来完成。如:
jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。
jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46处读取指令。
“jmp 段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP。
若想仅修改IP的内容,可用形如“jmp 某一合法寄存器”的指令完成,如:
        Jmp ax,  指令执行前:ax=1000H, CS=2000H, IP=0003H
                指令执行后:ax=1000H, CS=2000H, IP=1000H
        jmp bx,  指令执行前:bx=0B16H, CS=2000H, IP=0003H
                指令执行后:bx=0B16H, CS=2000H, IP=0B16H
        
        “jmp 某一合法寄存器”指令的功能为:用寄存器中的值修改IP。
        jmp ax, 在“含以上”好似:mov IP,ax .
        

代码段
   对于8086PC机,在编程时可以根据需要将一组内存单元定义为一个段。我们可以将长度为 N(N≤64KB)的一组代码,存在一组地址连续、起始地址为16的倍数内存单元中,我们可以认为这段内存是用来存放代码的,从而定义了一个代码段 比如:
              mov ax,0000      (B8 00 00)
              add ax,0123      (05 23 01)
              mov bx,ax        (8B D8)
              jmp bx           (FF E3)
 这段代码位10个字节的指令,存放在123B0H~123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存是用来存放代码的,是一个代码段,他的段地址位123BH,长度为10个字节。
  
  我们知道在存存储器中任何信息都是以二进制运算保存,要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。

小结:
段地址在8086CPU的段寄存器中存放,当8086CPU要访问内存时,有段寄存器提供内存单元的段地址。8086CPU有四个段寄存器,其中CS用来存放指令的段地址。
CS存放指令的段地址,IP存放指令的偏移地址。
8086PC机种,任意时刻,CPU将CS:IP指向的内容当作指令执行。
8086cpu的工作过程:
 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器:
 IP指向下一条指令:
 执行指令。(转到步骤,重复这个过程。)
8086CPU提供转移指令修改CS:IP的内容。

问:下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
 mov ax,bx
 sub ax,ax
 jmp ax
wujie6533213
[第4楼]   [ 回复时间:2009-12-27 22:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-24 09:39
第一章    基础知识


机器语言
机器语言是机器指令的集合。展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字,计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。
CPU(Central Processing Unit,中央处理单元):CPU是一种微处理器。以后我们提到的计算机是指CPU和其他受CPU直接或间接影响的芯片、器件、设备组成的计算机系统。如:常见的PC机。
每一种微处理器,由于硬件设计和内部结构不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言


汇编语言的产生
汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。
例如:机器指令 1000100111011000 表示把寄存器 BX 的内容送到AX 中。汇编指令则写成 mov ax,bx 。这样的写法与人类语言接近,便于阅读和记忆。

操作:寄存器 BX 的内容送到 AX 中
机器指令:1000100111011000
汇编指令:mov ax,bx
        寄存器:简单的讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。AX是其中一个寄存器的代号,BX是另一个寄存器的代号。更详细的内容以后课程会讲到。



汇编语言的组成
汇编语言发展至今,有以下3类组成:
汇编指令:机器码的助记符,有对应机器码。
伪指令:没有对应的机器码,由编译器执行,计算机并不执行。
其他符号:如:+、-、*、/ 等…。由编译器识别,没有对应机器码。

汇编语言的核心是汇编指令,它决定了汇编语言的特性。


存储器
          CPU是计算机的核心部件,它控制整个计算机的运作并进行运算。要想让一个CPU工作,就必须向它提供指令和数据。指令和数据都在存储器(内存)中存放,PC机中内存的重要仅次于CPU 。离开了内存,性能再好的CPU也无法工作。磁盘不同于内存,磁盘中的数据如果不读到内存中就无法被CPU使用。要灵活的利用汇编语言编程,我们首先要了解CPU是如何从内存中读取信息、以及向内存中写入信息的。
      
      
指令和数据
指令和数据是应用上的概念。在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。CPU在工作的时候把有的信息看作指令,有的信息看作数据,为同样的信息赋予了不同的意义。 比如围棋的棋子,在棋盒中没有任何区别,在对弈的时候就有了不同的意义。
例如:内存中的二进制信息 1000100111011000 计算机可以把它看作大小为 89D8H的数据来处理,也可以看作 mov ax,bx 来执行。

1000100111011000 → 89D8H (数据)
1000100111011000 → mov ax,bx


存储单元
存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号,例如一个存储器有128个存储单元,编号从0 ~ 127。如右图1.2所示。                         
                                                         
那么一个存储单元能存储多少信息呢?我们知道电子计算机最小信息单位是bit (译:比特),也就是一个二进制位。8个bit组成一个Byte。也就是通常讲的一个字节。微型机存储器的存储单元可以存储一个Byte,即8个二进制位。一个存储器有128个存储单元,它可以存储128个Byte。
微机存储器的容量是以字节为最小单位来计算的。对于拥有128个存储单元的存储器,我们可以说,它的容量是128个字节。



CPU对存储器的读写
CPU要从内存中读数据,首先要指定存储单元的地址。也就是说要先确定它要读取哪一个存储单元中的数据。就像在街上找人,先要确定他住在哪个房子里。
另外,在一台微机中,不只有存储器这一种器件。CPU在读写数据时还要指明,它要对哪一个器件进行操作,进行哪种操作,是从中读出数据,还是向里面写入数据。
可见,CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行以下3类信息交互。
存储单元的地址(地址信息);
器件的选择,读或写的命令(控制信息);
读或写的数据(数据信息);

        那么CPU是通过什么将地址、数据和控制信息传到存储器芯片中的呢?电子计算机能处理、传输的信号都是电信号,电信号当然要用导线传送。在计算机中专门有连接CPU 和其他芯片的导线,通常称为总线。总线从物理上讲,就是一根根导线的集合。根据传送信息不同,总线从逻辑上分为3类,地址总线、控制总线、数据总线。

CPU 从3号单元中读取数据的过程(见图1.3)

















CPU通过地址线将地址信息3发出;
CPU通过控制线发出内存读命令,选中存储器芯片,并通知他,将要从中读取数据;
存储器将3号单元中的数据8通过数据线传入CPU;

写操作与读操作的步骤相似,如向3号单元写入数据26。
CPU通过地址总线将地址信息3发出;
CPU通过控制总线发出内存写命令,选中存储器芯片,并通知它,要向其中写入数据;
CPU将通过数据总线将数据26送入内存的3号单元中。

        从上面我们知道了CPU 是如何进行数据读写的,可是,如何命令计算机进行数据的读写呢?
        要让一个计算机或微处理器工作,应向它输入能够驱动它进行工作的电平信息(机器码)
        对于8086 CPU,下面的机器码,能够完成从3号单元读数据。
        
        机器码:101000000000001100000000
        含义  :从3号单元读取数据送入寄存器AX
        
        CPU接收这条机器码后将完成我们上面所述的读写工作
        
        机器码难于记忆,用汇编指令表示,如下:
        
        机器码:    10100001 00000011 00000000
        对应的汇编指令:MOV AX,[3]
        含义:     传送3号单元的内容入AX
        
        
地址总线
现在我们知道,CPU是通过地址总线来制定存储器单元的,可见地址总线能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址。
现假设:一个CPU有10根地址总线,让我们来看一下它的寻址情况。我们知道,在电子计算机中,一根导线可以传送的稳定状态只有两种,高电平或低电平。用二进制表示就是1或0,10根导线可以传送10位二进制数据。而十位二进制数可以表示多少个不同的数据呢?2的10次方个。最小数为0、最大数为1023

(图1.4)展示了一个具有10根地址线的CPU向内存发出地址信息11时10根地址线上传送的二进制信息。













        考虑一下,访问地址为 12、13、14等的单元时,地址总线上传送的内容是什么?
一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N,这样的CPU可以寻找2的N次方个内存单元


数据总线
CPU与其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界的数据传送速度。 8根数据总线一次可传送一个8位二进制数据(即一个字节)。16根数据总线一次可传送两个字节。
8088 CPU的数据总线宽度为8,8086 CPU的数据总宽度为16。我们分别来看一下它们向内存中写入数据89D8H时 是如何通过数据总线传送数据的。

        8086有16根数据线,可一次传送16位数据(两个字节),所以可一次传送89D8H;而8088只有8根数据线,一次只能传送8位数据(一个字节),所以向内存写入数据89D8H时需要进行两次数据传送。
        
        
控制总线
CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是个总称,控制总线是一些不同控制线的集合。有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。所以,控制总线的宽度决定了CPU对外部器件的控制能力。

前面所讲的内存读或写是由几根控制线综合发出的,其中有一根称为“读信号输出”的控制线负责由CPU向外传送读信号,CPU向该控制线上输出低电平表示将要读取数据;有一根称为“写信号输出”的控制线则负责传送写信号。


1.1~1.10 小结
汇编指令是机器指令的助记符,同机器指令一一对应。
每一种CPU都有自己的汇编指令集。
CPU可以直接使用的信息在存储器(内存)中存放。
在存储器中指令和数据没有任何区别,都是二进制信息。
存储单元从零开始顺序编号。
一个存储单元可以存储8个bit,即8位二进制数。
1Byte=8bit    1KB=1024B    1MB=1024KB    1GB=1024MB    1TB=1024GB
每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个CPU可以引出3种总线的宽度标志了这个CPU的不同方面性能。

地址总线的宽度决定了CPU的寻址能力;
数据总线的宽度决定了CPU与其他器件进行数据传送时的一次数据传送量;
控制总线的宽度决定了CPU对系统中其它器件的控制能力。

        在汇编课程中,我们从功能的角度介绍了3类总线,对实际的连接情况不做讨论。

检测点 1.1
1个CPU的寻址能力为8KB,那么它的地址总线的宽度为        。
(个人总结:2的地址总线次方=寻址能力)   也就是(2^地址总线=寻址能力)
        所以 8KB=8192Byte  8192=2^13 

1KB 存储器有        个存储单元。存储单元的编号从        到        。
(个人总结:1个字节1Byte(8位bit)= 一个单元 )     1KB=1024Byte=1024单元

1KB的存储器可以存储        个bit,        个Byte。
1KB=1024Byte      1024Byte=8192bit
         
1GB、1MB、1KB分别是                    Byte。
(1KB=1024Byte   1MB=1024Byte*1024Byte=1048576   1GB=1024Byte*1024Byte*1024Byte=1073741824     )

8080、8088、80286、80386 的地址总线宽度分别为 16根、20根、24根、32根、则他们的寻址能力分别为:        (KB)、        (MB)、        (MB)、                      (GB)
2^16=65535bit   65535bit/1024=64KB
2^20=1048576bit    1048576bit/1024=1024KB=1M
2^24=16777216bit    16777216bit/1024=16384KB=16MB
2^32=4294967296bit    4294967296bit/1024=4194304kb=4096M=4G

8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、16根、32根。则它们一次可以传送的数据为:       (B)、       (B)、       (B)、       (B)、       (B)、       (B)。
(个人总结:一根数据线一次传送1bit(位),一个字节8位,所以8根一次传送8位,一个字节。以此类推,16根一次16位,两个字节。32根32位4个字节)

从内存中读取1024字节的数据,8086至少要读     次,80386至少要读     次。
(8086数据总线宽度为16根,一次传送16位也就是两个字节,所以要512次
80386数据总线宽度为32根,一次传送32位也就是4个字节,所以要256次)
         
在存储器中,数据和程序以        形式存放。  (0,1   二进制)



内存地址空间(概述)
什么是内存地址空间呢?举例来讲,一个CPU的地址总线宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。下面进行深入讨论,首先需要介绍两部分基础知识,主板和接口卡。


主板
在每一台PC机中都有一个主板,主板上有核心器件和一些主要器件,这些器件通过总线(地址总线、数据总线、控制总线)相连。这些器件有CPU、存储器、外围芯片组、扩展插槽等。扩展插槽上一般插有RAM内存条和各类接口卡。


接口卡
计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制。 CPU对外部设备都不能直接控制,如:显示器、音箱、打印机等。直接控制这些设备进行工作的是插在扩展插槽上的接口卡。扩展插槽通过总线和CPU相连,所以接口卡也通过总线和CPU相连。CPU可以直接控制这些接口卡,从而实现CPU对外设的间接控制。简单的讲,就是CPU通过总线向接口卡发送命令,接口卡根据CPU的命令控制外设进行工作。


各类存储器芯片
一台PC机中,装有多个存储器芯片,这些存储器芯片从物理连接上看是独立的、不同的器件。从读写属性上看分为两类:随机存储器(RAM)和只读存储器(ROM)。随机存储器(RAM)可读可写,但必须带电存储,关机后存储内容丢失;只读存储器只能读取不能写入,关机后其中的内容不丢失。这些存储器从功能和连接上又可分为以下几类。
随机存储器
用于存放供CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成,装在主板上RAM和插在扩展插槽上的RAM

装有BIOS(Basic Input Output System 基本输入/输出系统)的ROM
BIOS是由主板和各类接口卡(如 显卡、网卡等)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。在主板和某些接口卡上插有存储相应BIOS的ROM。例如:主板上的ROM中存储着主板的BIOS(通常称为系统BIOS);显卡上的ROM中存储着显卡的BIOS;如果网卡上装有ROM,那其中就可以存储网卡的BIOS。

接口卡上的RAM
某些接口卡需要对大批量输入、输出数据进行暂时存储,在其上装有RAM。最典型的是显卡上的RAM,一般称为显存。显示卡随时将显存中的数据向显示器上输出。换句话说,我们将需要显示的内容写入显存,就会出现在显示器上。
       图1.7 展示了PC系统中各类存储器的逻辑连接情况。


内存地址空间
        上述的那些存储器,在物理上是独立的器件,但是在以下两点上相同。

都和CPU的总线相连
CPU对它们进行读写的时候都通过控制总线发出内存读写命令

        这也就是说,CPU在操控它们的时候,把他们都当作内存来对待,把它们总的看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间。在汇编这门课中,我们所面对的是内存地址空间。
        
             在图1.8中展示了CPU将系统中各类存储器看作一个逻辑存储器的情况。
        
        在图1.8中,所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据
        
        假设,图1.8中的内存地址空间的地址段分配如下:
        
        地址0 ~ 7FFFH的32KB空间为主随机存储的地址空间;
        地址 8000H ~ 9FFFH的8KB空间为显存地址空间;
        地址 A000H ~ FFFFH的24KB空间为各个ROM的地址空间。
        
        这样,CPU向内存地址为1000H的内存单元中写入数据,这个数据就被写入主随机存储器中;CPU向内存地址8000H的内存单元中写入数据时,这个数据就被写入显存中,然后会被显卡输出到显示器上;CPU向内存地址为C000H的内存单元中写入数据的操作时没有结果的,C000H单元中的内容不会被改变,C000H单元实际上就是ROM存储器的一个单元。
        
        内存地址空间的大小受CPU地址总线宽度的限制。8086CPU的地址总线宽度为20,可以传送2^20个不同的地址信息(大小从0至2^20-1)。既可以定位2^20个内存单元,则8086PC的内存地址空间大小为1MB。同理,80386CPU的地址总线宽度为32,则内存地址空间最大为4GB。
        
        我们在基于一个计算机硬件系统编程的时候,必须知道这个系统中的内存地址空间分配情况。因为当我们想在某类存储器中读写数据的时候,必须知道它的第一个单元的地址和最后一个单元的地址,才能保证读写操作实在预期的存储器中进行。比如,我们希望向显示器中写入数据,必须知道先存在内存地址空间中的位置。
        
        不同的计算机系统的内存地址空间的分配情况是不同的,图1.9展示了8086PC机内存地址空间分配的基本情况。
        
图1.9告诉我们,从地址0~9FFFF的内存单元中读取数据,实际上就是在读取主随机存储器中的数据:向地址A0000 ~ FFFFF的内存单元中写入数据的操作时无效的,因为这等于改写只读存储器中的内容。



内存地址空间
        最终运行程序的是CPU,我们用汇编语言编程的时候,必须要从CPU的角度考虑问题,对CPU来讲,系统中的所有存储器中的存储单元是处于一个统一的逻辑存储器中,它的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间。

    对于初学者,这个概念比较抽象,我们在后续的课程中将通过一些编程实践来增加感性认识
wujie6533213
[第5楼]   [ 回复时间:2009-12-27 22:55 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-24 09:39
楼主有空可以整理下,这是我学的时候第二章和第一章
wxenck
[第6楼]   [ 回复时间:2009-12-30 16:24 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2008-06-18 16:30
需要这样么,下个软件把pdf转成图片,再把图片中的文字截取出来不就行了么
abob
[第7楼]   [ 回复时间:2009-12-30 16:45 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
楼主真是有心人。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved