序言
- 最近利用寒假的时间开始学习汇编,使用的是
王爽的《汇编语言第三版》,看了前三章,感觉确实是一本好书 - 这里记录一下在前三章中遇到的坑和总结一下主要知识点和自己的体会
- 正文开始之前,先安利一波:
-
王爽汇编语言第三版电子版 ; 密码:
nrir -
王爽汇编语言第三版答案 ; 密码:
2otv
正文
一. 实验环境配置
- 如果你的系统是
Win7或者更低的系统,那么应该是没有影响的,但是笔者的系统是Win10的,用DOS做实验的时候无法使用Debug命令,在网上查了一下,说是因为Win10系统版本太高,没有debug.exe(C:\Windows\System32目录下),不支持Debug模式,这里的解决办法有两种,一是去装一个WinXP的虚拟机(太麻烦,不推荐),二是安装DosBox,具体使用可以参见博客,这篇博客中有详细的配置,为了避免重复造轮子,这里就不细说啦!(如果使用的是第二种方法,按照上述博客配置好了以后,每次使用DosBox,使用Debug命令的时候,还需要mount并切换到Debug的目录下才能使用,如果闲麻烦,可以配置一下DosBox的环境变量:在DosBox的安装目录下(DosBox快捷方式右键-->打开文件所在位置),找到DOSBox 0.74 Options.bat文件,双击,默认使用记事本打开,在最后一行找到[autoexec],在[autoexec]下面的指令是在DosBox打开的时候自动输入的,输入:mount D D:\debug(意思是将D:\debug挂载到D盘,这里D:\debug是我的debug.exe所在目录,具体情况具体修改咯);之后:set PATH=%PATH%;D:\;。这样下次打开DosBox的时候就可以直接使用了,见下图)
1.png
二. 总线
- 总线分为:外部总线和内部总线,
CPU通过外部总线和外部器件(芯片)传输数据和通信,在CPU内部,通过内部总线相互通信和传输数据
1. 外部总线
- 外部总线又分为:地址总线(决定
CPU寻址能力),数据总线(决定CPU和外界的数据传送速度),控制总线(决定CPU的控制能力) - 地址总线需要注意的是:地址总线能传送多少个不同的信息,
CPU就能对多少个存储单元寻址(注意是对存储单元),若有N根地址总线,就说CPU地址总线宽度为N,最多可以寻找2的N次方个内存单元;注意是内存单元(也叫存储单元),而不是bit,即CPU中的内存单元是以Byte为单位的(即8bit),所以课后检测点1.1(1)中的答案是13(见下)

2.png
2. 内部总线
-
CPU内部由运算器,控制器,寄存器等组成,而这些器件之间的数据传输与通信就通过内部总线完成 - 书中用的
8086CPU为16位CPU,所谓的16位CPU,包括三方面:
(1). 运算器一次最多可以处理16位数据
(2). 寄存器的最大宽度为16位
(3). 寄存器和运算器之间的通路为16位(内部总线宽度)
三. 其他概念
- 这里主要列举了一些比较易忘易混淆的概念
2. 接口卡
-
CPU对外部设备不能直接控制,如:显示器,音响,打印机等;直接控制这些设备的是插在扩展插槽上的接口卡;扩展插槽通过总线和CPU相连,所以接口卡也通过总线与CPU相连,CPU通过控制接口卡来间接控制外设
3. 内存地址空间
- 所谓的内存地址空间就是
CPU在操控外部存储器的时候都把它们当做内存来对待,把它们总的看做一个由若干存储单元组成的逻辑存储器(即内存地址空间)
三. 寄存器
- 前三章主要了寄存器:
(1). 通用寄存器(存放一般数据):
AX,BX,CX,DX(2). 段寄存器(存放段地址):
CS,DS,ES,SS(3). 指针寄存器(与
CS配合使用,指向代码指令):IP(4). 栈寄存器(与
SS配合使用,指向栈顶):SP
1. 明确几点概念
-
CPU中的数据和代码在存储上是没有区别的,完全由上述的几个寄存器的指向决定了该段地址空间中的数据该如何解释(是普通数据,还是代码指令,还是栈等) - 对
CPU而言没有栈的概念,栈只是人为规定的,CPU所知道的只是SS : SP所指向的空间,还是同上理解为寄存器的指向决定如何解释与如何操作 -
CPU中没有提供管理栈溢出的操作,所以需要使用者来谨慎操作
2. debug模式下操作
-
R命令: 可以查看,改变寄存器的内容;如下图;需要注意的是,不能通过代码直接向段寄存器中存储值,如不可:
mov cs,1000H;如果要通过代码改变段寄存器的值,需要使用内存空间或者其他寄存器作为中介,如:mov ax,1000H,mov cs,ax;但是如果用R命令的话就可以直接向段寄存器中输入值

3.png
-
D命令: 查看内存内容(如下);还可以指定查看的范围,如:
-d 1000:0 f(表示查看从1000:0000到1000:000F的内存值)

4.png
-
E命令: 改写内存中内容;注意一般不使用
E命令来改变寄存器中的值

5.png
- U命令: 将内存中的机器指令翻译为汇编指令

6.png
-
T指令: 执行
CS : IP指向的指令;需要注意的是一个T执行一行指令,但是有一个特殊:Debug的T命令在执行修改寄存器SS的指令时,下一条指令也紧接着被执行mov ax,1000
mov ss,ax
mov sp,0
在执行完
mov ss,ax指令后,指令mov sp,0也会紧跟着执行,而不会等待下一次输出T指令

7.png
- A命令: 以汇编的格式在内存中写入一条机器指令

8.png
3. DS
- 该寄存器中存储的是要访问数据的段地址(
Data)
4. CS : IP
- 指向代码段(
Code),可以通过改变CS和IP的值来决定代码的执行位置
5. SS : SP
- 始终执行栈顶
-
pop指令: 入栈;分为两步(以pop ax为例)(注意先后顺序):
(1). SP = SP - 2, SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶
(2). 将
ax中的内容送入SS:IP指向的内存单元出,SS:IP此时指向新栈顶
-
push指令: 出栈;分两步(以push ax为例)(注意先后顺序):
(1). 将SS:SP指向的内存单元处的数据送入
ax中(2). SP = SP + 2, SS:IP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶
四. 参考链接与声明
- DosBox环境变量配置
- 本文部分图片来自王爽
《汇编语言第三版》截图
