• 汇编——段寄存器


    段寄存器

    8086CPU有14个寄存器

    AX,BX,CX,DX,si,di,sp,bp,ip,cs,ss,ds,es,psw

    其中有8个通用寄存器

    8086寄存器16位,可以存放两个字节

    AX BX CX DX一般用来存放一般数据

     

    为保证兼容性,这四个寄存器可以分为两个独立的8位寄存器使用

    AX可以分为AH和AL

    H高L低

    同样的对于ABCD-X

     
     

    字在寄存器中的存储

    一个字可以存在一个16位寄存器中

    Word=2B

    关于数制的讨论

    二进制太冗长

    几条汇编指令

    Mov ax,18                  将18送入                 AX = 18

    Add ax,8                     将寄存器AX中的数制加上8                  AX = AX + 8

    Mov ax,bx                 将寄存器BX中的数据送入寄存器AX中              AX = BX

    例如如果在寄存器中加法数据超过了16位

    例如 

    AX = 8226H BX =8226H

    Add ax,bx

    Ax=044c

    Ax值应该为1044C但是最高位溢出,但是CPU并不会抛弃该内容,但是1会放到进位寄存器中

    这里的丢失,指的是进制位不能再8位寄存器中保存,但是CPU不是真的丢弃这个进位值,该问题在后面讨论。

    Cpu访问内存单元是要给出内存单元的地址。所有的内存单元构成的存储空间是一个线性空间。 

    我们将这个唯一的地址成为物理地址。

    16位结构的CPU

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

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

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

    内部为之流微结构,只能传送16位的地址,表现出的寻址能力却只有64k

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

    16位段地址和16为偏移地址,通过地址加法器转换成20位物理地址

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

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

    十六进制数据相当于向左移一位

    相应的如果是二进制数则向左移四位

    例如

    8086CPU访问地址为123C8H的内存单元

     

    简单的可以推算到,一个数据的二进制形式左移N位,相当于该数据乘以2的N次方

    所以对于地址加法器完成*16的步骤相当于左移4位

    段地址错误的概念

    内存被划分成了一个一个短,每一个段都有一个段地址的认识是错的

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

    两点需要注意

    1)  段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数

    2)  偏移地址为16位,16为地址的寻址能力为64K,所以一个段长度最大为64K

    内存单元地址小结

    1)CPU访问内存单元时,必须向内存提供内存单元的物理地址

    2)8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址

    3)CPU可以用不同的段地址和偏移地址形成同一个物理地址

    8086CPU中存储单元用两个元素来猫叔,即段地址和偏移地址

    数据在21F60H内存单元中,对于8086有两种描述

    a)       数据在内存2000:1F60单元中

    b)       数据存在内存的2000段中的1F60H中

    可根据需要,降低至连续起始位置为16的倍数的一组内存单元定义为一个段

    段寄存器

    段寄存器就是提供段地址的

    8086CPU有四个段寄存器

    CS DS SS ES

    Code segment

    Data segment

    Stack segment

    Extra Segment

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

    CS和IP

    其实8086CPU中最关键的寄存器,他们指示了CPU当前要读取指令的地址

    CS为代码段寄存器 code segment

    IP为指令指针寄存器

    工作过程的简要描述

    1)  从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器

    2)  IP = IP+ 所读取指令唱的,从而指向下一条指令

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

    8086PC工作过程的简要描述

    1)在8086CPU加电启动活着复位时,CS=FFFFH ,IP= 0000H

    2)即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行

    3)FFFF0H单元中的指令是8086PC机开机后执行的第一条指令

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

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

    修改CS,IP指令

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

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

    我们如何改变CS,IP的值

             我们如何修改AX的值

             Mov

             如mov ax,123

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

    ??能够通过mov改变cs,ip值吗?

    不行,但是8086提供了体术的指令jmp

    Jmp段地址:偏移地址

    Jmp 2AE3:3   (2AE33)

    Jmp 3:0B16      (00B46)

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

    仅修改IP内容

    Jmp 某一合法寄存器

    Jmp ax(类似于mov IP,ax)

    Jmp bx

    功能 :用寄存器中的值修改IP

    问题分析:CPU运行的流程

     
     

    代码段

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

    可以将长度为N(N《=64K)的一组代码,存在一组地址连续,其实地址为16的倍数的内存单元中,这段内存使用来存放代码的,从而定义了一个代码段

    例如

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

    讲一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU并不会有由于这种安排,就自动地将我们定义的代码段中的指令当做指令来执行

    因为CPU只认被CS:IP指向的内存单元中的内容为指令

    所以只要将CS:IP只想多定义的代码段中的第一条指令的首地址

     

    小结

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

    Cs存放指令的段地址,IP存放指令的偏移地址

    8086机中,任意时刻,CPU将CS:IP指向的内容当做指令执行

    转自:http://blog.163.com/willwang_blog/blog/static/2212130942013581154349/

    这个链接下有图片,,我为了省懒就这么复制粘贴了,只为学习留个资料留个纪念

  • 相关阅读:
    MaaS系统概述
    流处理认识
    事务补偿
    Hystrix原理与实战
    RPC概念和框架
    git remote: error: hook declined to update
    Unity CombineTexture
    Windows Powershell统计代码行数
    unity面试题二
    unity面试题一
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/7090382.html
Copyright © 2020-2023  润新知