CPU由运算器,控制器,寄存器等构成
这些器件靠CPU的内部总线相连,内部总线实现了CPU各个器件之间的连接。
CPU构成:
+ 运算器进行信息处理
+ 寄存器进行信息存储
+ 控制器控制各种器件进行工作
+ 内部总线连接CPU各个器件
注意:
+ 对于汇编编程来说,寄存器是CPU中可以用指令读写的器件,我们通过改变各种寄存器中的内容来实现对CPU的控制。
+ 不同的CPU,寄存器的个数,结构是不相同的。
8086的寄存器都是16位的。但是为了兼容,其寄存器可以分为高8位和低8位分开使用(当分开使用时,CPU就会把其当做8位的寄存器和其他寄存器没关系,不会产生AL溢出影响到AH的情况)。
AX = AH + AL (H代表高位,L代表低位)
BX = BH + BL
CX = CH + CL
DX = DH + DL
如:AX范围是0~15, AL就是0~7, AH是8~15
字(Word)寄存器
AX = AH + AL (H代表高位,L代表低位)
BX = BH + BL
CX = CH + CL
DX = DH + DL
如:AX范围是0~15, AL就是0~7, AH是8~15
字节(Byte):即8位,AL, AH等都是字节寄存器
字(Word):在X86架构中两个字节,AX, BX, CX等都是字寄存器。在MIPS中是4字节。
使用汇编时要注意数据传送或者运算时,指令的两个操作对象位数要一致。
字(Word):在X86架构中两个字节,AX, BX, CX等都是字寄存器。在MIPS中是4字节。
8086寻址
8086是16位的CPU
+ 运算器一次最多处理16位数据
+ 寄存器最大宽度为16位
+ 寄存器和运算器直接的通路宽度为16位
但是8086有20位的地址总线,寻址能力为1MB。但其是16位结构,寻址能力为64KB,其一次性处理、传输、暂存的地址为16位。
8086采用一种在内部用两个16位地址合成的方法形成一个10位的物理地址。
8086要读写内存时:
- CPU中相关部件提供两个16位地址,一个称为段地址,一个称为偏移地址。
- 段地址和偏移地址通过内部总线送入地址加法器中。
- 地址加法器将两个16位地址合成一个20位的物理地址。
- 地址加法器通过内部总线将20位物理地址送入输入输出控制电路。
- 输入输出控制电路将20位物理地址送上地址总线。
- 20位物理地址通过地址总线送入存储器。
地址加法器
地址加法器采用 物理地址=基础地址(段地址*16)+偏移地址 的方法把段地址和偏移地址合成物理地址
TIPS: 段地址*16其实就是段地址左移4位
引申:
十六进制数左移一位,就是乘以16
十进制数左移一位,就是乘以10
X进制的数左移一位,就是乘以X
段
+其实内存并没有分段,段的划分是因为CPU,8086CPU采用合成物理地址的方式,使得可以用分段管理内存。
+编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址*16做基础地址,用偏移地址定位段中的内存单元。
注意:
1.一个段的起始地址必然是16的倍数(段地址*16)
2.一个段的长度最大为64KB(偏移地址为16位)
段寄存器
8086CPU有4个段寄存器:CS、DS、SS、ES
CS:代码段寄存器
DS:数据段寄存器
SS:堆栈段寄存器
ES:附加数据段寄存器
CS和IP
CS为代码段寄存器,IP为指令指针寄存器。
CPU将要执行的下一条指令地址=CS*16+IP
也可以这样表示CS:IP
读取一条指令后,IP中的值自动增加,指向下一条指令,增加的数目和指令长度有关。
在8086CPU加电启动后或者复位后,CS和IP就被设置为CS=FFFFH, IP=0000H,即CPU将从物理地址FFFF0H处读取第一条指令
+ 在CPU中,程序员能够用指令读写的部件只有寄存器,可以通过改变寄存器中得内容实现对CPU的控制。
+ CPU从何处执行指令是由CS、IP的内容决定的。可以通过改变CS、IP中的内容控制CPU执行的指令。
mov指令可以修改大多数8086的寄存器,但是不能用于设置CS、IP的值。
jmp指令
jmp指令就是用来修改CS、IP的值的
语法格式:
jmp 段地址:偏移地址
如:
jmp 2AE3:3 就是给CS=2AE3H,IP=3H
jmp ax; 就是将AX寄存器中的值,放入IP中,仅修改IP的值
参考文献《汇编语言》王爽版