序言
- 最近利用寒假的时间开始学习汇编,使用的是
王爽
的《汇编语言第三版》
,看了前三章,感觉确实是一本好书 - 这里记录一下在前三章中遇到的坑和总结一下主要知识点和自己的体会
- 正文开始之前,先安利一波:
-
王爽汇编语言第三版电子版 ; 密码:
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
的时候就可以直接使用了,见下图)
二. 总线
- 总线分为:外部总线和内部总线,
CPU
通过外部总线和外部器件(芯片)传输数据和通信,在CPU
内部,通过内部总线相互通信和传输数据
1. 外部总线
- 外部总线又分为:地址总线(决定
CPU
寻址能力),数据总线(决定CPU
和外界的数据传送速度),控制总线(决定CPU
的控制能力) - 地址总线需要注意的是:地址总线能传送多少个不同的信息,
CPU
就能对多少个存储单元寻址(注意是对存储单元),若有N
根地址总线,就说CPU
地址总线宽度为N
,最多可以寻找2的N
次方个内存单元;注意是内存单元(也叫存储单元
),而不是bit
,即CPU
中的内存单元是以Byte
为单位的(即8bit
),所以课后检测点1.1(1)
中的答案是13
(见下)
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命令
的话就可以直接向段寄存器中输入值
-
D命令: 查看内存内容(如下);还可以指定查看的范围,如:
-d 1000:0 f
(表示查看从1000:0000
到1000:000F
的内存值)
-
E命令: 改写内存中内容;注意一般不使用
E命令
来改变寄存器中的值
- U命令: 将内存中的机器指令翻译为汇编指令
-
T指令: 执行
CS : IP
指向的指令;需要注意的是一个T
执行一行指令,但是有一个特殊:Debug
的T
命令在执行修改寄存器SS
的指令时,下一条指令也紧接着被执行mov ax,1000
mov ss,ax
mov sp,0
在执行完
mov ss,ax
指令后,指令mov sp,0
也会紧跟着执行,而不会等待下一次输出T
指令
- A命令: 以汇编的格式在内存中写入一条机器指令
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环境变量配置
- 本文部分图片来自王爽
《汇编语言第三版》
截图