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

定场诗一首:

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

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

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

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

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

* 一个典型的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\×××\AppData\Local\DOSBox\dosbox-0.74.conf,找到后,在文件最后加上两行:
    mount d:  d:\masm
    d:

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

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

 

2018 . 10 .  15 于雅培楼

 

posted @ 2018-10-15 16:57  孙光林  阅读(260)  评论(1编辑  收藏  举报