• 汇编 / 第二章: 寄存器(甲)


    定场诗一首:

             试看书林隐处,几多俊逸儒流。虚名薄利不关愁,裁冰及剪雪,谈笑看吴钩。

    评议前王并后帝,分真伪占据中州,七雄扰扰乱春秋。兴亡如脆柳,身世类虚舟。
            见成名无数,图名无数,更有那逃名无数。霎时新月下长川,江湖变桑田古路。

    讶求鱼缘木,拟穷猿择木,恐伤弓远之曲木。不如且覆掌中杯,再听取新声曲度。

    <注> 笔者觉得这样摘录书本的方式效率较低,且蠢,故第二章之后的内容将不在采取这样的方式;

    以下内容整理自《汇编语言》之书:

    * 一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连。(总线分为内部总线和外部总线)

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

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

    *不同的CPU, 寄存器的个数、结构是不相同的;

    2.1 通用寄存器

      1.8086CPU所有的寄存器都是16位的,可以存放两个字节;

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

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

      4.AX可分为AH和AL,其他3个同理;

    2.2 字在寄存器中的存储

      1.出于对兼容性的考虑,8086CPU可以一次性处理以下两种尺寸的数据: a.字节(byte),由8个bit组成,可以存在8位寄存器中; b.字(word),一个字由两个字节  组成,这两个字节分别称为这个字的高位字节和低位字节;

      2.信息本身可以用不同的逻辑意义来看待,数值或指令;

      3.很多时候,需要直观地看出组成数据的各个字节数据的值,用十六进制来表示数据可以直观地看出这个数据是由哪些8位数据构成的;

      4.为了区分不同的进制,在十六进制表示的数据后面加H,二进制数据后面加B,十进制后面什么也不加;

    2.3 几条汇编指令

      1.在写一条汇编指令或一个寄存器的名称时不区分大小写;

      2.AX,AL,AH的数据“丢失”问题;

      3.当对AL,AH操作的时候,AL是作为一个独立的8位寄存器来使用的,和AH没有关系,CPU在执行指令时,认为AH和AL是两个不相关的寄存器。也就是AL中的进位不  会加到AH中去;

      4.在进行数据的传送或运算时,要注意指令的两个操作对象的位数应当是一致的;也就是8位寄存器和16位寄存器之间是不可以传送数据的,并且也不以将高于寄  存器位数的数据存储到寄存器中

    2.4 物理地址

      1.所有内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,我们将这个唯一的地址称为物理地址;

      2.CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址。在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址;

    2.5 16位结构的CPU

      1).16位结构的CPU:a.运算器一次最多可以处理16位的数据;

      2).寄存器的最大宽度为16位;

      3).寄存器和运算器之间的通路为16位;

      对于16位CPU,能一次处理、传输、暂时存储16位的地址;

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

      1.8086CPU有20位地址总线,可以传送20位地址,达到1MB的寻址能力;(1024KB)

      2.而8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位;(笔者:这里提一个浅薄的问题,为啥不设计为20位结构?)

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

      4.8086CPU要读写内存时:

        1)CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;

        2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;

        3)地址加法器将两个16位地址合成为一个20位的物理地址;

        4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;

        5)输入输出控制电路将20位物理地址送上地址总线;

        6)20位物理地址被地址总线送到存储器;

      5.地址加法器采用 物理地址 = 段地址 * 16 +偏移地址的方法合成物理地址;

      6.“段地址 * 16” 是指二进制位左移4位,因为段地址是以二进制信息的形式存储,左移一位相当于乘以2;

      7.一个X进制的数据左移一位,相当于乘以X;

    2.7 “段地址 * 16 + 偏移地址 = 物理地址 ”的本质含义 (笔者注:此节需有专门一篇阐述)

      1.不管以多少种不同的逻辑意义去看待“段地址 * 16 + 偏移地址 = 物理地址 ”的寻址模式,一定要清楚地知道它的本质含义,如果只拘泥于某一种引申出来     的逻辑含义,而模糊本质含义的话,将从意识上限制对这种寻址功能的灵活应用;

      2. “段地址 * 16 + 偏移地址 = 物理地址”的本质含义是: CPU在访问内存时,用一个基础地址和一个相对于基础地址的偏移地址相加,给出内存单元的物理

        址。这是“基础地址 + 偏移地址 = 物理地址”寻址模式的一种具体实现方案。在8086CPU中,段地址 * 16可以看作是基础地址;

    2.8 段的概念

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

      2. 有两点需要注意: 段地址 * 16必然是16的倍数, 所以一个段的起始地址也一定是16的倍数;偏移地址为16位, 16位地址的寻址能力为64KB, 所以一个段的    长度最大为64KB;

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

      4. CPU可以用不同的段地址和偏移地址形成同一个物理地址;

    2.9 段寄存器

      1. 段地址在8086CPU的段寄存器中存放。8086CPU中有4个段寄存器: CS, DS, SS, ES;当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址;

    2.10 CS 和 IP

      1. CS 和 IP 是8086CPU中两个最关键的寄存器, 它们指示了CPU当前要读取指令的地址;

      2. CS为代码段寄存器, IP为指令指针寄存器,8086机中,任意时刻, CPU将CS:IP指向的内容当作指令执行;

      3. 读取一条指令后, IP中的值自动增加, 以使CPU可以读取下一条指令。增加的大小,视指令的大小而定;

      4. 8086CPU的工作过程可以简要描述如下:

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

        b. IP += 所读取指令的长度,从而指向下一条指令;

        c. 执行指令。转到步骤(1),重复这个过程;

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

      6.如果提出一个问题: CPU根据什么将内存中的信息看作指令? 如何回答? 我们可以说, CPU将CS:IP指向的内存单元中的内容看作指令, 因为, 在任何时    候, CPU将CS, IP中的内容当作指令的段地址和偏移地址, 用它们合成指令的物理地址, 到内存中读取指令码, 执行。如果说, 内存中的一段信息曾被     CPU执行过的话, 那么, 它所在的内存单元必然被CS;IP指过;

    2.11 修改CS, IP的指令

      1. 在CPU中,程序员能够用指令读写的部件只有寄存器, 程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行命令是由CS, IP中的内容决定      的,程序员可以通过改变CS, IP中的内容来控制CPU执行目标指令;

      2. mov指令被称为传送指令;

      3. 能够改变CS, IP的内容的指令被统称为转移指令;

      4. 来介绍一个最简单的转移指令: jmp指令

        a. 若想同时修改CS, IP的内容, 可用形如“jmp 段地址:偏移地址”的指令完成;其功能为:用指令中的段地址修改CS, 偏移地址修改IP;

        b. 若想仅修改IP的内容, 可用形如“jmp 某一合法寄存器”的指令完成;其功能为: 用寄存器中的值修改IP;

    2.12  代码段

      1. CPU只认被CS:IP指向的内存单元中内容为指令。所以,要让CPU执行我们放在代码段中的指令, 必须要将CS:IP指向所定义的代码段中的第一条指令的首地址;

    实验 1 查看CPU和内存, 用机器指令和汇编指令编程

      1. Debug是DOS, Windows都提供的实模式(8086方式)程序的调试工具。使用它, 可以查看CPU各种寄存器中的内容, 内存的情况和在机器码级跟踪程序的      运行;

      2. 本实验用到的Debug功能;

        * 用Debug的R命令查看, 改变CPU寄存器的内容;(register)释义:寄存器

        * 用Debug的D命令查看内存中的内容;(dump) 释义:计算机信息转出

        * 用Debug的E命令改写内存中的内容;(enter) 释义: 输入

        * 用Debug的U命令将内存中的机器指令翻译成汇编指令;(unassemble) 释义: 反汇编

        * 用Debug的T命令执行一条机器指令;(trace)释义:跟踪

        * 用Debug的A命令以汇编指令的格式在内存中写入一条机器指令;(assemble) 释义:汇编

      3.  Debug是在DOS方式下使用的程序

    ****关于DOSBOX的两个有用的技巧:

      1. DOSBox0.74-2-win32-installer是在 64 Win7 下虚拟 dos 环境工具。如果你的电脑的操作系统是 Windows, 在使用Masm for Windows
        实验环境 2015时有些指令或伪指令写法不支持,可以使用虚拟 dos 平台(DOSBox is An Open Source DOS emulator to run old DOS games),从而使
        用 dos 工具(即第 3 点下的 edit.com, masm.exe, link.exe, debug.exe)。用法如下:
        (1)设包含 dos 工具(edit.com, masm.exe, link.exe, debug.exe) 的文件夹 masm windows 系统的存放路径为: d:masm
        (2)安装 DOSBox 完成后,启动 DOSBox, 出现虚拟盘符 z:,输入如下命令:
        mount d: d:masm
        表示: 创建虚拟盘符 d:, 并将你的硬盘 d:masm 文件夹的内容虚拟到虚拟 dos 平台的 d:下。
       (3)输入 d:进入虚拟盘符 d:,即可使用 dos 版的汇编工具。
       (4)使用时输入 debug<回车> debug32<回车>即可调试。
       (具体使用哪一个需要依赖你的电脑是否支持)
       *注:如果不想每次启动 dosbox 都重复上述步骤中的(2)(3),可以把(2)(3)的内容写进 dosbox 的配置文件,以后每次就可以自动执行这两步。具
       体操作如下:
       查找到配置文件 dosbox-0.74.conf,通常目录是 C:Users×××AppDataLocalDOSBoxdosbox-0.74.conf,找到后,在文件最后加上两行:
        mount d:  d:masm
        d:

        这样每次启动 dosbox 时,系统会自动执行上述两条命令
      2.   DOSbox的界面很小,看起来很不舒服,解决方法如下:亲测有效

        https://blog.csdn.net/m0_37822685/article/details/80241598

    2018 . 10 .  15 于雅培楼

  • 相关阅读:
    产品经理的职责有哪些?到底该做什么?(转) 写的非常好,非常专业
    互联网界产品经理和项目经理(转) 总结的非常好
    各式结构化数据 动态 接入-存储-查询 的处理办法 (第二部分)
    各式结构化数据 动态 接入-存储-查询 的处理办法 (第一部分)
    不规矩的xml与JAVA对象互相转换的小技巧-使用Marshaller
    大数据架构-使用HBase和Solr将存储与索引放在不同的机器上
    小程序项目别的页面初始化拿到的值为两种状态(已解决)
    vue项目引入第三方js插件,单个js文件引入成功,使用该插件方法时报错(问题已解决)
    qs.stringify和JSON.stringify的使用和区别
    百度地图API-javascript-web地图的应用
  • 原文地址:https://www.cnblogs.com/sunguanglin/p/9741924.html
Copyright © 2020-2023  润新知