作为汇编语言的课程笔记,方便之后的复习与查阅
本篇为课程第五次课内容
目录
8086存储器组织
- 内存(主存储器):存放当前正在执行的程序和使用的数据,CPU可以直接存取
- 外存(辅助存储器):CPU需要通过I/O接口访问
DOS加载程序过程
.com文件加载过程
首先它要找一个程序段,即一个可以放程序的内存的段,然后从内存段的基址,即0
开始。0
开始放的并不是程序的数据,而是一些程序前缀psp
,它包含了运行程序需要的一些底层信息。程序段前缀一共是100h
个字节,从100h
开始原封不动地放代码数据,即程序编译完生成的二进制指令和数据文件被直接从100h处放入。堆栈区在内存的高地址端
把程序读到内存后,就进行指令执行
8086的分段管理
基本概念1
- 寄存器是微处理器内部暂存数据的存储单元,以名称表示
- 存储器则是微处理器外部存放程序及其数据的空间
- 程序及其数据可以长久存放在外存,在程序需要时才进入主存(外存中数据需要先被读入内存再被CPU处理)
基本概念2
- 主存需要利用地址区别
- 存储单元: 每个存储单元都有一个编号;被称为存储器地址
- 存储内容: 每个存储单元存放一个字节的内容
如0002H
单元存放有一个数据34H
表达为:[0002H]=34H
(中括号括起来的表示地址)
基本概念3
二进制位Bit
, 字节Byte
, 字Word
(16位,2个字节), 双字DWord
(32位,4个字节)
- 多字节数据存放时,低字节存入低地址,高字节存入高地址;
- 表达时,用它的低地址表示多字节数据占据的地址空间。
例如在下图中,2号“字”单元的内容为:[0002H] = 1234H
; 2号“双字”单元的内容为:[0002H] = 78561234H
;
由此也可以看出,同一个存储器地址可以是字节单元地址、字单元地址、双字单元地址等等
存储器的分段管理
8086CPU有20条地址线,最大可寻址空间为220=1MB,物理地址范围从00000H~FFFFFH。而8086寄存器最大是16位的,显然一个寄存器不能确定某一内存单元的20位物理地址
于是,8086CPU将1MB空间分成许多逻辑段(Segment)
。分段就是硬件限制下的产物,在32位或64位寄存器的情况下,段寄存器的作用已经越来越不明显了
- 将内存空间分为很多段,用一个寄存器表示某段在内存空间内的起始地址(
段地址
),用另一个寄存器表示段内某内存单元相对于本段起始地址的距离(偏移地址
),用两个16位的寄存器就可以形成20位地址 - 每个段最大限制为64KB= 2 16 2^{16} 216,使得偏移量可以放到一个16位寄存器中
- 对最小的段没有限制,可定义只包含一个字节的段
- 而段基址必须定位在地址为16的整数倍上
段寄存器
8086有4个16位段寄存器
CS
(代码段)指明代码段的起始地址SS
(堆栈段)指明堆栈段的起始地址DS
(数据段)指明数据段的起始地址ES
(附加段)指明附加段的起始地址
每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途
指令的组成
- 操作码:说明计算机要执行哪种操作。用一个唯一的助记符表示,对应着机器指令的一个二进制编码
- 操作数:各种操作的对象。可以是一个具体的数值、存放数据的寄存器、数据在主存位置的存储器地址
指令的助记符格式:
操作码 操作数1,操作数2 ;注释
- 操作数2,称为源操作数
src
,它表示参与指令操作的一个对象 - 操作数1,称为目的操作数
dest
,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果
指令操作数的表达:
寄存器:
符号 | 意义 |
---|---|
r8 | 8位通用寄存器 AH, AL, BH, BL, CH, CL, DH, DL |
r16 | 16位通用寄存器 AX, BX, CX, DX, SI, DI, BP, SP |
reg | r8 / r16 |
seg | 段寄存器 CS, DS, ES, SS |
存储器:
符号 | 意义 |
---|---|
m8 | 8位存储器操作数单元 |
m16 | 16位存储器操作数单元 |
mem | m8 / m16 |
立即数:
符号 | 意义 |
---|---|
i8 | 8位立即数 |
i16 | 16位立即数 |
imm | i8 / i16 |
dest | 目的操作数 |
src | 源操作数 |
8086寻址方式
传送指令mov的格式
MOV dest,src ;dest←src
MOV
指令的功能是将源操作数src
传送至目的操作数dest
,例如:
MOV AL,05H ;AL←05H
MOV BX,AX ;BX←AX
MOV AX,[SI] ;AX←DS:[SI] []表示对内存中数据的访问
MOV AX,[BP+06H] ;AX←SS:[BP+06H]
MOV AX,[BX+SI] ;AX←DS:[BX+SI]
立即数寻址方式
指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中),这种操作数被称为立即数imm
立即数寻址方式常用来给寄存器赋值
MOV AL,05H ;AL←05H
寄存器寻址方式
操作数存放在CPU的内部寄存器reg
中,可以是:
- 8位寄存器
r8
:
AH、AL、BH、BL、CH、CL、DH、DL - 16位寄存器
r16
:
AX、BX、CX、DX、SI、DI、BP、SP - 4个段寄存器
seg
:
CS、DS、SS、ES
MOV AX,1234H ;AX←1234H
MOV BX,AX ;BX←AX
存储器寻址方式
指令中给出操作数的主存地址信息(偏移地址
,称之为有效地址EA),而段地址
在默认的或用段超越前缀指定的段寄存器中。最后CPU将偏移地址和段地址相加得到最终的内存地址,进而到该内存地址上读取数据
直接寻址方式
有效地址在指令中直接给出,默认的段地址在DS
段寄存器,可使用段超越前缀改变
MOV AX,[2000H] ;AX←DS:[2000H] AX为16位寄存器,因此转移两个字节
MOV AX,ES:[2000H] ;AX←ES:[2000H]
寄存器间接寻址方式
有效地址存放在基址寄存器BX
或变址寄存器SI
、DI
中,默认的段地址在DS
段寄存器,可使用段超越前缀改变
MOV AX,[SI] ;AX←DS:[SI]
寄存器相对寻址方式
有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX
、BP
或SI
、DI
,有效地址=BX/BP/SI/DI
+8/16位位移量。段地址对应BX/SI/DI
寄存器默认是DS
,对应BP
寄存器默认是SS
;可用段超越前缀改变
MOV AX,[DI+06H] ;AX←DS:[DI+06H]
MOV AX,[BP+06H] ;AX←SS:[BP+06H]
基址变址寻址方式
有效地址由基址寄存器(BX
或BP
)的内容加上变址寄存器(SI
或DI
)的内容构成:有效地址=BX/BP
+SI/DI
。段地址对应BX
基址寄存器默认是DS
,对应BP
基址寄存器默认是SS
;可用段超越前缀改变
MOV AX,[BX+SI] ;AX←DS:[BX+SI]
MOV AX,[BP+DI] ;AX←SS:[BP+DI]
MOV AX,DS:[BP+DI] ;AX←DS:[BP+DI]
相对基址变址寻址方式
有效地址是基址寄存器(BX
/BP
)、变址寄存器(SI
/DI
)与一个8位或16位位移量之和:有效地址=BX/BP
+SI/DI
+8/16位位移量。段地址对应BX
基址寄存器默认是DS
,对应BP
基址寄存器默认是SS
;可用段超越前缀改变
MOV AX,[BX+SI+06H] ;AX←DS:[BX+SI+06H]