1:进制的简单介绍
二进制表示的数据后面加B,
十进制表示的数据后面什么也不加,
16进制表示的数据后面加H,
2个16进制可以表示一个字节(这是因为一个字节占8位,2进制一个符号占1位,16进制一个符号占4位,所以2个16进制可以表示一个8位)
例如:10进制20000, 16进制:4E20H, 二进制: 0100 1110 0010 0000B
cmd里面输入calc打开计算器,可以进行换算
2:PC中各类存储器的逻辑连接
3:cpu寄存器
寄存器是在CPU内部中的,相当于cpu中的一个临时存储的空间。
8086 cpu有14个寄存器(8个通用寄存器),且均为 16 位 ,名称为:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW.
AX,BX,CX,DX通常用来存放一般性的数据被称为通用寄存器。
通用寄存器:
AX,BX,CX,DX 称作为数据寄存器:
AX (Accumulator):累加寄存器,也称之为累加器;
BX (Base):基地址寄存器;
CX (Count):计数器寄存器;
DX (Data):数据寄存器;
SP 和 BP 又称作为指针寄存器:
SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;
SI 和 DI 又称作为变址寄存器:
SI (Source Index):源变址寄存器;
DI (Destination Index):目的变址寄存器;
控制寄存器:
IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器;
段寄存器:
CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;
8086 cpu所有的寄存器都是16位的,可以存放2个字节。一个字可以存在16位寄存器中,word(字)=2B,字是16位(H)为单位的,
以AX通用寄存器为例:
数据:18
二进制表示:10010
在寄存器AX中的存储:
***
一个16位寄存器所能存储的数据最大值是(2^16)-1
最小值是0,最大值是2^16-1=65535,可以表示的总数据有2^16=65536
例如1,2,3,4,5共5个数,总个数=max-min+1 ----> max=总个数+min-1
1=2的0次方
10=2的1次方
100=2的2次方
.
1 0000 0000 0000 0000=2的16次方
1111 1111 1111 1111就是2的16次方减一.
4:
8086上一代cpu的寄存器都是8位的,为保证兼容性,这四个寄存器都可以分为2个独立的8位寄存器使用
AX可以分为AH,AL;
BX可以分为BH,BL;
CX可以分为CH,CL;
DX可以分为DH,DL;
8086 CPU的8位寄存器存储逻辑
以AX为例,8086cpu的16位寄存器分为2个8位寄存器的情况:
前面AH的8位都是0,只用后面AL 8位;
AX的低8位(0--7)构成了AL寄存器,高8位(8-15位)构成了AH寄存器;AH和AL都是可以独立使用的8位寄存器。
例如:
5: 16位结构的CPU特点:
(1):运算器一次最多可以处理16位的数据
(2):寄存器的最大宽度为16位。
(3):寄存器和运算器之间的通路是16位的
8086的CPU外部有20位地址总线,传递20位地址,寻址能力为1M(2^20=1MB)
8086内部16位地址总线,只能传送16位地址,寻址能力有64KB(2^16=64KB)
8086采用一种在内部用2个16位的地址合成的方法形成一个20位的物理地址
6:地址加法器物理地址=段地址*16+偏移地址
偏移地址和段地址都是16位,2^16范围:0~~FFFFH的内存单元
一个数据的二进制形式左移一位,相当于此数据乘2,左移N位,相当数据乘2的N次方
一个数据的10进制形式左移一位,相当于此数据乘10
一个数据的16进制形式左移一位,相当于此数据乘16
地址加法器对段地址*16的操作是:以二进制形式存放的段地址左移4位,16进制的话左移一位
偏移地址位16位,16位地址的寻址能力为64K(2^16=64KB),所以一个数据段的长度最大为64K
内存单元地址小结:
(1)cpu访问内存单位时,必须向内存提供内存单元的物理地址
(2)8086cpu在内部用段地址和偏移地址相加的方法形成最后 的物理地址
结论:cpu可以不同的段地址和偏移地址形成同一个物理地址
思考:如果给定一个段地址,仅仅通过变化偏移地址来寻址,最多可以定位多少内存单元?
结论:偏移地址16位,变化范围是0~~FFFFH,仅用偏移地址寻址的话最多寻址64K个内存单元
例如:给段地址1000H,用偏移地址寻址,cpu的寻址范围是:
10000H~~1FFFFH
(3)在8086cpu中,存储单元的地址用2个元素来描述:段地址和偏移地址
段(数据段)是随便定义的(前提是:地址连续,起始地址为16的倍数的一组内存单元定义为一个数据段,专门存储数据的内存空间)
比如:123B0H~123B9H ,是一个数据段,段地址为123BH,长度为10个字节
7: 段寄存器
段寄存器就是提供段地址的,8086cpu有4个人段寄存器:CS(代码地址),DS(数据地址),SS(堆栈地址),ES
当8086cpu要访问内存时,由于这4个段寄存器提供内存单元的段地址
CS和IP是8086cpu的最关键的寄存器,他们指示了cpu当前要读取指令的地址
CS (cpu内部的代码段寄存器),CS里面的内容当做指令的段地址
IP(cpu内部的指令指针寄存器),IP里面的内容当做指令的偏移地址
8086cpu的工作过程:
(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
(2)从IP=IP+所读取指令的长度,从而指向下一条指令
(3)执行指令,转到(1),重复
8:8086pc工作过程简述:
在8086cpu加电启动或者复位后(即cpu刚开始工作),CS和IP被设置为CS=FFFFH,IP=0000H;
即是8086pc机刚启动时,cpu从内存FFFF0H单元读取指令执行,
FFFF0H单元的指令是8086pc开机执行的第一条指令。
在任何时候,cpu将CS,IP中的内容当做指令的段地址和偏移地址,用他们合成指令的物理地址。到内存中读取指令码,执行。
9: 8086cpu提供转移指令修改CS,IP的内容
jmp 段地址:偏移地址
计算方法是段地址要左移一位,因为cpu内的地址设是16位的,要访问20位的地址总线要采用移位(2进制移4位,16进制移1位,就是乘以16的方法),
比如地址xxAB:XXCD代表XAB0+XXCD--->XABCD(一共20位地址)
例如: jmp 2AE3:3 ---> 2AE30+0003=2AE33H
jmp:3:0B16 ---> 00030+0B16=B46H
(1) mov ax,6622
(2) jmp 1000:3
(3)mov ax,0000
(4)mov bx,ax
(5)jmp bx
(6)mov ax,0123H
(7)转到第3步执行
这是一个死循环
10: 代码段
对于8086pc机,可以根据需要将一个内存单元定义为一个段
可以将长度为N(N<=64KB,偏移地址不能超过16位,也就是一个段的索引不能超过2^16=64KB,也就是一个段最大存放64KB)的一组代码,
存在一组地址连续,起始地址为16的倍数的内存单元中,这段内存存放代码,从而定义为代码段
小结:
(1)8086cpu要访问内存时,由段寄存器提供内存单元的段地址,8086cpu有4个段寄存器其中CS用来存放指令的段地址
(2) CS存放指令的段地址,IP存放指令的偏移的地址
(3)8086机器,任意时刻,cpu将CS:IP指向的内容当做指令执行。
11: