文章目录
8086x8088指令系统
-
IBMPC/XT微型计算机的微处理器采用的是8088芯片
-
指令系统是指处理器所能完成的所有指令的集合。
-
它是在微处理器设计时就确定了的。
-
对于不同的微处理器,其指令系统中所包含的具体指令将是各不相同的。
8086x8088指令格式
- 8086/8088指令系统的指令类型较多,功能较强
- 各种指令由于功能不同,需要指令码提供的信息也不同
- 指令格式在满足不同功能的要求的同时又要尽量减少指令所占的空间
- 8086/8088指令系统采用了一种灵活的、由1~6个字节组成的变字长的指令格式
- 包括操作码、寻址方式以及操作数三个部分
- 通常指令的第一字节为操作码字节(Opcode),规定指令的操作类型;
- 第二字节为寻址方式字节(Mod),规定操作数的寻址方式;
- 接着以后的3~6字节依据指令的不同而取舍,可变字长的指令主要体现在这里,一般由它指出存储器操作数地址的位移量或立即数。
8086x8088寻址方式
- 机器语言指令由二进制代码组成。
- 一条指令包含操作码(OP)和操作数两部分。
- 操作码指明该指令进行什么操作。
- 操作数指出该指令在执行规定操作时所需的信息。
- 8086/8088的指令通常使用一个操作数或两个操作数。
规定操作数的方法
-
指令中用于说明操作数所在地址的方法称为寻址方式。
-
8086/8088的寻址方式分为两类:数据寻址方式和转移地址寻址方式
数据寻址方式
立即寻址
- 当数据为8位或16位时,可直接放在指令本身的最后一个字节(8位)或两个字节(16位)中。
- 这样的数据常称为立即操作数。
示例
MOV AL,80H;将8位立即数80日送入AL寄存器中
MOV AX,1234H;将16位立即数1234日送入AX寄存器中,其中(AX)=1234H
寄存器寻址
- 数据存放在指令规定的寄存器中。
- 对于16位数据,寄存器可以是AX,BX,CX,DX,SI,DI,SP或者BP。
- 而对于8位数据,寄存器可以是AL,AH,BL,BH,CL,CH,DL或DH。
示例
MOV CL,DL
MOV AX,BX
如果(DL)=50H,(BX)=1234H
执行结果为:(CL)=50H,(AX)=1234H。
直接寻址
- 操作数在存储单元中
- 其16位有效地址,即段内偏移地址在指令码之中,占两个字节。
- 此存储单元的实际物理地址是由段寄存器内容和指令码中直接给出的有效地址之和形成的。
示例
MOV AL,[1064]
如果(DS)=2000H,则执行结果为:(AL)=45H。
寄存器间接寻址
-
操作数在存储单元中
-
其有效地址在指令码指明的基址寄存器BX、BP或变址寄存器Sl或DI之中。
-
有效地址可表示为(BX)(BP)(SI)(DI)
-
和直接寻址一样,寄存器间接寻址的操作数一定存放在存储单元中。
-
BX、SI和DI间接寻址默认的段寄存器为DS,而BP间接寻址默认的段寄存器为SS。
示例
MOV AX,[SI]
MOV [BX], AL
如果(DS)=3000H,(SI)=2000H,(BX)=1000H,(AL)=64H,则上述两条指令的执行结果为:(AX)=4050H,(31000H)=64H。
寄存器相对寻址
-
操作数在存储单元中
-
其有效地址是一个8位或16位的位移量(以后都用disp表示)与一个基址存储器或变址存储器的内容之和
-
其有效地址可表示为:
- 位移量可以看成是基址/变址的一个相对值,故称其为寄存器相对寻址
- 若指令中的寄存器是BX、SI、DI则操作数默认存放在数据段DS
- 若指令中的寄存器是BP,则操作数默认存放在堆栈段SS中
- 寄存器相对寻址允许段超越
- 位移量既可以是一个8位或16位的立即数,也可以是一个符号地址
示例:
MOV [SI+10H],AX
MOV CX,[BX+COUNT]
如果(DS)=3000H,(SI)=2000H,(BX)=1000H,COUNT=1050H,(AX)=4050H
则执行结果为(32010H)=4050H,(CX)=4030H
基址变址且相对寻址
- 操作数在存储单元中
- 其有效地址是一个8位或者16位的位移量disp、一个基址寄存器内容和一个变址寄存器内容之和
- 形式为:
- 当基址寄存器为BX时,操作数在数据段(DS)中
- 当基址寄存器为BP时,操作数在堆栈段(SS)中
- 基址变址相对寻址同样允许段超越
示例
MOV AX,[BX+DI+1200H]
MOV [BP+SI+200H],CX
若(DS)=8000H,(SS)=6000H,(BH)=1000H,(DI)=1500H,(BP)=1000H,(SI)=1600H
(CX)=7856H,
则执行结果为 (AX)=8056H
(62800H)=7856H
隐含寻址
- 有些指令的指令码中不包含知名操作数地址的部分,而其操作码本身隐含地指明了操作数地址
示例
字符串操作类指令就属于这种寻址
若(BX)=1200H,(SI)=0A00H,位移量disp=0710H,(DS)=3200H,(SS)=5000H,(BP)=2200H
段寄存器按默认段寄存器,则相对于各种寻址方式的有效地址和物理地址将是
直接寻址
EA=0710H
物理地址=32000H+0710H=32710H
寄存器间接寻址
假设寄存器为BP
EA=2200H
物理地址=50000H+2200H=52200H
寄存器相对寻址
假设寄存器为BX
EA=1200H+0710H=1910H
物理地址=32000H+1910H=33910H
基址变址寻址
假设寄存器为BP和SI
EA=2200H+0A00H=2C00H
物理地址=32000H+2310H=34310H
转移地址寻址方式
-
CPU执行指令的过程,指令是按顺序存放在存储器中的。
-
8086中程序执行顺序由代码段寄存器CS和指令指针IP的内容决定
-
程序转移指令通过改变IP和CS的内容,就可以改变程序的正常执行程序。
-
转移地址的方式有四种:段内直接寻址、段内间接寻址、段间直接寻址、段间间接寻址
段内直接寻址
- 转移的有效地址为:(IP)+disp
- 又称为相对寻址(相对于IP的寻址)
- disp可以是8位或者16位
- 若disp为8位,则称为段内短程转移
- disp在指令码中都是用补码表示的有正负的符号数(不论8位还是16位)
- 8位时称为短转移,范围-128~127
- 16位时称为近转移,范围-32718~32767
- 段内直接寻址转移指令的格式:
JMP NEAR PTR PROGIA
JMP SHORT QUEST
其中,PROGIA和QUEST均为转向的目标地址,在机器指令中用位移量来表示
段内间接寻址
-
同一段代码内
-
要转移到的地址为16位段内偏移地址(有效地址)
-
段内偏移地址存储在一个16位寄存器中或在存储器相邻的两个单元中
-
寄存器或相邻两个单元的第一个单元的地址是在指令码中以相应的数据寻址方式给出
-
唯一的区别是寻址方式所决定的地址中所存放的不是一般的操作数而是转移地址
-
段内间接寻址转移指令的格式可表示为:
JMP BX
JMP WORD PTR [BP+10H]
其中WORD PTR位操作符,用以指出其后的寻址方式所取得的目标地址是一个字的有效地址
段间直接寻址
- 指令码中直接给出16位段地址和16位有效地址
- 指令格式可表示为:
JMP FAR PTR LABEL_NAME
其中LABEL_NAME是一个在另外的代码段中已经定义的远标号
段间间接寻址
- 与段内间接寻址相似,但不可能有寄存器寻址
- 因为要得到的转移地址为32位
- 指令中一定给出某种访问内存单元的方式
- 用此方式计算出的存储单元开始的连续四个单元的内容就是要转移的地址
- 前两个单元内的16位为有效地址
- 后两个单元内的地址为段地址
示例
JMP VAR_DOUBLEWORD
JMP DWORD PTR [BX]
第一条指令中,VAR_DOUBLEWORD应是一个已经定义为32位的存储器变量
第二条指令中,利用操作符PTR将存储器操作数的类型定义为DWORD(双字)
小结
属于转移类指令的有转子程序指令CALL,无条件转移指令JMP,和多种条件转移指令等
并不是每种指令都有上述四种寻址方式