第三章 8086的寻址方式和指令系统 指令系统是微处理器(CPU)所能执行的指令 的集合,它与微处理器有密切的联系,不同的微处 理器有不同的指令系统。在本章中我们主要讲解 INTEL公司生产的8086/8088CPU的寻址方式以及各 种指令系统,并通过具体实例讲述了各条指令的功 能和使用方法。
根据指令内容确定操作数地址的过程, 称为寻址。 根据寻址方式计算所得到的地址叫做有 效地址EA,也就是段内偏移地址。有效 地址还需要与相应的段基地址组合才是 20位的物理地址PA ,该工作由CPU完成。
汇编指令:
操作码
操作数
操作码:指令操作类型; 操作数:指令所需操作数或操作数的地址;操作数可以 有一个,也可以有两个,一个源操作数,一个目的操作 数。
例: MOV AX,CX ;将CX的内容送入AX中。
一、立即寻址方式
指令操作数部分直接给出指令的操作数,操作数与操作 码一起存入代码段中。立即数有8位和16位。例 :MOV AL,5 ;源操作数为立即寻址 指令执行后,AL=05H,8位数据05H存入AL寄存器。 例 :MOV AX,3064H ;源操作数为立即寻址 指令执行后,AX=3064H,16位数据3064H存入AX寄存 器。
二、 寄存器寻址方式
寄存器寻址方式的操作数是寄存器的值,指令中直接 使用寄存器名,包括8位或16位通用寄存器和段寄存器。 可使用的16位寄存器:AX、BX、CX、DX、SI、DI、 SP、BP;其中:AX、BX、CX、DX可分成两8位使用。例: MOV AX,CX ;(AX) (CX)
MOV AL , CL
;(AL)
(CL)
内存寻址方式
c语言 int p; int *p;int **p在内存寻址方式中,操作数是某个内存单元的内容 (值),指令中给出的是内存单元的有效地址EA(即 偏移地址),段地址通常在隐含的某个段寄存器中。
三、直接寻址方式 直接寻址方式的操作数的形式为:Variable或[Variable] 在直接寻址方式中,操作数的偏移地址(有效地址EA) 直接用指令加以指定(有直接地址值和标号两种形式), 它存放在代码段中指定操作码之后,但操作数一般存放 在存储器的数据段中,所以必须先求出操作数的物理地 址,然后再访问存储器才能取得操作数。段地址隐含的 由DS 指定,也可以ES指定,但需在指令中指明。最后 存储器地址为:DS:偏移地址 或 ES:偏移地址。 例: MOV AX,ES:[2000H] 将ES:2000H单元内容送入AX。 例: MOV AX,LABLE 或 MOV AX,[LABEL] 将标号为LABLE(存放操作数单元的符号地址) ,即 DS:LABLE中的内容送入AX。
段超越当操作数在内存单元时,系统根据隐含约定,自动将 寄存器DS的值作为段地址。然而,当操作数段地址 不在隐含的段寄存器时,可以使用段超越前缀取代其 隐含约定。 段超越前缀形
式为: 段寄存器名: 例如: MOV AX,ES:[BP] ;段地址在ES MOV AX,CS:[BX] [SI] ;段地址在CS 段地址的基本约定和允许超越的情况如表所示:
存储器存取方式 约定段 允许超越段
偏移地址
取指令 堆栈操作 源串 目的串 BP作基址 通用数据读写
CS SS DS ES SS DS
无 无 CS,ES,SS 无 CS,DS,ES CS,ES,SS
IP SP SI DI 有效地址EA 有效地址EA
四、寄存器间接寻址 寄存器间接寻址方式的操作数形式为:[reg] 操作数的有效地址包含在基址寄存器BX,基址指针BP 或一个变址寄存器(SI或DI)中。寄存器间接寻址要 用方括号括起来,以便与寄存器操作数相区别。 例: MOV AX,[BX];将由BX决定的存储单元的内 容送到AX寄存器。 DS=100010000 10002 10003 10004 BX 数据段 BB TAB:
AAAA 间接寻址 BB AX
0002
AH
AL
操作数在存储器中,指令中寄存器内容作为操作数所在 单元的有效地址。 (BX) (SI) 有效地址 = (DI) (BP) 段寄存器为SS 段寄存器为DS
物理地址计算方法:物理地址 = (DS)* 16 + (BX)或(SI)或(DI) 物理地址 = (SS)* 16 + (BP)
例:已知:(DS)=2100H,(DI)=2000H 指令: MOV AX,[DI] ;(AX) ((DI))
物理地址=(DS) * 16 + (DI)=2100H * 16 + 2000H
=21000H + 2000H=23000H 指令结果:将23000H单元内容送AL中, 将23001H单元内容送AH中。
五、寄存器相对寻址方式
操作数在存储器内,指令中寄存器内容与指令指定的位 移量(DISP)之和作为操作数所在单元的有效地址。 (BX)有效地址 = (SI) (DI) (BP) + DISP16
DISP8段寄存器为DS
段寄存器为SS
物理地址 = (DS)* 16 +(BX)+DISP8
(SI)、(DI)、DISP16类同。物理地址= (SS) *16 + (BP)+DISP16
例: 如果 (DS)=3000H, (SI)= 2000H, COUNT=3000H,
则执行指令 MOV AX,COUNT[SI],求出此种寻址方 式对应的有效地址和物理地址。有效地址= 2000H + 3000H = 5000H 物理地址=(DS)*16 + 5000H =30000H + 5000H =35000H 六、基址变址寻址方式: 操作数在存储器中,指令将基址寄存器(BX或BP) 与变址寄存器(SI或DI)内容之和作为操作数所在存 储单元的有效地址。
有效地址 =
(BX) (BP)
+
(SI) (DI)
物理地址 = (DS) * 16 + (BX)+ (SI)或(DI) 物理地址 = (SS) * 16 + (BP) + (SI)或(DI)
例: MOV AX,[BX+DI] 或 MOV AX,[BX][DI] DS:(BX)+(DI) 字存储单元内容送AX。
例: MOV AX,[BP+SI] 或 MOV AX,[BP][SI] SS:(BP)+(SI) 字存储单元内容送AX。
例:如果 (DS)=2100H, (BX)= 0158H, (DI)=10A5H, EA=11FDH, 则执行指令 MOV AL,[BX][DI]有效地址:EA=(BX)+(DI)=0158H+10A5H=11FDH
物理地址:(DS) * 16 + 有效地址=21000H+11FDH=221FDH执行结果:将221FDH单元内容送入寄存器AL中。
七、相对基址变址寻
址方式 操作数在存储器内,指令将基址寄存器(BX或BP)与 变址寄存器(SI或DI)的内容之和再加上位移量(8位 或16位),得到操作数所在单元的有效地址。有效地址=
(BX) (BP)
+
(SI) (DI)+
DISP8 DISP16