汇编语言_03

2017-07-17  本文已影响38人  番薯大佬

8086
寻址方式

8086采用一种在内部用2个16位地址合成的方法来生成1个20位的物理地址


寻址方式.png
物理地址.png
物理地址02.png

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

内存分段管理

给定一个段地址,仅通过变化偏移地址来进行寻址,最多可定位多少个内存单元?

结论:偏移地址16位,变化范围为0FFFFH,仅用偏移地址来寻址最多可寻64KB个内存单元。比如给定段地址1000H,用偏移地址寻址,CPU的寻址范围为:10000H1FFFFH。
在8086PC机中,存储单元的地址用两个元素来描述,即段地址和偏移地址。

“数据在21F60H内存单元中。”这句话对于8086PC机一般不这样讲,取而代之的是两种类型的说法:(1)数据存在内存2000:1F60中;(2)数据存在内存的2000H段中的1F60H单元中。这两种描述都 表示“数据在内存21F60H”单元中。

段寄存器

CS和IP

指令的执行过程


指令执行01.png
指令执行02.png
指令执行03.png
指令执行04.png
指令执行05.png
指令执行06.png
指令执行07.png
指令执行08.png
指令执行09.png
指令执行10.png
指令执行11.png
指令执行12.png
指令执行13.png
指令执行14.png
指令执行15.png

指令和数据

例如:内存中的二进制信息 1000100111011000,计算机可以把它看作大小为 89D8H 的数据来处理,也可以将其看作指令 mov ax,bx 来执行。
数据:1000100111011000 -> 89D8H
程序:1000100111011000 -> mov ax,bx

jmp指令

若想同时修改CS、IP的内容,可用形如“jmp段地址:偏移地址”的指令完成,如:
jmp 2AE3:3,执行后:CS = 2AE3H,IP = 0003H,CPU将从 2AE33H 处读取指令。
jmp 3:0B16,执行后:CS = 0003H,IP = 0B16H,CPU将从 00B46H 处读取指令。

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

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

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。
jmp ax,在含义上好似:mov IP,ax。

jmp指令--练习


jmp指令练习01.png
jmp指令练习02.png
jmp指令练习03.png

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

mov ax,0000    (B8 00 00)
add bx,0123H   (05 23 01)
mov bx,ax      (8B D8)
jmp bx         (FF E3)

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

上一篇 下一篇

猜你喜欢

热点阅读