一个典型的CPU由运算器,控制器,寄存器等组成
内部总线实现CPU内器件联系
外部总线实现CPU和主板上其他器件联系
CPU中:
运算器进行信息处理
寄存器进行信息存储
控制器控制各种器件进行工作
内部总线连接
CPU内部器件,在它们之间进行数据传送
寄存器是CPU中程序员可用指令读写的部件
程序员可以通过改变各种寄存器中的内容来实现对CPU的控制
通用寄存器
8086CPU为16位寄存器,每个寄存器存放两个字节数据
通用寄存器,用于存放一般性数据,为:
AX
BX
CX
DX
8086CPU的通用寄存器中每个寄存器都可以分为两个可独立使用的8位寄存器使用
低8位为L,高8位为H
AX -> AH + AL
BX -> BH + BL
CX -> CH + CL
DX -> DH + DL
字在寄存器中的存储
字节:
byte,1byte=8bit字:
word,1word=2byte=16bit。这两个字节称为这个字的高位字节和低位字节

几条汇编指令
汇编指令与寄存器名称不区分大小写
mov ax,18 —> 将18送入寄存器AX
add ax,8 —> 将AX中的值加8后存入AX
mov ax,bx —> 将BX数据送入AX
add ax,bx —> 将AX与BX中数据相加后存入AX
当使用AL之类的8位寄存器时,AH和AL为两个不相关的寄存器,AL计算产生的进位不会存储到AH中
当使用AL之类寄存器时,进行的是8位运算
当使用AX之类寄存器时,进行的是16位运算
当汇编指令的两个操作对象的位数不一致时,无法进行运算操作,此时的汇编指令为错误的
物理地址
CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址
在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址
16位结构的CPU
16位结构(16位机,字长为16位)的CPU具有以下特性:
运算器一次最多可以处理16位的数据
寄存器的最大宽度为16位
寄存器与运算器之间的通路位16位
对于16位的CPU,能一次处理,传输,暂时存储16位的地址
8086CPU给出物理地址的方法
8086CPU有20条地址总线,可达到1MB的寻址能力
但8086CPU为16位结构,其内部只能处理,传输,暂时存储16位的地址,所以其表现出的寻址能力只有64KB
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址

如图
CPU提供两个16位地址,一个称为段地址SA,另一个位偏移地址EA两个16位地址通过内部总线送入地址加法器
地址加法器将两个16位地址合成为一个20位的物理地址
地址加法器通过内部总线将20位的物理地址送入输入输出控制电路
输入输出控制电路将20位物理地址送入地址总线
20位物理地址被地址总线传送到存储器
地址加法器采用物理地址=段地址*16+偏移地址
的方法合成物理地址
*16对于十六进制来说为多加一个0,左移1位;对于二进制来说为多加四个0,左移4位
“段地址*16+偏移地址=物理地址”的本质含义
CPU在访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址
基础地址(段地址*16)+偏移地址=物理地址
段的概念
内存并没有分段,段的划分来自于CPU
CPU用分段的方法来管理内存
若编程需要,将若干地址连续的内存单元看作一个段,用段地址*16定位段的起始位置(基础地址),用偏移地址定位段中的内存单元
注意:
段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数
偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB
段寄存器
段地址在8086CPU的段寄存器中存放
8086CPU有4个段寄存器:CS,DS,SS,ES
CS和IP
它们指示了CPU当前要读取指令的地址
CS为代码段寄存器,存放指令的段地址
IP为指令指针寄存器,存放指令的偏移地址
在8086CPU中,任意时刻,设CS中内容为M,IP中内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行
即,8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行

















8086CPU工作过程如下:
从
CS:IP指向的内存单元读取指令,读取的指令进入指令缓存器IP=IP+所读取指令的长度,从而指向下一条指令执行指令。转到步骤1,重复这个过程
CPU初始时,CS=FFFFH,IP=0000H。即,8086PC机开机后执行的第一条指令是FFFF0H内存单元中的指令
修改CS,IP的指令
CPU从何处执行指令是由CS,IP中的内容决定的,程序员可以通过改变CS,IP中的内容来控制CPU执行目标指令
mov指令称为传送指令,但其不可以设置CS,IP的值
能够改变CS,IP的内容的指令被统称为转移指令
jmp指令为转移指令的一种
同时修改
CS,IP的内容格式:
jmp 段地址:偏移地址例:
jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令修改
IP的内容格式:
jmp 某一合法寄存器功能:用寄存器中的值修改
IP例:
jmp ax,指令执行前:
ax=1000H,CS=2000H,IP=0003H指令执行后:
ax=1000H,CS=2000H,IP=1000H
代码段
对于8086PC机,可根据需要,将一组内存单元定义为一个段。
可以将长度为N(N<=64KB)的一组代码,存放在一组地址连续,起始地址为16的倍数的内存单元中。此时,这段内存是用来存放代码的,从而定义了一个代码段
要让CPU执行代码段中的指令,必须将CS:IP指向所定义的代码段中的第一条指令的首地址
Debug
安装使用
win10 64位使用debug方法:
https://blog.csdn.net/plus_re/article/details/60761467
Debug常用功能
R命令查看,改变CPU寄存器的内容D命令查看内存中的内容E命令改写内存中的内容U命令将内存中的机器指令翻译成汇编指令T命令执行一条机器指令A命令以汇编指令的格式在内存中写入一条机器指令
Debug操作
R命令查看,改变CPU寄存器的内容查看寄存器内容

如图:
CS:IP所指向的内存单元为073F:0100,此处的指令即CPU当前要读取,执行的指令,此处存放的机器码为0000,对应的汇编指令为ADD [BX+SI],AL修改寄存器内容

D命令查看内存中的内容格式:
d 段地址:偏移地址
如图,此时将列出从指定内存单元开始的128个内存单元中的内容
格式:
d 段地址:起始偏移地址 结尾偏移地址
如图,指定
D命令的查看范围格式:
d
会一直回显后面内存单元中的内容
E命令改写内存中的内容格式:
e 起始地址(段地址:偏移地址) 数据 数据 数据 ...
可以使用
E命令向内存中写入数字,字符(‘ ‘),字符串(“ “),机器码U命令将内存中的机器指令翻译成汇编指令格式:
u 起始地址(段地址:偏移地址)
将从开始内存单元中将内容翻译成汇编指令,并显示出来
T命令执行机器指令格式:
t
执行
CS:IP指向的指令,指令执行后,显示输出CPU中的寄存器状态A命令以汇编指令的格式在内存中写入一条机器指令格式:
a 段地址:偏移地址