王爽《汇编语言》读书笔记——第二章

CPU中的各个器件之间(如运算器、控制器、寄存器等)通过内部总线相连,以实现数据的传送。
CPU与主板上的其他器件通过外部总线相连

寄存器是CPU中可以用指令读写的部件,通过改变各种寄存器中的内容来实现对CPU的控制

2.1 通用寄存器
8086CPU有14个寄存器

8086CPU的寄存器都是16位的, AX、BX、CX、DX 4个寄存器常用来存放一般性的数据,称为通用寄存器
AX、BX、CX、DX 寄存器均可分为两个独立的8位寄存器使用(AH、AL、BH、BL……)

2.2 字在寄存器中的存储
8086CPU一次可以处理两种尺寸的数据:字节(8位)和字(16位)
一个字由两个字节组成,分别称为字的高位和低位字节

一个字可以存储在一个16位的寄存器中

十六进制的一位对应二进制的四位,故16位寄存器可以存储4位十六进制数,8位寄存器可以存储2位十六进制数

用十六进制表示数据可以直观地看出这个数据是由哪些8位数据(字节)构成的。比如20000写成4E20就可以看出这个数据是由4E和20两个8位数据构成的。若AX中存放4E20,则AH中存放4E,AL中存放20

一般在十六进制数后加H后缀, 二进制数后加B后缀, 十进制数后什么也不加,来区分不同进制的数据

2.3 几条汇编指令
写汇编指令和寄存器名时,不区分大小写

几条汇编指令和对应的用高级语言语法描述的含义
mov ax, 18 ax = 18
mov ah, 78 ah = 78
add ax, 8 ax = ax + 8
mov ax,bx ax = bx
add ax, bx ax = ax + bx

例1:设ax寄存器和bx寄存器中的数据分别为8226H 和8226H,则执行指令add ax, bx 后寄存器ax中的数据是多少?

解:8226H + 8226H = 1044CH, 但16位寄存器最多只能存储4位十六进制数,故最高位的1将会被丢弃,故ax中的数据为044CH

例2:设ax寄存器和bx寄存器中的数据分别为00C5H 和4026H,则执行指令add al, 93H 和 add ax, 93H,ax中的数据各是多少?

解: C5H + 93H = 158H,
执行指令add al, 93H 时, 做的是8位运算,故超出位数的1将被丢弃(不能在8位寄存器al中保存,而不是CPU真的丢失这个进位),ax中的数据为 0058H

而执行指令add ax, 93H时,做的是16位运算(00C5H + 0093H = 0158H),低8位的进位会存储在ah中,故此时ax中的数据为0158H

在进行数据传送(如mov指令)和运算(如add指令)时,要注意指令的两个操作对象的位数应当是一致的,如下面是一些错误的指令:
mov al, bx (在8位寄存器和16位寄存器之间传送数据)
mov al, 20000 (8位寄存器最大可存放值为255的数据)

2.4 物理地址
所有存储单元构成的存储空间是一个一维的线性空间,每个存储单元在这个空间中都有唯一的地址,称为物理地址

CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址
在此之前,在CPU内部形成这个物理地址

2.5 16位结构CPU的含义:
1.运算器一次最多能够处理的数据位数是16位
2.寄存器的最大宽度为16位
3.寄存器与运算器之间的通路为16位

2.6 8086CPU给出物理地址的方法:
[图片]
地址加法器: 物理地址 = 段地址 * 16 + 偏移地址
(将两个16位的地址合成一个20位的物理地址)

段地址 * 16 相当于左移4位,因为段地址是二进制数
二进制数左移N位,相当于乘以2^N
X进制数左移N位,相当于乘以X^N

2.7 "段地址 * 16 + 偏移地址 = 物理地址"的本质含义
8086CPU的这种寻址功能是“基础地址 + 偏移地址 = 物理地址”寻址模式 的一种具体实现方案。
8086CPU中,段地址*16 可看作是基础地址(起始地址)

[图片]

[图片]
段地址 * 16 + 偏移地址 = 物理地址

由于物理地址是20位的,段地址和偏移地址是16位的,而将段地址*16得到一个20位的地址(基础地址、亦即起始地址),同一个段中的内存单元共用这个地址,不同的内存单元之间以偏移地址不同加以区别

2.8 段的概念
内存并没有分段,段的划分来自于CPU,可以使用分段的方法来管理内存。可以根据需要,将若干地址连续的存储单元看作是一个段

注意:
①段地址 * 16 = 基础地址(起始地址), 故一个段的起始地址一定是16的倍数(注意是段的起始地址,即基础地址一定是16的倍数,而段地址不一定是)
②由于同一个段中的内存单元共用一个起始地址,段中不同的内存单元之间以偏移地址不同加以区别,而偏移地址的位数为16位,故一个段的最大长度为2^16 = 64KB

CPU可以用不同的起始地址和偏移地址形成同一个物理地址

对于8086PC机中数据在内存单元中的存储一般这样描述:
①数据存储在内存2000:1F60单元中
或:②数据存储在内存的2000H段中的1F60H单元中

2.9 段寄存器
8086CPU在访问内存时需要段地址和偏移地址,送入地址加法器合成物理地址。
其中,段地址存放于CPU的段寄存器中
8086CPU有4个段寄存器:CS、DS、ES、SS

2.10 CS和IP
CS(代码段寄存器)和IP(指令指针寄存器)指示了CPU当前要读取和执行的指令的地址

任意时刻,设CS中的内容为M(段地址), IP中的内容为N(偏移地址),8086CPU将从内存 M*16 + N单元开始,读取一条指令并执行

任意时刻,CPU将CS:IP指向的内容当作指令的物理地址,到内存单元中读取指令码、执行

8086CPU读取并执行一条指令的具体过程如下:
1.设段寄存器CS中的值为M, 指令指针寄存器IP中的值为N,M和N被送入地址加法器中根据物理地址 = 段地址 * 16 + 偏移地址 (M * 16 + N)合成存储单元的物理地址。
2.物理地址被送入输入输出控制电路,输入输出控制电路将物理地址送上地址总线
3.物理地址对应的存储单元中的机器指令通过数据总线送入输入输出控制电路,输入输出控制电路将该指令送入指令缓冲器
4.IP的值自动增加对应的字节数(即读取的指令的字节数),以便于CPU可以读取下一条指令
5.执行控制器执行指令
重复以上步骤

(在整个过程中尤其要注意这三个操作的顺序:先后进行 :指令进入指令缓冲器、 IP的值自动增加使得CS:IP指向下一条指令、 执行控制器执行指令缓冲区送来的指令)

精简一下:
1.从CS:IP指向的内存单元中读取指令,读取的指令进入指令缓冲器
2.IP = IP + 所读取指令的长度, 从而CS:IP指向下一条指令
3.执行控制器执行指令。转到步骤1,重复这个过程

8086CPU加电启动或复位后(即CPU刚开始工作), CS = FFFFH, IP = 0000H, 即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令并执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令

2.11 修改CS、IP的指令
8086CPU的大部分寄存器(如通用寄存器AX、BX、CX、DX)中的值都可以使用mov指令来改变, mov指令被称为传送指令

但mov指令不能改变CS、IP寄存器中的值
8086CPU提供了转移指令来修改CS和IP中的值,jmp指令是一种转移指令

jmp指令的用法:
①同时改变CS 和 IP 寄存器中的值: jmp 段地址: 偏移地址————用指令中给出的段地址修改CS, 偏移地址修改IP
如: jmp 2AE3:3, 执行后 CS = 2AE3H, IP = 0003H, CPU将从2AE33H内存单元处读取指令

②仅改变IP寄存器中的值: jmp 某一合法寄存器————用“某一合法寄存器”中的值修改IP

(jmp ax 含义上好似 mov ip, ax)——实际并不存在后者这个指令,只是一种比喻

2.12 代码段
对于8086PC机,可以根据需要将一组内存单元定义为一个段。可以将长度为N(N≤64KB)的一组代码存在一组地址连续、起始地址为16的倍数的内存单元中。可以认为这段内存是用来存放代码的,称为代码段。

要让CPU执行我们放在代码段中的指令,就必须将CS:IP指向代码段中第一条指令的首地址(CPU只认被CS:IP指向的内存单元中的内容为指令)

2.9~2.12小结:
1.段地址在CPU的段寄存器中存放。8086CPU要访问内存时,由段寄存器提供内存单元的段地址。8086CPU有4个段寄存器,其中CS用来存放指令的段地址

2.CS存放指令的段地址、IP存放指令的偏移地址

3.8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行

4.8086CPU提供转移指令(jmp是一种转移指令)修改CS、IP中的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值