8086存储器组织
分类:内存(主存储器,CPU直接存取)、外存(辅助存储器,CPU通过I/O接口读取)
COM文件结构
COM文件是类似于exe的计算机可直接执行的文件。
COM文件组成如下:
- 程序前缀PSP
- 指令代码
- 数据区
- 堆栈区
内存与寄存器
- 寄存器是CPU内部暂存数据的存储单元,内存、外存都是CPU外部的存储空间。
- 每个存储单元存放一个字节的内容,并且都有一个存储器地址。
计算机数据表达与存储
二进制位bit:1位二进制
字节byte:8位二进制
字word:16位
双字dword:32位
LSB(最低有效位):数据的最低位
MSB(最高有效位):数据的最高位
多字节数据在存储时占连续多个存储单元:
存放:低字节低地址,高字节高地址
表达:低地址表示多字节数据地址
图中[0002H]的字内容为:1234H
图中[0002H]的双字的内容为:78561234H
8086CPU内存范围
8086CPU有20条地址线,而8086寄存器最大16位。
(地址空间需存放在寄存器中,因此一个寄存器最大16位不能表征20位的物理地址,这种情况下就出现了分段的概念)
为了解决这个问题,8086CPU将内存空间分为很多逻辑段(Segment),每个逻辑段包含多个内存单元,用一个寄存器保存段地址(逻辑段起始地址),用另一个寄存器存储偏移地址(某内存单元到起始地址的距离)
8086有4个16位段寄存器:
- CS(代码段):指明代码段起始地址
- SS(堆栈段)
- DS(数据段)
- ES(附加段)
指令的组成
指令由操作码(mov,add…)和操作数(即操作的对象,具体数值,寄存器)两部分组成。
操作码 操作数1,操作数2;注释
mov a1,a2;
操作数1:目的操作数dest
操作数2:源操作数src
寄存器表达 | 含义 |
---|---|
r8 | 任意一个8位通用寄存器 |
r16 | 16位通用寄存器 |
reg | 代表r8或r16 |
seg | 段寄存器 |
存储器表达 | 含义 |
---|---|
m8 | 一个8位存储器操作数单元 |
m16 | 16位 |
mem | 代表m8或m16 |
立即数表达 | 含义 |
---|---|
i8(16) | 8(16)位立即数 |
imm | 代表i8或i16 |
dest | 目的操作数 |
src | 源操作数 |
8086的寻址方式
立即数寻址
指令中的操作数直接存放在机器代码中。这种操作数称为立即数imm。
寄存器寻址方式
操作数存放在CPU的内部寄存器reg中。
存储器寻址方式
指令中给出操作数的主存地址信息(偏移地址EA),默认段地址在DS段寄存器中。
- 直接寻址方式:指令中给出有效地址,MOV AX,[2000H]
- 寄存器间接寻址方式:有效地址存放在BX或SI、DI中;MOV AX,[SI]
- 寄存器相对寻址方式:有效地址为寄存器(BX、BP、SI、DI)内容与有符号数位移量之和;MOV AX,[DI+06H]
- 基址变址寻址方式:有效地址为BX/BP+SI/DI;MOV AX,[BX+SI]
- 相对基址变址寻址方式:有效地址=BX/BP+SI/DI+8/16位位移量;MOV AX,[BX+SI+06H]
C语言中的指针
不同类型指针的区别
不同类型指针的指针都是一个变量,存储的为不同类型数据的地址。数据类型的不同,导致数据占据的字节数不同,因此在使用指针读取、赋值、偏移时,读取或修改、移动的字节数不同。
指针加减运算的原理
指针的加减运算即指向原指向位置存储的下一个变量。例如p++,指针变量增加的值与指针的类型有关,若指针指向的数据具有2个字节,则指针变量增加2个字节的大小,若指针指向的数据具有4个字节,则指针变量增加4个字节的大小。
什么是指向指针的指针
指向指针的指针也是变量,变量中存储的为某个指针的位置。