汇编(三)

2017-07-12  本文已影响55人  林大鹏

一. 8086的寻址方式

8086采用一种在内部用216位地址合成的方法来生成120位的物理地址

8086物理地址合成方式.png

地址加法器采用物理地址 = 段地址 * 16 + 偏移地址的方法用段地址偏移地址合成物理地址。例如,8086CPU要访问地址为123C8H的内存单元,此时,地址加法器的工作过程如下:

地址加法器工作过程.png

同时观察下面地址:

image.png

结论: CPU可以用不同的段地址和偏移地址形成同一个物理地址
比如CPU要访问21F60H单元,则它给出的段地址SA偏移地址EA来满足SA*16+EA = 21F60H即可。

二. 内存分段管理

image.png

练习:

1. 在8086中如果给定一个段地址,仅通过变换偏移地址来进行寻址,最多可定位多少个内存单元?

解答:
偏移地址为16位,变化范围是0x0000~0xFFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H ~ 1FFFFH.

2. 在8086PC机中,存储单元的地址用两个元素来描述,即段地址和偏移地址。

“数据在21F60H内存单元中”,这句话对于8086PC机一般不这样将,取而代之的是两种类似的说法:

三. 段寄存器

四. CS和IP

image.png

(1) 8086CPU当前状态: CS中的内容为2000H,IP中的内容为0000H;
(2) 内存20000H ~ 20009H 单元存放着可执行的机器码;
(3) 内存20000H ~ 20009H 单元中存放的机器码对应的汇编指令如下。
地址: 20000H ~ 20002H,内容: B8 23 01, 长度: 3Byte, 对应汇编指令: mov ax, 0123H;
地址: 20003H ~ 20005H, 内容:BB 03 00, 长度: 3Byte, 对应汇编指令: mov bx, 0003H;
地址: 20006H ~ 20007H, 内容: 89 D8, 长度: 2Byte, 对应汇编指令: mov ax, bx;
地址: 20008H ~ 20009H, 内容: 01 D8, 长度: 2Byte, 对应汇编指令: add ax, bx

五.指令执行过程

image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png

通过上面的过程展示,8086CPU的工作过程可以简要描述如下:

  1. CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器

2.IP = IP + 所读指令的长度,从而指向下一条指令。

  1. 执行指令。转到步骤1,重复该过程。

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

六.指令和数据

举个🌰 :
例如,内存中的二进制信息 1000 1001 1101 1000,计算机可以把它看做大小为89D8H的数据来处理,也可以看做指令mov ax, bx 来执行

1000 1001 1101 1000 -> 89D8H(数据)
1000 1001 1101 1000 -> mov ax, bx (程序)

七. jmp指令

** “jmp 段地址: 偏移地址” 指令的功能为: 用指令中给出的段地址修改CS, 偏移地址修改IP**。

若想仅修改IP的内容,可用形如"jum 某一合法寄存器" 的指令完成,如:

jmp ax, 指令执行前: ax = 1000H, CS = 2000H, IP = 0003H
         指令执行后: ax = 1000H, CS = 2000H, IP = 1000H

jmp bx, 指令执行前:bx = 0B16H, CS = 2000H, IP = 0003H
         指令执行后:  bx = 0B16H, CS = 2000H, IP = 0B16H

"jmp 某一合法寄存器" 指令的功能为: 用寄存器中的值修改IP

jum ax, 在含义上好似: mov IP, ax

八.jmp指令 --- 练习

第一题:

image.png

答案:
- mov ax, 6622H
- jmp 1000 : 3
- mov ax, 0000
- mov bx, ax
- jmp bx
- mov ax, 0123H
- 转到第3步执行

分析:

第二题:

image.png

答案:
CPU 4次修改IP
分别在:
mov ax, bx执行了一次
sub ax, ax执行了一次
jmp ax执行了两次,

最后IP中的值是0.
分析:

九. 代码段

前面讲过,对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将长度为N(N小于等于64KB)的一组代码,存在一组地址连续、起始地址为16的倍数的内存单元中,我们可以认为,这段内存是用来存放代码的,从而定义了一个代码段。比如,将:

image.png

这段长度为10个字节的指令,存放在123B0H ~ 123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节。

如何使得代码段中的指令被执行呢?将一段内存当做代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动将我们定义的代码段中的指令当做指令来执行。CPU只认被CS:IP指向的内存单元中的内容为指令。所以要让CPU执行我们放在代码段中的指令,必须要将CS:IP指向所定义的代码段钟的第一条指令的首地址。对于上面的例子,我们将一段代码存放在123B0H ~ 123B9H 内存单元中,将其定义为代码段,如果要让这段代码得到执行,可设CS = 123BH,IP=0000H

上一篇 下一篇

猜你喜欢

热点阅读