8086cpu有14个寄存器:AX BX CX DX SI DI SP BP IP CS SS DS ES PSW
都是16位的,可存放两个字节
1.通用寄存器
AX,BX,CX,DX 通常用来存放一般性的数据
可分为两个可独立使用的8位寄存器
AH,AL
BH,BL
CH,CL
DH,DL
2.字在寄存器中的存储
字节:byte,8个bit,存放在8位寄存器中
字:word,由两个字节组成,分别称为低位字节和高位字节
3.几条汇编指令
mov ax,18
add ah,18
不区分大小写
4.物理地址
所有的内存单元构成的存储空间是一个一维的线性空间,每一个内存单元在这个空间中都有唯一的地址,将这个唯一的地址称为物理地址。
cpu通过地址总线送入存储器的,必须是一个内存单元的物理地址,因此要先形成这个物理地址。
5.16位结构的cpu
8086是16位机,也可以说是16位结构的cpu,其特性:
运算器一次最多可以处理16位的数据
寄存器的最大宽度为16位
寄存器和运算器之间的通路为16位
6.8086cpu给出物理地址的方法
方法:物理地址=段地址*16+偏移地址 (乘16就是左移4位)
(1)cpu中的相关部件提供两个16位的地址,一个叫段地址,另一个叫偏移地址
(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
(3)地址加法器将两个16位地址合成为一个20位的物理地址
(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路
(5)输入输出控制电路将20位物理地址送上地址总线
(6)20位物理地址被地址总线送到存储器

7.”段地址*16+偏移地址=物理地址“的本质含义
比如,我们通过纸条通信,你问我图书馆在哪里,我需要一个四位的纸条写下2826.
但我只有两张三位纸条,我在第一张写上200,第二张写上826,假设我们之前约定过200*10+826=2826这样的运算
8086就是这样一个只能提供两张三位数据纸条的cpu。
8.段的概念
内存并没有分段,段的划分来自cpu,用分段的方式管理内存
段地址*16必然是16的倍数,所以一个段的起始地址也一定是16的倍数,偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB,即0000h~FFFFh
9.段寄存器
CS,DS,SS,ES
10.CS和IP
CS为代码段寄存器
IP为指令指针寄存器
任意时刻,cpu从CS*16+IP(CS:IP)开始,读取一条指令并执行






(1)从CS:IP读取指令,进入指令缓冲器
(2)IP=IP+所取指令的长度,从而指向下一条指令
(3)执行指令,转到(1)
在8086cpu加点启动或复位后,CS:IP被设置为CS=FFFFH,IP=0000H,即刚启动时,从FFFF0H单元读取指令
11.修改CS、IP的指令
cpu中,程序员能用指令读写的部件只有寄存器
mov不能用于设置CS、IP的值
可用“jmp段地址:偏移地址”修改CS、IP内容
jmp 2AE3:3 ——CS=2AE3H、IP=0003H
若想仅修改IP的内容
“jmp 某一合法寄存器”——用寄存器中的值修改IP
jmp ax好似mov IP,ax
12.代码段
实验1:查看cpu和内存,用机器指令和汇编指令编程
进入debug
![]()
用R命令查看,改变cpu寄存器的内容

最后一行是CS:IP指向内存单元存放的机器码,并翻译为汇编指令

用r+寄存器名修改寄存器的值
用D命令查看内存中的内容

中间是从指定地址开始的128个内存单元的内容,用16进制格式输出
中间的“-”将输出分隔,便于查看
左边是每行的起始地址
右边是每个内存单元中数据的ascii字符,没有对应ascii字符的,用“.”显示
接着使用D命令:

指定范围:

用E命令改写内存中的内容:

也可用提问方式一个一个修改:

用E命令写入字符:

用E命令写入字符串

用E命令写入机器码,用U命令查看内存中机器码的含义,用T命令执行机器码:
机器码 对应的汇编指令
b80100 mov ax, 0001
b90200 mov cx, 0002
01c8 add ax, cx

用T命令执行CS:IP指向的指令:

用A命令以汇编指令的形式在内存中写入机器指令:

a命令给出的起始地址直接按enter表示结束
PC机主板上写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,找到这个日期:

在rom中,只能读不能改写
向内存中从B8100H开始的单元中填写数据:

A0000H~BFFFFH这段内存地址空间为显存地址空间,也就是说,我们向A0000H~BFFFFH地址范围的内存地址单元写入数据,这个数据就会写入显存中

Debug的界面显示也是需要屏幕输出,也就是说,Debug程序也需要操作显存地址空间去显示它的界面内容。而此时,我们也正在Debug界面中通过E命令修改显存地址空间内容,所以我 们的操作和Debug的操作产生了一个冲突,导致了上述问题出现。
Debug在执行上述E命令的步骤如下:
当我们输入完命令后,按下“Enter”键去执行,此时Debug并未去立即执行E命令,而是转而先处理它的界面显示。
处理界面显示的操作很简单,就是将屏幕中每一行数据显示整体向上滚动一行。此步骤中,上一条E命令显示出的字符也向上滚动了一行。
界面显示处理完成后,才开始执行E命令,修改了命令指定的内存单元内容。
由于修改的是显存地址空间,所以屏幕显示出本次E命令修改的字符。
检测点2.1
(1)f4a3h 31a3h 3123h 6246h 826ch 04d8h 0482h 6c82h d882h d888h d810h 6246h
(2)mov ax,2
add ax,ax
add ax,ax
add ax,ax
检测点2.2
(1)00010h,1000fh
(2) 1001h,2000h
浙公网安备 33010602011771号