汇编语言(四):内存管理(分段管理、寻址方式)

作为汇编语言的课程笔记,方便之后的复习与查阅

本篇为课程第五次课内容

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,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果

指令操作数的表达:
寄存器:

符号意义
r88位通用寄存器 AH, AL, BH, BL, CH, CL, DH, DL
r1616位通用寄存器 AX, BX, CX, DX, SI, DI, BP, SP
regr8 / r16
seg段寄存器 CS, DS, ES, SS

存储器:

符号意义
m88位存储器操作数单元
m1616位存储器操作数单元
memm8 / m16

立即数:

符号意义
i88位立即数
i1616位立即数
immi8 / 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或变址寄存器SIDI中,默认的段地址在DS段寄存器,可使用段超越前缀改变

MOV AX,[SI]	;AX←DS:[SI]

寄存器相对寻址方式

有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BXBPSIDI,有效地址=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]

基址变址寻址方式

有效地址由基址寄存器(BXBP)的内容加上变址寄存器(SIDI)的内容构成:有效地址=BX/BPSI/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/BPSI/DI+8/16位位移量。段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变

MOV AX,[BX+SI+06H]		;AX←DS:[BX+SI+06H]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值