zoukankan      html  css  js  c++  java
  • 2.寄存器

    寄存器

        通过操作数据总线,控制总线和地址总线实现数据的读取,肯定是非常灵活的方式,假如对某个存储单元进行比较复杂的操作,不断的进行读取显然需要优化,比如说加入缓存,事物或者中间变量什么的,当然,这里我们只能加入硬件,比如说寄存器(看来机器码会与寄存器有关)

    通用寄存器:就算是将寄存器理解为存储单元里面的变量,也要为他们取一个好听且有意义的名字
        1.数据寄存器
    AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据。
    BH&BL=BX(base):基址寄存器,常用于地址索引
    CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器.
    DH&DL=DX(data):数据寄存器,常用于数据传递。
    这4个16位的寄存器可以分为高8位(AH,BH,CH,DH)以及低八位(AL,BL,CL,DL),这2组8位寄存器可以分别寻址,并单独使用。
        2.指针寄存器和变址寄存器
    SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置
    BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置
    SI(Source Index):源变址寄存器,可用来存放相对于DS段之源变址指针
    DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。
    这4个16位寄存器只能按16位进行存取操作,主要用来形成操作数的地址,用于堆栈操作和变址运算中计算操作数的有效地址。
      当然,所谓通用,就是随便改的意思,不过程序猿规范可能会要求我们按照寄存器的规则去使用(就像临时变量i一样),不遵守也没关系,但是万一控制总线不够用,可能就会按照所谓的功能来实现(好机智,就像有些jvm中,使用int代替byte...压根不提供byte相关的指令),可能其他的客户体验(优化)就没法用了(不发散了,再说就多了)- -

    几条汇编指令:对总线的理解使我相信,指令这东西最好由3部组成,要不然....要不然又要学了
    move ax,18;ax=18
    move会转换为机器码传递给控制总线,ax是应该是地址总线(简说),而18是数据总线,so easy....
    move ax,bx:ax=bx
    解释同上,有个小问题就是bx并没有被删除,为什么我希望他删除,因为他是move,不是copy(我承认即使是我来实现我也不会去删,但我就是会去想,我也觉得好奇怪)
    add ax,8:ax=ax+8
    add为控制,ax为地址,8为数据
    在看看第一章,CPU对存储器的处理,采用的上总线,上面的几个例子并没有对存储器进行读取,只是对临时变量(寄存器)进行存储,这里应该没有用到总线,我逗比了....所以,寄存器不算存储设备喽(找个台阶下O(∩_∩)O~),或许所有的存储器由奇怪的力量被映射成为物理地址(表),在这种表里没有寄存器的为止

    物理地址:即便硬件众多,依然保持唯一的物理地址(具体怎么分的,交给硬件...)

    16位结构的CPU:
    1.运算器一次最多处理16位数据
    2.寄存器最大16位
    3.寄存器与运算器通道为16位

    8086CPU寻找物理地址的方法
    地址总线20位:存储设施被神秘力量映射为物理地址(1,2,3,4),我们可以通过地址总线找到他们,20个1能表示2的20次方个数,即物理地址的范围(多了就找不到了....)
    16位结构CPU:一次蹦出来的数据就是16位,直接传给地址总线还差4位...比起物理地址=段地址x16+偏移地址,我更在乎这种公式是不是通用的,或者说万一我的地址总线就是64KB的类?再或者我32位CPU就是32为物理地址....

    段的概念
    既然已经决定了使用物理地址=段地址x16+偏移地址这种逗比的解决方案,就照成了物理地址有了多种表达方式,至于使用哪种...who cares

    再看寄存器
    寄存器做为临时变量,将会为我们保存必要数据进行存储的简化,如果逗比的物理地址寻址方式非常不方便,但是不过有个寄存器专门存放段的话....或许我就不再埋怨什么了

    段寄存器:很显然,这个寄存器(变量)是作为我们简化寻址的变量的工具,根据操作方式,提供了4个非常方便的寄存器,相对于通用寄存器,改这个,很有可能不举
    CS(Code Segment):代码段寄存器
    DS(Data Segment):数据段寄存器
    SS(Stack Segment):堆栈段寄存器
    ES(Extra Segment):附加段寄存器

    CS和IP:IP->变量i
    假设程序执行且一个字节一个字节的执行(承认吧,循环),总得有个计数的变量吧,比如ip
    通过书中的例子,发现数据总线传递的数据总是不一样的...看来数据总线传递的时候就已经会做一定的解析了(可能也跟编码规则有关,who cares)

    修改CS,IP:比起使用move,jmp(转移指令)提升了客户体现
    jmp ax -> ip=ax
    jmp 1:2 ->cs=1;ax=2;


    查看CUP和内存:可以发现

    寄存器犹如全局变量一样,显示在窗口的前方,应该不会有并发吧...
    以汇编命令为一次执行循环,执行所使用的字节并不固定,汇编应该就是是对执行的一次简单的封装

  • 相关阅读:
    界这么大,Python 也想去看看 -- pyecharts的安装和使用
    Mybatis开发笔记
    Spring入门笔记
    Maven基础
    树莓派的20个常用命令
    树莓派CPU、GPU、磁盘、内存、负载监控Python脚本
    在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件
    ABP开发框架前后端开发系列---(14)基于Winform的ABP快速开发框架
    ABP开发框架前后端开发系列---(13)高级查询功能及界面的处理
    ABP开发框架前后端开发系列---(12)配置模块的管理
  • 原文地址:https://www.cnblogs.com/liuCy/p/4076873.html
Copyright © 2011-2022 走看看