IBM-PC汇编语言程序设计-第二章:80x86计算机组织

8086计算机组织

一.微机的一般构成

运算器、控制器(中央处理器)、存储器、I/O设备

在这里插入图片描述

1.CPU

包括:运算器和控制器

功能:

在这里插入图片描述

2.主存储器

功能:存放程序和数据的部件。

  • 存储器容量:存储单元的多少
  • 对于每一个存储单元的访问都需要通过:地址

tips:

1.关于存储单元

在这里插入图片描述

大多数的计算机的存储器组织都是以字节为基本单位。每一个基本单位就是存储器。

2.习惯上将CPU和主存储器合称为主机


下图为一个存储器示意图:

在这里插入图片描述

这里就不是以字节为基本单位,而是以10为bit为基本单位,那么可以有:
2 10 = 1024 = 1 K 2^{10}=1024=1K 210=1024=1K



tips:主存储器和外村是不一样的东西,外存是为位于主机之外的。


3.输入输出设备

输入设备:将外部数据输入到计算机内部。

输出设备:将计算机内部数据显示给外界。

不同系统的工作速度、工作原理以及要处理的信息格式相差较大。

4.系统总线

系统总线将CPU、存储器和I/O设备连接起来,实现各个部分之间的各种信息传送。

包括:

  • 数据总线
  • 地址总线
  • 控制总线

这三种总线都是属于系统总线,只是传输的内容不同罢了。

二.Intel 8086/8088 CPU的功能结构

汇编程序是由一些列指令(指令序列)组成的。

指令:构成汇编语言的基本单位,就像高级语言中的语句。

CPU执行指令序列的过程就是重复执行:

  • 从存储器中取指令;
  • 执行指令规定操作。

这两个步骤的执行又可以分为:串行执行指令流水线方式

  • 串行执行:

    在这里插入图片描述

    特点:

    1. 取指令时:总线处于忙碌状态,所占的时间较长,cpu的处理指令序列的时间要少很多,因此时间分配不是非常均匀。
    2. 执行指令时:总线处于闲置状态,cpu花费时间要少很多。
  • 指令流水线方式:

    这种方式效率更高,最早出现在8086/8088 CPU中。但是要想实现这种方式,需要将CPU划分为两个单元。


    在这里插入图片描述

    左边的为执行单元,右边为总线接口单元

    1. EU主要执行计算和处理。

      • 组成:上半部分是通用的寄存器,下方的分别为暂存器、逻辑计算单元、标志寄存器。

      • 功能:

        1‘.从指令队列取出代码,由控制器译码后产生对应的控制信号,完成各个部件的操作。

        这里你可以理解为,EU控制器依次从指令队列取出代码并将代码转换为物理电信号,使得计算机组件发生相应变化。

        2’.对操作数执行各种指定的算术或逻辑运算

        这里有通用寄存器,可以完成相应的计算操作。

        3‘与BIU交互并发出相应的I/O指令。

    2. BIU就是起到一个和总线交互的功能。

      • 组成:右边的段地址寄存器主要起到的是帮助总线找到存储单元的地址(addresss):
        a d d r e s s = a d d r e s s b a s e + o f f s e t address=address_{base}+offset address=addressbase+offset

      • 功能:

        1’取指令:根据指令指针IP和CS寄存器存储内容共同形成的存储单元地址来取得存储单元中的指令,并暂存到指令队列中去,让EU取走。

        2’存数据:接受来自EU的指令、数据,结合段地址寄存器进行数据存储。


在这里插入图片描述

可以很明显地看到,将CPU分成两部分后,让两部分”分工合作“,工作四件分配的当,系统总线就不会太极端——忙的时候很忙,闲的时候非常闲。

三.Intel 8086/8088 CPU的寄存器以及功能

在这里插入图片描述

通用寄存器:前四个分为AH、AL这种格式(高八位和低八位)。

控制寄存器:IP指令指针表示指向哪一条指令,FLAGS记录状态。

1.通用寄存器

Intel 8086/8088拥有8个16位通用寄存器,具有良好的通用性,同时也有特定功能。

(1)数据寄存器
组成

包括AX、BX、CX、DX四个寄存器,既可以是单独的16位寄存器,也可以将一个寄存器分为2两个8位寄存器使用。

功能

既可以用来存放参加运算的操作数,同时也可以存放运算的结果

eg:

MOV AX, BX 将BX内容送到AX中

ADD CH, DH 将DH内容与CH相加并送入CH中


tips:

在有些指令中,我们默认使用某些寄存器。

eg:在循环指令LOOP中,CX被隐含作为循环次数计数器。

(2)指针寄存器
组成

指针寄存器有堆栈指针SP和基址指针BP。

功能
  • SP指针,进行堆栈操作时候,被隐含使用,用于指向栈顶顶部单元
  • BP指针,用来指向堆栈段内的某一存储单元;
  • BP指针同时还可以用于存放参加运算的运算数、输出结果。
(3)变址寄存器

有两个16位变址寄存器SI(source)和DI(destination),一般被用来作地址指针。

组成

SI是源变址寄存器,DI是目的变址寄存器。

功能
  • 一般被用来作为地址指针,指向地址;
  • 同BP寄存器一样,SI和DI也可以作为通用数据寄存器存放操作数和运算结果

2.段寄存器

首先需要了解什么是?段其实就是存储器的一种运行机制,CPU会在程序运行时,将存储器分为多个段,每个段存放不同的内容,eg:程序运行代码、数据等。CPU要从存储器存取信息时,就需要要通过地址,地址的话不是一下子确定的,而是通过:基址(开始地址) + 偏移量实现的。CPU就会使用一个段寄存器去存储基址,再拿一个寄存器去存储偏移量,两个内容相加就得到了存储单元的地址了。

在这里插入图片描述

把这张图解释一下:CS(code)、DS(data)、SS(stack)、ES(else)分别存储的是代码段、数据段、堆栈段、附加段的段基址。

理想状态下,存储器是可以分为任意多个段的,但是考虑到只有4个段寄存器,因此我们实际应用只有4个段。

因此,你访问一个存储单元地址:

  • 明确基址
  • 明确偏移量

3.指令指针

组成

IP指令指针寄存器,FLAGS标志寄存器

功能
  • 根据上方说法,CPU从存储器取得指令时,如果我要取得代码段地址,那么就得以寄存器CS作为代码段的基址指针,那么偏移量谁来存储呢?

    答案就是专用寄存器的指令指针寄存器IP。

    IP存储偏移量,CS存储代码段基址。

  • 当CPU从内存中取出一条指令时,IP内容自动修改为指令下一条指令。


tips:IP寄存器的地址不能够被修改,只能偶通过某些操作,系统对IP内容自动修改。


4.标志寄存器

组成

FLAGS

功能

标志寄存器是用来反应CPU在程序运行时候的某些状态,比如说:是否进位、奇偶性、结果符号、结果是否位0等待。

在这里插入图片描述

这些标志位的具体用法下面会讲述。我们先看一下这些位的分类:

  • 控制标志:TF、DF、IF
  • 状态标志:CF、PF、AF、ZF、SF、OF
(1)进位标志位

算术运算时,如果最高位(对于bit是15位,对于byte是第7位)产生进位或者错位时CF自动置为"1",否则置为"0"。

在移位类指令中,CF也被用来存放从最高位或最低为移出的数值(0或1)。

(2)奇偶标志位PF

当指令操作结果的**低8位**中含有1的个数位偶数时,则PF被置为1,否则为0。

(3)辅助进位标志位AF

若低字节的低四位(半个字节)向高四位产生进位或者错位——第三位产生进位或者借位,AF会被置为1,否则置为0。

(4)零值标志位

如果运算结果各个位置都为0,则ZF为1,否则为0

(5)符号标志位

如果为正数则为0,负数为1

(6)溢出标志位

如果运算结果超过机器用补码能够表示的范围,OF为1,否则为0

tips:溢出和进位是两个完全不同的概念。

在这里插入图片描述

(7) 单步标志位(Trace Flag,TF)

单步标志位常常用于程序的调试,当TF被设置为1的时候,每执行一条指令,CPU暂停运行。

(8)中断允许标志位(IF)

当IF被置为1时,CPU可以相应可屏蔽中断,否则不允许响应可屏蔽中断。

(9)方向标志位(DF)

DF是控制标志位,用来规定串指令的递减方向。当DF=0时,变址寄存器等的内容递增,否则递减。

四.存储器的组织结构

1.存储器的组成

  • 存储器是由多个存储单元构成

    存储器容量:存储单元的多少。

  • 每个存储单元存放相同长度的二进制数。

    一个存储单元的**长度一般为8位的二进制数**,为一个字节

  • 每个存储结构有唯一一个地址:

    Intel 8086/8088CPU拥有20根地址线,那么可以找得到的地址个数为:
    2 20 2^{20} 220
    这叫做寻址能力,为1兆字节空间。当然为了书写方便,经常使用 十六进制数进行表示。

  • 任何两个相邻的字节存储单元构成一个字单元

    数据在字单元中的存储遵循**”低对低,高对高“**——也就是说16位的长数据将低8位存储到低字节中,高8位存储在较高地址字节中。

  • 在定义一个地址的时候必须指出是字还是字节类型

2.存储器的段结构

我们已经知道了8086/8088的寻址空间结构位1MB,也就是20位的二进制数,但CPU内部的寄存器长度位16位,也就是实践上能够直接访问的空间。

(1)存储器段结构特点
  1. 8086/8088 CPU将2^20bit的存储空间分为了若干段,每个段的最大长度位64k,也就是寄存器中可以直接访问地址的最大数量。

  2. 段基址必须是一个小节的首址,即: 每个小节的首地址必须为0.

    tips:每16个字节单元,称为一个小节(Paragraph),所以,1MB可以划分:
    2 20 ÷ 2 16 = 2 4 2^{20}\div2^{16}=2^{4} 220÷216=24

  3. 逻辑段在物理存储器中可以是邻接的、间隔的、部分重叠的和完全重叠的。

    tips:逻辑段指的是汇编语言源程序设计中的段。

    在这里插入图片描述

  4. 同一个时刻,由于我们8086/8088 CPU只有四个寄存器,最多只能访问4个当前段中的内容。

(2)逻辑地址和物理地址及其对应关系
  1. 物理地址

    在8086/8088CPU的1MB的存储空间中,每个存储单元的物理地址是唯一确定的,是该存储单元的20位bit地址。

    在这里插入图片描述

  2. 逻辑地址

    为了程序开发方便对存储器进行的动态管理,使用的是逻辑地址——包括段基址和偏移量

    eg:C语言中,我们的一个指向int变量的指针的值就是类似于逻辑地址,这个值在CPU内存中实实在在存储的地方就是物理地址。

    • 段基值:存放在某一个段寄存器中,是**逻辑段起始单元地址(段基址)的高16位**。
    • 偏移量:表示某个存储单元与他所在段基址之间的字节距离。(注意区分哦)
    • 逻辑地址表示方法段基值:偏移量

    在这里插入图片描述

  3. 逻辑地址转换为物理地址

    BIU需要将逻辑地址转换为了物理地址,eg:当CPU需要访问存储器时候。

    转换方法:将逻辑地址段基值左移动4位 -> 20位的段基址 ,然后加上16位的偏移量。

    在这里插入图片描述

    tips:同一个物理地址可以被两个逻辑段的段基址映射:

    在这里插入图片描述

  4. 逻辑地址来源

    在程序执行过程中,CPU根据不同操作类型访问(也就是不同段寄存器存储内容类型)存储器,其访问的**段基值和偏移量**来源不同。

    在这里插入图片描述

    tips:如果允许替代,我们替代来源称为段超越

五.堆栈及其操作方法

堆栈是一个特定的存储区,主要用于暂存数据以及在过程调用或者处理中断时保存断点信息

1.堆栈的构造

堆栈一般分为:专用堆栈存储器软件堆栈

  • 专用堆栈存储器:按堆栈工作方式专门设计的存储器
  • 软件堆栈:由程序设计人员在内存中划出的一块存储区为堆栈来使用

在这里插入图片描述

这其实就是我们数据结构中的堆栈:Bottom端是固定的,TOP端是浮动的。 为了指示堆栈中存存放数据的位置,使用SP堆栈指针寄存器存储堆栈段基址与栈顶之间的字节距离

  • 当(SP)为最大值(初始值)时,堆栈为空,当(SP)=0时,对堆栈满了(特别注意一下);
  • 每增加一个数据,则SP减1;
  • 当SP被初始化时,指向栈底+2单元——其值就是堆栈长度,由于SP是16位寄存器,那么堆栈长度最长位64k。
  • 数据在堆栈中的存放:以(2个字节)为单位存放,低八位放入低地质单元,高八位放入较高地址单元。
  • 通过改变堆栈段寄存器的内容,可以改变到另一个堆栈段——切换堆栈。

2.设置堆栈

  • 建立堆栈:如果要设置堆栈,需要对堆栈段寄存器和堆栈指针进行赋值。

  • 进栈:把数据存入堆栈,由指令PUSH或者由机器自动实现,把通用寄存器、段寄存器或者字存储单元的内容压入堆栈顶部。

    在这里插入图片描述

    执行过程:

    1. 堆栈指针SP-2并将其指向一个空存储单元(之所以要-2是因为以为单位)
    2. 将要存储内容送入SP指向字单元中。(SP)<=数据
  • 出栈操作:从堆栈顶部弹出一个字到通用寄存器、段寄存器或者是存储单元。

    在这里插入图片描述

    执行过程:

    1. 将SP指向字单元的内容送到指定的寄存器或者是存储器;

    2. 令SP+2

      在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值