精华内容
下载资源
问答
  • 寄存器如何让cpu工作
    千次阅读 多人点赞
    2022-01-21 18:59:04

    1.CPU

    • 编译器是一个程序,它可以将我们所写的程序翻译成特殊的机器语言结构。通常,每一种类型的CPU都有它自己唯一的机器语言。这是为什么为Mac写的程序不能在IBM类型PC机运行的一个原因。

    • 电脑通过使用时钟来同步指令的执行。时钟脉冲在一个固定的频率(称为时钟频率)。当你买了一台1.5GHz的电脑,1.5GHz就是时钟频率,即每秒15亿次的时钟脉冲。时钟并不记录分和秒。它以不变的速率简单跳动。电子计算机通过使用这个跳动来正确执行它们的操作,就像节拍器的跳动如何来帮助你以正确的节奏播放音乐。一个指令需要跳动的次数(或就像他们经常说的执行周期)依赖CPU的产生和模仿。周期的次数取决于它之前的指令和其他因素。

    2.程序内存需要分段(以8086CPU为例)

    在这里插入图片描述

    • 内存按访问的方式来看,就像长方形的带子,地址依次升高。内存是一个随机读写设备,即可以访问内部任何一处,不需要从头开始找,只要直接给出实际物理地址即可。
    • 而分段是内存访问的机制,是给CPU用的访问内存的方式,只有CPU才会关注段
      • 8086CPU有20根地址线,最大可寻址内存空间为1MB,2^20Byte。而8086的寄存器只有16位,指令指针(IP)和变址寄存器(SI、DI)也是16位的。用16位的地址寻址1MB空间是不可能的。所以就要把内存分段,也就是把1MB空间分为若干个段,每段不超过64KB,在8086中设置4个16位的段寄存器,用于管理4段,注意这里是,不是(内存是分成四种段,这是考虑到程序执行时需要的四个部分。但是,内存不止四个段,只是同时最多只有四个段在工作,其他的在“睡眠”,需要时再“唤醒”。),具体种类为:CS是代码段,DS是数据段,SS是堆栈段,ES是附加段。
      • 内存分段后,内存的地址(又称物理地址)就由两部分组成:段地址和段内偏移地址,段寄存器管理的是段地址。把内存分段后,每一个段就有一个段基址,段寄存器保存的就是这个段基址的高16位,这个16位的地址左移四位(后面加上4个0)就可构成20位的段基址。
      • 上述便是段地址×16(或者左移四位)+偏移地址=物理地址”的寻址模式的由来。
    • 第二个是保护模式下,段(segmentation)强调的是分割,用来把内存分成不同的地址空间,每个段一个空间,而后通过CPU的MMU转换成实际物理地址。由于程序运行在不同的段里,根本上保护了CPU保护模式下的各个不相关的代码,所谓进程或者作业。

    3.CPU的不同型号

    • 8088,8086:
      这些CPU从编程的观点来看是完全相同的。它们是用在早期PC机上的CPU。它们提供一些16位的寄存器:AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES,IP,FLAGS。它们仅仅支持1M字节的内存,而且只能工作在实模式下。在这种模式下,一个程序可以访问任何内存地址,甚至其它程序的内存!这会使排除故障和保证安全变得非常困难!而且,程序的内存需要分成段。每段不能大
      于64K,即2^16Byte(16位的寄存器)。

    • 80286:
      这种CPU使用在AT系列的PC机中。它在8088/86的基本机器语言中加入了一些新的指令。然而,它主要的新的特征是16位保护模式。在这种模式下,它可以访问16M字节的内存和通过阻止访问其它程序的内存来保护程序。可是,程序依然是分成不能大于64K的段,即2^16Byte(16位的寄存器)。

    • 80386:
      这种CPU极大地增强了80286的性能。首先,它扩展了许多寄存器来容纳32位数据(EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP,EIP)而且增加了两个新的16位寄存器(FS,GS)。它同样增加了一个新的32位保护模式。在这种模式下,它可以访问4G字节。程序同样分成段,但是现在每段大小同样可以到4G,即2^32Byte(32位的寄存器)

    • 还有很多CPU型号这里不在列出,毕竟我们不做CPU的芯片开发,我们学习结构较为简单的CPU,了解其原理即可。

    4.十六位寄存器(以8086为例,即x86架构)

    寄存器是CPU内部的存储部件与内存空间没有关系,设置寄存器的原因是为了减少CPU与内存交换数据的次数,以提高计算机的工作速度。
    在这里插入图片描述
    8086 CPU 中寄存器总共为 14 个,即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES,且都为16位。

    4.1通用寄存器:

    通用寄存器有 8 个,分别是 AX,BX,CX,DX,SP,BP,SI,DI 。

    4.1.1数据寄存器:

    AX,BX,CX,DX 称作为数据寄存器,都可以暂存一般的数据,他们还具有其他的特殊用途,具体的特殊用途如下:

    • AX (Accumulator):累加寄存器,也称之为累加器,除了做加法以外,还可以做乘法或除法,当操作的数是16位的时候经常与DX搭配使用,如下:

      • 做除法(DIV)运算时:
        除数可以存放在寄存器中或者是内存单元中被除数默认放在AX或(DX和AX)中,如果除数为8位,被除数则为16位,默认放在AX中;如果除数为16位,那么被除数就为32位,存放在DX和AX两个寄存器中,高16位存放在DX,低16位存放在AX。即除数可以是 8 位或者是 16 位的:

        • 当除数是 8 位时,被除数一定会是 16 位的,并且默认是放在 AX 寄存器中,如果除数是 8 位的,则在 AL 中会保存此次除法操作的商,而在 AH 中则会保存此次除法操作的余数,
        • 而当除数是 16 位时,被除数一定是 32 位的,因为 AX 是 16 位寄存器,自然,放不下 32 位的被除数,所以,在这里还需要使用另一个 16 位寄存器 DX ,其中 DX 存放 32 位的被除数的高 16 位,而 AX 则存放 32 位的被除数的低 16 位,同时,AX 的作用还不仅仅是用来保存被除数的,当除法指令执行完成以后,当然,如果除数是 16 位的话,则 AX 中会保存本次除法操作的商,而 DX 则保存本次除法操作的余数。
      • 做乘法(MUL)运算时:
        两个相乘的数要么都是 8 位,要么都是 16 位:

        • 如果两个相乘的数都是 8 位的话,则一个默认是放在 AL 中,而另一个 8 位的乘数则位于其他的寄存器或者说是内存字节单元中,当 MUL 指令执行完毕后,如果是 8 位的乘法运算,则默认乘法运算的结果是保存在 AX 中,
        • 而如果两个相乘的数都是 16 位的话,则一个默认存放在 AX 中,另一个 16 位的则是位于 16 的寄存器中或者是某个内存字单元中。
          同时,而如果是 16 位的乘法运算的话,则默认乘法运算的结果有 32 位,其中,高位默认保存在 DX 中,而低位则默认保存在 AX 中。
    • BX (Base):基地址寄存器;
      BX 主要还是用于其专属功能 :存储偏移地址(与段寄存器搭配,可以寻址物理地址)。
      如果未额外指明寄存器,会默认使用 DS 段寄存器,例如 [BX],相当于DS:[BP]
      段地址×16(或者左移四位)+偏移地址=物理地址

    • CX (Count):计数器寄存器;
      CX 中的 C 被翻译为 Counting 也就是计数器的功能,当在汇编指令中使用循环 LOOP 指令时,可以通过 CX 来指定需要循环的次数,而 CPU 在每一次执行 LOOP 指令的时候,都会做两件事:

      • 一件就是令 CX = CX – 1,即令 CX 计数器自动减去 1;
      • 还有一件就是判断 CX 中的值,如果 CX 中的值为 0 则会跳出循环,而继续执行循环下面的指令,如果 CX 中的值不为 0 ,则会继续执行循环中所指定的指令 。
    • DX (Data):数据寄存器;
      在做除法(DIV)或者乘法(MUL)运算的时候可以搭配AX使用,请参考上面关于AX详细用法的讲解。

    4.1.2指针寄存器:

    • SP (Stack Pointer):堆栈指针寄存器;
      段地址使用默认的 SS 寄存器中的值
      在任何时刻,SS:SP 都是指向栈顶元素
    • BP (Base Pointer):基指针寄存器;
      段地址使用默认的 SS 寄存器中的值
      bp为基址寄存器,一般在函数中用来保存进入函数时的sp的栈顶基址。
      sp会随着带有堆栈操作的指令(比如PUSH、CALL、INT、RETF)产生变化,而BP不会,所以在带参数的子过程中用BP来获取参数和访问设在堆栈里面的临时变量。
      每次子函数调用时,系统在开始时都会保存这个两个指针并在函数结束时恢复sp和bp的值。如下
      在函数进入时:
    push bp // 保存bp指针
    mov bp,sp // 将sp指针传给bp,此时bp指向sp的基地址。
    // 这个时候,如果该函数有参数,则[bp + 2*4]则是该子函数的第一个参数,[bp+3*4]则是该子函数的 第二个参数,以此类推,有多少个参数则[bp+(n-1)*4]。
    .....
    .....
    函数结束时:
    mov sp,bp // 将原sp指针传回给sp
    pop bp // 恢复原bp的值。
    ret // 退出子函数
    

    只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到
    比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址。

    他们也是通用寄存器,在许多情况下也可以像通用寄存器一样暂存数据。但是,它们不可以分解成两个8位寄存器,因为只有数据寄存器才可以分解成两个8位寄存器。

    4.1.3变址寄存器

    • SI (Source Index):源变址寄存器;
      SI会默认使用 DS 段寄存器
    • DI (Destination Index):目的变址寄存器;
      DI 会默认使用 DS 段寄存器

    两个16位指针寄存器:SI 和DI 。通常它们都是当作指针来使用,但是在许多情况下也可以像通用寄存器一样暂存数据。但是,它们不可以分解成两个8位寄存器,因为只有数据寄存器才可以分解成两个8位寄存器。

    4.2段寄存器:

    • CS (Code Segment):代码段寄存器;
    • DS (Data Segment):数据段寄存器;
    • SS (Stack Segment):堆栈段寄存器;
    • ES (Extra Segment):附加段寄存器;

    16位CS,DS,SS 和ES 寄存器是段寄存器。它们指出程序不同部分所使用的内存。CS代表代码段,DS 代表数据段,SS 代表堆栈段和ES代表附加段。ES当作一个暂时段寄存器来使用。这些寄存器的细节描述在后面的文章中。

    4.3控制寄存器

    • IP (Instruction Pointer):指令指针寄存器;
      指令指针寄存器(IP) 与CS寄存器一起使用来跟踪CPU下一条执行指令的地址。通常,当一条指令执行时,IP提前指向内存里的下一条指令。
    • FLAG:标志寄存器;
      FLAGS寄存器储存了前面指令执行结果的重要信息。这些结果在寄存器里以单个的位储存。例如:如果前面指令执行结果是0,Z位为1,反之为0。并不是所有指令都修改FLAGS里的位。

    5. 三十二位寄存器(80386 )

    • 80386及以后的处理器扩展了寄存器。例如:16位AX寄存器扩展成了32位。为了向后兼容,AX依然表示16位寄存器而EAX 用来表示扩展的32位寄存器。AX是EAX 的低16位就像AL是AX(EAX)的低8位一样。但是没有直接访问EAX 高16位的方法。其它的扩展寄存器是EBX,ECX,EDX,ESI 和EDI 。
    • 许多其它类型的寄存器同样也扩展了。BP变成了EBP;SP 变成了ESP;FLAGS变成了EFLAGSEFLAGS 而IP变成了EIP。但是,不同于指针寄存器和通用寄存器,在32位保护模式下只有这此寄存器的扩展形式被使用。
    更多相关内容
  • 《汇编语言》 第2章 寄存器(CPU工作原理)
  • 第二章-寄存器CPU工作原理)CPU概述寄存器概述 CPU概述 一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。 区别: 1.内部总线实现CPU内部各个器件之间的联系。 2.外部总线实现CPU和主板...

    CPU概述

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

    区别:
    1.内部总线实现CPU内部各个器件之间的联系。
    2.外部总线实现CPU和主板上其它器件的联系。

    寄存器概述

    • 8986CPU有14个寄存器,它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

    2.1通用寄存器

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

    16位寄存器逻辑结构:
    在这里插入图片描述

    16位数据在寄存器中的存放情况:
    在这里插入图片描述

    8086上一代CPU中的寄存器是8位的,为了保证兼容性,四个寄存器都可以分为两个独立的8位寄存器使用。

    在这里插入图片描述
    只用AL,AH为零。就可以兼容了。

    在这里插入图片描述

    2.2字(word)在寄存器中的存储

    • 一个字可以存在一个16位寄存器。
    • 1word=2Byte
    • 在这里插入图片描述

    2.3几条汇编指令

    在这里插入图片描述
    汇编不区分大小写!

    2.4物理地址

    • CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。
    • 我们将这个唯一的地址称为物理地址。

    2.5 16位结构的CPU

    概况的讲,16位结构描述了一个CPU的特征:

    1. 运算器一次最多可以处理16位的数据。
    2. 寄存器的最大宽度为16位。
    3. 寄存器和运算器之间的通路是16位的。

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

    • 8086有20位地址总线,可传送20位地址,寻址能力为1M。
    • 8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。
    • 8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

    在这里插入图片描述

    物理地址=段地址×16+偏移地址
    在这里插入图片描述

    • "段地址×16"更为常用的说法是数据左移4位(二进制位)
    • 在这里插入图片描述

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

    在这里插入图片描述
    在这里插入图片描述

    2.8段的概念

    • 错误认识:内存分段
    • 其实:内存并没有分段,段的划分来自于CPU
      在这里插入图片描述
      我们认为有多少个段都可以~

    两个注意点:

    1. 段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;
    2. 偏移地址为16位,16位地址的寻址能力为64K,所以一个段的长度最大为64K。

    小结

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

    1.观察下面的地址,读者有什么发现?
    在这里插入图片描述
    结论:CPU可以用不同的段地址和偏移地址形成同一个物理地址。

    2.如果给定一个段地址,仅仅通过变化偏移地址来进行寻址,最多可以定位多少内存单元?

    偏移地址范围:0~FFFFH,64K。

    “数据在21F60H内存单元中。”对于8086PC机的两种描述:

    1. 数据存在内存2000:1F60单元中;
    2. 数据存在内存的2000段中的1F60H单元中。

    可以根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

    2.9段寄存器

    • 段寄存器提供段地址:8986CPU有四个:CS、DS、SS、ES
    • 当8986CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。

    2.10 CS和IP

    1. CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。
    2. IP是指令指针寄存器。
      在这里插入图片描述

    8086PC工作的简要概述

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

    2.11修改CS、IP的指令

    • 在CPU中,,程序员能够用指令读写的部件只有寄存器,通过改变寄存器中的值控制CPU
    • 同时修改CS、IP的内容:jmp 段地址:偏移地址
    • jmp 2AE3:3
    • jmp 3:0B16
    • 功能:用指令中给出的段地址修改CS,偏移地址修改IP。

    仅仅修改IP的内容:

    • jmp 某一合法寄存器
    • jmp ax(类似于mov IP,ax)

    如何修改AX中的值?

    • mov 指令
      如:mov ax,123

    2.12 代码段

    • 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
    • 可以将长度为N(N<=64kb)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。
    • 在这里插入图片描述
    • CPU只认被CS:IP指向的内存单元中的内容为指令。
    • 所以要将CS:IP指向所定义代码段的第一条指令的首地址。

    2.9~2.12小结

    1. 段地址在8086CPU的寄存器中存放。当8086CPU要访问内存时,由寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址。
    2. CS存放指令的段地址,IP存放指令的偏移地址。8086机中,任何时刻,CPU将CS:IP指向的内容当作指令执行。
    3. 8086CPU的工作过程:(1)从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;(2)IP指向下一条指令;(3)执行指令。(转到步骤(1),重复这个过程。)
    4. 8086CPU提供转移指令修改CS、IP的内容。
    展开全文
  • 《汇编语言》 第2章 寄存器(CPU工作原理).ppt
  • 文章目录寄存器CPU工作原理)通用寄存器几条汇编指令 寄存器CPU工作原理) CPU = 运算器 + 控制器 +【寄存器】,器件之间通过总线相连; 8086CPU 有14个寄存器,名称分别为: AX,BX,CX,DX,SI,DI,SP,BP,...

    寄存器(CPU工作原理)

    CPU = 运算器 + 控制器 +【寄存器】,器件之间通过总线相连;

    8086CPU 有14个寄存器,名称分别为:
    AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW

    通用寄存器

    1. 8086CPU 所有的寄存器都是16位的,可以存放2个字节;

    2. AX、BX、CX、DX 通常用来存放一般性数据,被称为通用寄存器;

    3. 8086上一代CPU中的寄存器都是8位的,为了保证兼容性
      这四个寄存器都是可以分为2个独立的8位寄存器使用;
      AX=AH+AL
      BX=BH+BL
      CX=CH+CL
      DX=DH+DL

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

    5. 字在寄存器中的存储,一个字等于两个字节,因此要占用AX整一个寄存器;
       

    几条汇编指令

    1. 汇编指令不区分大小写;

    2. CPU 执行下表中的程序段的每条指令后,对寄存器中的数据进行的改变。几条汇编指令:

    mov ax,18;    AX = 18
    mov ah,78;    AH = 78
    add ax,8;     AX = AX+8
    mov ax,bx;    AX = BX
    add ax,bx;    AX += BX
    

    思考:这个问号的值是多少?

    程序段中的最后一条指令 add ax,bx,在执行前 ax 和 bx 中的数据都为 8226H,相加后所得的值为∶ 1044CH,但是 ax 为 16 位寄存器,只能存放 4 位十六进制的数据,所以最高位的1不能在 ax 中保存, ax 中的数据为∶ 044CH。

    这里的丢失,指的是进位制不能在 16 位寄存器中保存,但是 CPU 不是并真的不丢弃这个进位值;
     

    → 检测1 ←

    1. 写出每条汇编指令执行相关寄存器的值;

     

    1. 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。
       

    物理地址

    CPU 访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间,我们将这个唯一的地址称为物理地址。
     

    16位结构的CPU

    概括的讲,16位结构描述了一个 CPU 具有以下几个方面特征:

    1. 运算器一次最多可以处理16位的数据。
    2. 寄存器的最大宽度为16位。
    3. 寄存器和运算器之间的通路是16位的。
       

    8086CPU给出物理地址的方法

    8086有20位地址总线,可传送20位地址,寻址能力为1M。

    8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。

    问题:那么,8086CPU 如何用内部16位的数据转换成20位的地址呢?

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

    8086CPU读写内存时,发生了这么一些事:

    CPU 中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;地址加法器将两个16位地址合并成一个20位的地址;

    地址加法器合成物理地址的方法:物理地址 = 段地址×16 + 偏移地址

    由16位二进制变为20位,等价往左移动了四位,也就是乘上了一个24,即16;
     

    本质含义

    基础地址 + 偏移地址 = 物理地址

    比如说,学校、体育馆同在一条笔直的单行路上(学校位于路的起点0米处)。读者在学校,要去图书馆,问我那里的地址,我可以用几种方式描述这个地址?

    1. 从学校走2826m到图书馆。这2826可以认为是图书馆的物理地址。
    2. 从学校走2000m到体育馆,从体育馆再走826m到图书馆。
      • 第一个距离2000m是相对于起点的基础地址;
      • 第二个距离826m是将对于基础地址的偏移地址。
         

    段地址×16 + 偏移地址 = 物理地址

    比如我们只能通过纸条来通信,读者问我图书馆的地址,我只能将它写在纸上告诉读者。显然我必须有一张可以容纳 4 位数据的纸条才能写下2826这个数据:

    不巧的是,没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。这样我只能以这种方式告诉读者2826这个数据:

    在第一张纸上写上 200(段地址),在第二张纸上写上826(偏移地址)。假设我们事前对这种情况又有过相关的约定:你得到这两张纸后,做这样的运算:200(段地址)*10 + 826(偏移地址) = 2826(物理地址)。

    8086CPU 就是这样一个只能提供两张3位数据纸条的 CPU。段地址×16可以看做是基础地址
     

    段的含义

    错误认识:内存被划分成了一个一个的段,每一个段有一个段地址。

    事实上,内存并没有分段,段的划分来自于 CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。

    我们既可以把内存单元看成一个段,也可以看成两个段;

    以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址 ×16 定位段的起始地址(基础地址),用偏移地址定位段中的内存单元

    注意:
    (1)段地址 ×16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数;
    (2)偏移地址为16位,16位地址的寻址能力为64K,所以一个段的长度最大为64K。

    小结:

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

    观察下面的地址,可以得出结论:CPU 可以用不同的段地址和偏移地址形成同一个物理地址。

    如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位多少内存单元?

    答:偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元。比如:给定段地址1000H,用偏移地址寻址, CPU 的寻址范围为:10000H~1FFFFH。

     

    → 检测2 ←

    1. 给定段地址为0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为____到____。

    2. 有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元,则SA应满足的条件是:最小为____,最大为____。

    当段地址给定到多少,CPU 无论怎么变化偏移地址都无法寻到20000H单元。

     

    段寄存器

    段寄存器就是提供段地址的。8086CPU有4个段寄存器:CS、DS、SS、ES;

    当 8086CPU 要访问内存时,由这4个段寄存器提供内存单元的段地址。
     

    CS和IP

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

    8086PC工作过程的简要描述

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

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

    在任何时候,CPU 将 CS、IP 中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

    如果说,内存中的一段信息曾被 CPU 执行过的话,那么,它所在的内存单元必然被 CS:IP 指向过。
     

    修改CS、IP的指令

    在 CPU 中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对 CPU 的控制。

    CPU 从何处执行指令是由 CS、IP 中的内容决定的,程序员可以通过改变 CS、IP 中的内容来控制 CPU 执行目标指令。
     

    如何修改 AX 中的值?

    mov 指令,如:mov ax,123;

    mov 指令可以改变 8086CPU 大部分寄存器的值,被称为传送指令。
     

    如何同时修改CS、IP的内容?

    jmp指令:用指令中给出的段地址修改 CS,偏移地址修改 IP。

    jmp 段地址:偏移地址
    jmp 2AE3:3
    jmp 3:0B16
    

    仅修改IP的内容:

    jmp 某一合法寄存器
    jmp ax   (类似于 mov IP,ax)
    jmp bx
    

     

    CPU运行的流程

    内存中存放的机器码和对应汇编指令情况: (初始:CS=2000H,IP=0000H)

    (1)mov ax,6622
    (2)jmp 1000:3
    (3)mov ax,0000
    (4)mov bx,ax
    (5)jmp bx (bx 是0,因此 ip 为0,所以就到转到了地址10000H处)
    (6)mov ax,0123H
    (7)转到第(3)步执行

    不难发现这是个死循环蛤;
     

    代码段

    对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。

    可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。

    这段长度为 10 字节的字节的指令,存在从123B0H123B9H的一组内存单元中,我们就可以认为,123B0H123B9H这段内存单元是用来存放代码的 ,是一个代码段 ,它的段地址为123BH,长度为10字节。

    如何使得代码段中的指令被执行呢?

    将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。CPU 只认被 CS:IP 指向的内存单元中的内容为指令。所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。
     

    小结

    1、段地址在8086 CPU 的寄存器中存放。当8086 CPU 要访问内存时,由段寄存器提供内存单元的段地址。8086 CPU 有4个段寄存器,其中 CS 用来存放指令的段地址。

    2、CS 存放指令的段地址,IP 存放指令的偏移地址。8086机中,任意时刻,CPU 将 CS:IP 指向的内容当作指令执行。

    3、8086CPU 的工作过程:
    (1)从 CS:IP 指向内存单元读取指令,读取的指令进入指令缓冲器;
    (2)IP 指向下一条指令;
    (3)执行指令。(转到步骤(1),重复这个过程。)

    4、8086CPU 提供转移指令修改 CS、IP 的内容。
     

    → 检测3 ←

    下面的3条指令执行后,cpu几次修改IP?都是在什么时候?最后IP中的值是多少?

    mov ax,bx
    sub ax,ax
    jmp ax
    

     

    答案

    检测1

    mov ax,62627   AX=F4A3H
    
    mov ah,31H     AX=31A3H
    
    mov al,23H     AX=3123H
    
    add ax,ax      AX=6246H
    
    mov bx,826CH   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
    

     

    mov  ax,2         AX=2
    add  ax,ax        AX=4
    add  ax,ax        AX=8
    add  ax,ax        AX=16
    

     

    检测2

    解题过程:

    物理地址 = SA*16+EA
    
    EA的变化范围为 0h~ffffh
    
    物理地址范围为 (SA*16+0h)~(SA*16+ffffh)
    
    现在 SA = 0001h,那么寻址范围为
    
    (0001h*16+0h)~(0001h*16+ffffh)
    
    = 0010h~1000fh
    

    解题过程:

    物理地址 = SA*16+EA
    
    20000h = SA*16+EA
    
    SA = (20000h-EA)/16 = 2000h-EA/16
    
    EA取最大值时,SA = 2000h-ffffh/16 = 1001h,SA为最小值
    
    EA取最小值时,SA = 2000h-0h/16 = 2000h,SA为最大值
    

    当段地址给定为 1001H 以下和 2000H 以上,CPU无论怎么变化偏移地址都无法寻到20000H单元。
     

    检测3

    最后 IP 的值为0000H,因为最后 ax 中的值为0000H,所以 IP 中的值也为0000H;

    sub 指令是相减的意思,sub ax,ax 就是 ax=0;

    展开全文
  • 设计要求层次设计。底层的设计实体有 3 个:16 位寄存器,具有复位功能和 允许写功能;一个 2-4 译码器,对应寄存器写操作;一个 4 选 1 多路开关,负责 选择寄存器的读出。顶层设计构成一个完整的通用寄存器
  • 寄存器CPU工作基本原理下.ppt
  • 汇编学习之-寄存器CPU工作原理)

    千次阅读 2022-03-17 12:01:02
    CPU概述 2.1 通用寄存器 2.2 字在寄存器中的存储 关于数制的讨论 2.3 几条汇编指令 2.4 物理地址 2.5 16位结构的CPU 2.6 8086CPU给出物理地址的方法 地址加法器工作原理 2.7 “段地址×16+偏移地址 =物理地址”的...

    CPU概述

    • 一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
    • 区别:
      • 内部总线实现CPU内部各个器件之间的联系。
      • 外部总线实现CPU和主板上其它器件的联系。
    • 8086CPU有14个寄存器 它们的名称为:
      • AX、BX、CX、DX、SI、DI、SP、BP、
      • IP、CS、SS、DS、ES、PSW。

    2.1 通用寄存器

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

    在这里插入图片描述

    • 一个16位寄存器可以存储一个16位的数据。
    • 一个16位寄存器所能存储的数据的最大值为[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C2FiHOpS-1647489641195)(https://cdn.nlark.com/yuque/__latex/953f80b7948cab44f62fe98d1b16ce59.svg#card=math&code=2%5E%7B16%7D-1&id=Hl5wi)]。
    数据:18
    二进制表示:10010
    在寄存器AX中的存储:
    在这里插入图片描述
    数据:20000
    二进制表示:0100111000100000
    在寄存器AX中的存储:
    在这里插入图片描述
    • 8086上一代CPU中的寄存器都是8位的。
    • 为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
      • AX可以分为AH和AL;
      • BX可以分为BH和BL;
      • CX可以分为CH和CL;
      • DX可以分为DH和DL。

    H表示high,高位。
    L表示low,地位。

    • 8086CPU的8位寄存器存储逻辑

    在这里插入图片描述

    • AX的低8位(0位7位)构成了AL寄存器,高8位(8位15位)构成了AH寄存器。
    • AH和AL寄存器是可以独立使用的8位寄存器。
    • 一个8位寄存器所能存储的数据的最大值是

    在这里插入图片描述

    在这里插入图片描述

    2.2 字在寄存器中的存储

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

    在这里插入图片描述

    关于数制的讨论

    • 由于一个内存单元可以存放 8位数据,CPU中的寄存器又可存放 n 个 8位数据。也就是说,计算机中的数据大多是由1~N个8位数据构成的。
    • 用十六进制来表示数据可以直观的看 出这个数据是由哪些8位数据构成的。

    每两位对应一个八进制!

    2.3 几条汇编指令

    在这里插入图片描述

    汇编指令不区分大小写!!

    • CPU执行下表中的程序段的每条指令后,对寄存器中的数据进行的改变。

    在这里插入图片描述

    在这里插入图片描述

    这里的丢失,指的是进位制不能在 8 位寄存器中保存,但是 CPU 不是并真的不丢弃 这个进位值

    2.4 物理地址

    • CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。
    • 我们将这个唯一的地址称为物理地址。

    2.5 16位结构的CPU

    • 概括的讲,16位结构描述了一个CPU具有以下几个方面特征:
      • 运算器一次最多可以处理16位的数据。
      • 寄存器的最大宽度为16位。
      • 寄存器和运算器之间的通路是16位的。

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

    • 8086有20位地址总线,可传送20位地址,寻址能力为1M。
    • 8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。

    8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址~
    在这里插入图片描述

    • 8086CPU读写内存时
      • CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
      • 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
      • 地址加法器将两个16位地址合并成一个20位的地址;

    地址加法器工作原理

    • 地址加法器合成物理地址的方法:

    物理地址=段地址×16+偏移地址

    在这里插入图片描述

    • “段地址×16”有一个更为常用的说法就是数据左移4位。(二进制位)

    在这里插入图片描述

    • 通过观察移位次数和各种形式数据的关系:
      1. 一个数据的二进制形式左移1位,相当于该数据乘以2;
      2. 一个数据的二进制形式左移N位,相当于该数据乘以2的N次方;
      3. 地址加法器如何完成段地址×16的运算(以二进制形式存放的段地址左移4位。)
    • 经过进一步的思考,我们可以看出:
      1. 一个数据的十六进制形式左移1位,相当于乘以16;
      2. 一个数据的十进制形式左移1位,相当于乘以10;
      3. 一个数据的X进制形式左移1位,相当于乘以X。

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

    • “基础地址+偏移地址 = 物理地址”

    在这里插入图片描述

    (1)从学校走2826m到图书馆。
    这2826可以认为是图书馆的物理地址。
    (2)从学校走2000m到体育馆,从体育馆再走826m到图书馆。
    第一个距离2000m是相对于起点的基础地址;
    第二个距离826m是将对于基础地址的偏移地址。

    • “段地址×16+偏移地址=物理地址”

    比如我们只能通过纸条来通信,读者问我图书馆的地址,我只能将它写在纸上告诉读者。
    显然我必须有一张可以容纳 4 位数据的纸条才能写下2826这个数据:
    在这里插入图片描述

    不巧的是,没有能容纳4位数据的纸条,仅有两张可以容纳3位数据的纸条。
    这样我只能以这种方式告诉读者2826这个数据:
    在这里插入图片描述

    2.8 段的概念

    • 错误认识:
      • 内存被划分成了一个一个的段,每一个段有一个段地址。
    • 其实:
      • 内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。

    在这里插入图片描述

    • 以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。

    两点需要注意

    1. 段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数;
    2. 偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。

    内存单元地址小结

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

    在这里插入图片描述

    • 结论:CPU可以用不同的段地址和偏移地址形成同一个物理地址。

    如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位多少内存单元?

    • 结论:偏移地址16位,变化范围为0~FFFFH,仅用偏移地址来寻址最多可寻64K个内存单元。
    • 在8086PC机中,存储单元的地址用两个元素来描述。即段地址和偏移地址。
    • “数据在21F60H内存单元中。”对于8086PC机的两种描述:
      • 数据存在内存2000:1F60单元中;
      • 数据存在内存的2000段中的1F60H单元中。
    • 可根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段。

    2.9 段寄存器

    • 段寄存器就是提供段地址的。
      • 8086CPU有4个段寄存器:
      • CS、DS、SS、ES
    • 当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。

    2.10 CS和IP

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

    8086PC读取和执行指令相关部件

    在这里插入图片描述

    8086PC工作过程的简要描述

      1. 从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器;
      2. IP = IP + 所读取指令的长度,从而指向下一条指令;
      3. 执行指令。 转到步骤 (1),重复这个过程。
    
    • 在 8086CPU 加电启动或复位后( 即 CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。
    • 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。
    • FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。
    • 在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。
    • 如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

    2.11 修改CS、IP的指令

    • 在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。
    • CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。
    • 8086CPU必须提供相应的指令
    • mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能。
    • 8086CPU为CS、IP提供了另外的指令来改变它们的值:转移指令

    如何修改AX中的值?

    • mov 指令如:

    • mov ax,123

    • mov指令可以改变8086CPU大部分寄存器的值,被称为传送指令。

    • 同时修改CS、IP的内容:

      • jmp 段地址:偏移地址
      • jmp 2AE3:3
      • jmp 3:0B16
    • 功能:用指令中给出的段地址修改CS,偏移地址修改IP。

    • 仅修改IP的内容:

      • jmp 某一合法寄存器
      • jmp ax (类似于 mov IP,ax)
      • jmp bx
    • 功能:用寄存器中的值修改IP。

    CPU运行的流程

    • 内存中存放的机器码和对应汇编指令情况: (初始:CS=2000H,IP=0000H)

    在这里插入图片描述

    2.12 代码段

    • 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。
    • 可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为 16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。

    例如:
    在这里插入图片描述

    这段长度为 10 字节的字节的指令,存在从123B0H123B9H的一组内存单元中,我们就可以认为,123B0H123B9H这段内存单元是用来存放代码的 ,是一个代码段 ,它的段地址为123BH,长度为10字节。

    • 如何使得代码段中的指令被执行呢?
    • 将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。
    • CPU 只认被 CS:IP 指向的内存单元中的内容为指令。
    • 所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。
      • 如刚才的CS = 123BH,IP = 0000H。

    2.9节~2.12节 小结

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

    文章的最后先给大家推荐一个公众号
    小辅导-互联网开发者、多年一线程序开发经验
    不定期分享各类资源
    https://mp.weixin.qq.com/s/GqyiuwFOFJ3MkUJhwuA3_Q

    展开全文
  • 寄存器cpu工作原理)

    万次阅读 多人点赞 2018-05-06 21:45:43
    1、一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。区别:内部总线实现CPU内部各个器件之间的联系。外部总线实现CPU和主板上其它器件的联系。8086CPU有14个寄存器 它们的名称为: AX、...
  • 文章目录CPU概述寄存器字在寄存器中的存储几条汇编指令物理地址16位结构的CPU8086CPU给出物理地址的方法”段地址*16+偏移地址=物理地址”的本质含义段的概念段寄存器CS和IP修改CS、IP的指令同时修改CS、IP仅修改IP的...
  • 寄存器CPU工作原理PPT课件.pptx
  • 【操作系统】CPU寄存器详解

    千次阅读 2022-04-14 17:44:34
    寄存器CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果以及一些 CPU 运行需要的信息。 本文将归纳下面几中寄存器: 目录 一 通用寄存器 二 标志寄存器 三指令寄存器 四 段...
  • CPU中的通用寄存器

    千次阅读 2021-01-12 00:01:58
    CPU内部有若干个通用寄存器,它们除了具有与自己名字含义相对应的专用功能外,还具有通用功能,比如传递数据,暂存数据,参与计算等。因此为CPU中的寄存器取名为通用寄存器。16位CPU有14个通用寄存器,32位CPU有16个...
  • CPU中的寄存器

    千次阅读 2021-04-05 20:59:58
    刚学习寄存器这部分内容,转载备份,后续在查些资料详细学习下 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个...32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。对低16位数据的存..
  • 006第二章 寄存器CPU工作原理 )鱼C c语言教程
  • cpu寄存器分类

    千次阅读 2021-08-12 11:21:13
    CPU中至少要有六类寄存器:指令寄存器(IR)、程序计数器(PC)、地址寄存器(AR)、数据寄存器(DR)、累加寄存器(AC)、程序状态字寄存器(PSW)。这些寄存器用来暂存一个计算机字,其数目可以根据需要进行扩充...
  • CPU工作原理

    2021-03-01 16:16:07
    一个典型的CPU,是由运算器、控制器、寄存器等器件组成的,这些器件是通过CPU内部总线相连的。CPU内部总线和外部总线有什么区别?CPU内部总线实现了CPU内部各个器件之间的联结;CPU外部总线实现了CPU与主板及其上...
  • 轻松控制MMIO和CPU寄存器。 | | 此板条箱提供了各种宏,可以为块和CPU寄存器生成不错的API。 它主要是为了代替箱,以提供更好的API并使工作更轻松。 用法 有关更多更新和更大的示例,请查看。 定义CPU寄存器 CPU...
  • AX BX CX DX是CPU内部的四个16bit的通用寄存器,常用于存储数据,也叫数据寄存器,一般用于存放参与运算的数据或运算的结果。 为了兼容更古老的CPU,他们的16bit可以分为高八位和第八位,如AH,AL。这种灵活的使用...
  • CPU寄存器集的实现方法与重叠寄存器窗口技术.pdf
  • 8086CPU寄存器

    千次阅读 2022-01-15 23:32:45
    欢迎访问我的个人博客 ...8086CPU共有14个寄存器,分别是AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。所有的寄存器都是16位的。 通用寄存器 AX、BX、CX、DX这4个寄存器通常用来存放一般性数据.
  • 寄存器(CPU工作原理)

    2017-01-21 13:40:45
    CPU概述寄存器概述通用寄存器 字在寄存器中的存储关于数制的讨论几条汇编指令 物理地址 段的概念 段寄存器 ...
  • 16位的CPU如何用内部16位的数据转换成20位的地址呢? 内存单元地址小结: debug使用: 转载于:https://www.cnblogs.com/souhaite/p/10838019.html...
  • cpu寄存器和缓存

    千次阅读 2019-06-11 16:42:58
    所以,寄存器是最贴近CPU的,而且CPU只与寄存器中进行存取。 (寄存的意思是,暂时存放数据,不中每次从内存中取,它就是一个临时放数据的空间,火车站寄存处就是这个意思) 而寄存器的数据又来源于内存。于是 CPU&...
  • 汇编语言之寄存器CPU工作原理)

    千次阅读 2016-10-30 21:17:56
    不同的CPU寄存器的个数、结构是不相同的,8086CPU有14个寄存器,每个寄存器有一个名称,我们对它进行分类: 1.通用寄存器:AX、BX、CX、DX 2.段寄存器:CS、SS、DS、ES 3.指针寄存器:SP、BP 4.变址寄存器:SI...
  • 1. 一个典型的CPU有运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。 2. 前一章所说的总线,相对于CPU内部总线来说是外部总线。内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上...
  • 附上本人绘制的cache、寄存器cpu、内存之间的关系脑图,如果你有所收获希望大家看完能给我的脑图点个赞谢谢!!! https://www.processon.com/view/link/6038cc331e085364c6761ffb 问题起因: 陈铁力在公司的一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 259,678
精华内容 103,871
热门标签
关键字:

寄存器如何让cpu工作