TA的每日心情 | 开心 2014-5-10 22:12 |
---|
签到天数: 1 天 [LV.1]初来乍到
滴水菜鸟
- 积分
- 31
|
本帖最后由 猜猜 于 2014-5-10 23:15 编辑
1. 8086CPU有20位地址总线,可以传送20位的地址,达到1MB寻址能力。
而 8086CPU 是16位结构,在内部一次性处理、传输、暂时存储的地址都是16位,
从内部结构看,寻址能力只有64KB。
怎么办呢? 在8086CPU内部使用2个16位的地址来合成一个20位的物理地址。
2. 段寄存器有4个:CS、DS、SS、ES。 我们先来看学习 代码段寄存器CS 。
3. 段地址(16位) + 偏移地址(16位) ---->送到 “地址加法器”, 传出来后就是 20位的物理地址。
物理地址 = 段地址 X 16 + 偏移地址
例如 8086CPU要访问 123C8H的内存单元。
段地址为1230H, 偏移地址为 00C8H。
地址加法器 先把 段地址X16,段地址变成了12300H
再进行小学学过的加法运算。
12300H
+
00C8H
-----------------
123C8H
4. 段地址X16,可以理解为 左移4位, 一个X进制的数据左移一位,想当于原数据乘以X。
5. 段地址X16 + 偏移地址 = 物理地址 的本质含义
CPU在访问内存时,用一个基础地址(段地址X16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
6. CPU 可以用不同的段地址和偏移地址形成同一个物理地址。
7. 如果给定一个段地址,仅通过变化偏移地址来进行寻址,最多可以定位64KB个内存单元。
8. 在8086PC机中,存储单元的地址用2个元素来描述,段地址和偏移地址
9. 段寄存器(CS、DS、SS、ES)中的CS段寄存器
CS和IP是8086CPU中2个最关键的寄存器。它们指示了当前要读取指令的地址。
CS为代码段寄存器 (Code Segment Register) ,IP为指令指针寄存器 (Instruction Pointer Register) 。
在8086PC机中,任意时刻,设CS中的内容为M, IP中的内容为N,
8086CPU将从内存 M X 16 + N 单元开始,读取一条指令并执行。
10. 修改CS、IP的指令。
大部分8086CPU寄存器的值,都可以使用mov指令来改变,mov指令被称为 传送指令
mov指令不能修改CS、IP中的值,因为8086CPU没有提供这样的功能。
能够改变CS、IP寄存器内容的指令称为 转移指令 。
一个最简单的可以修改CS、IP寄存器中值的指令:jmp 指令.
(1) 如果仅想修改IP寄存器的内容,语法如下:
jmp 某一合法寄存器 ----> 用(某一合法)寄存器中的内容修改IP寄存器中的值。
例子: 假设现在 ax = 1000H, CS = 2000H, IP = 0003H
执行 jmp ax 后, ax = 1000H, CS = 2000H, IP = 1000H
(2) 如果想同时修改CS:IP寄存器的值。可以使用语法: jmp 段地址:偏移地址
如:jmp 2AE3:3 执行后, CS = 2AE3H, IP = 0003H。CPU 将从2AE33H处读取指令。
11. 代码段:我们可以将长度为N(N <= 64KB)的一组代码,存在一组地址连续、起始地址为16倍数的内存单元中,
我们可以认为,这段内存是用来存放代码的,从而定义了一个代码段。
如果想让CPU执行到代码段中的指令,必须要将CS:IP指向所定义代码段中第一条指令的首地址。
例如:以下代码段(长度为10个字节)
mov ax, 0000H (B8 00 00)
add ax, 0123H (05 23 01)
mov bx, ax (8B D8)
jmp bx (FF E3)
如果把上面的代码段存放在 123B0H~123B9H内存单元中,将其定义为代码段,
如果想让这段代码得到执行,可设CS=123BH,IP=0000H。
12. 8086CPU的工作过程:
(1) 从CS:IP指令的内存单元读取指令,读取的指令进入指令缓冲器。
(2) IP指向下一条指令
(3) 执行指令 [然后重复步骤(1), 重复这个过程]
|
|