汇编 / 第二章: 寄存器(甲)
定场诗一首:
试看书林隐处,几多俊逸儒流。虚名薄利不关愁,裁冰及剪雪,谈笑看吴钩。
评议前王并后帝,分真伪占据中州,七雄扰扰乱春秋。兴亡如脆柳,身世类虚舟。
见成名无数,图名无数,更有那逃名无数。霎时新月下长川,江湖变桑田古路。
讶求鱼缘木,拟穷猿择木,恐伤弓远之曲木。不如且覆掌中杯,再听取新声曲度。
<注> 笔者觉得这样摘录书本的方式效率较低,且蠢,故第二章之后的内容将不在采取这样的方式;
以下内容整理自《汇编语言》之书:
* 一个典型的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 于雅培楼