沈美明、温冬婵版IBM-PC汇编语言程序设计
第三章:8086的指令系统和寻址方式
一、寻址方式
(1)指令=操作码+操作数(操作数字段可以有一个、两个、三个)分别为一地址、二地址、三地址指令
指令系统:一组指令的集合。
(2)寻址方式:与地址有关的寻址方式+与数据有关的寻址方式
与数据有关的寻址方式:
(a)立即寻址方式--------操作数在指令中给出
注意:只能用于源操作数段,不能用于寄存器操作数段
SRC与DST的字长必须保持一致
(b)寄存器寻址方式-------操作数在指定的寄存器中
注意:字节寄存器只有AH、AL、BH、BL、CH、CL、DH、DL
SRC和DST的字长一致
CS不能用MOV指令改变
(c)直接寻址方式--------有效地址EA由指令直接给出
图解:
注意:隐含的段地址为数据段DS
可以使用段跨越前缀 如:MOV AX,ES:[2000H]
操作数地址可以由变量(符号地址)表示,但是要注意变量的属性
(d)寄存器间接寻址------EA在基址寄存器(BX/BP)或变址寄存器(SI/DI)中
图解:
注意:不允许使用AX、CX、DX存放EA
SRC与DST的字长保持一致
适用于数组,字符串,表格处理。
(e)基址变址寻址方式
注意:必须是一个基址寄存器和一个变址寄存器的组合
(f)相对基址变址寻址方式
(g)比例变址寻址方式
与相对寄存器寻址相比,增加了比例因子。优点:对于元素大小为2,4,8字节的数组,可以在变址寄存器中给出数组元素的下标,而由这种寻址方式控制直接用比例因子把下标值转化为变址值。如上例中可理解为:讲双字数组第三个元素放到EAX中
(h)基址比例变址寻址方式
(i)相对基址比列变址寻址方式
(3)与转移地址有关的寻址方式:用来确定转移指令(JMP)和转子指令(CALL)的转向地址
段内寻址:
(a)段内直接寻址:EA=IP+指令中指定的8位或16位位移量
JMP指令在位移量为8位时为短跳转,并在符号地址前加SHORT;
位移量为16位时为近跳转,在符号地址前加NEAR PTR。
注意:条件转移指令只能用段内直接寻址的8位位移量。
(b)段内间接寻址:EA=寄存器/一个存储单元的内容;
(c)段间直接寻址:在指令中直接提供转向的段地址和偏移地址
FAR PTR表示段间转移的操作符
(d)段间间接转移:用存储器中的两个相继字的内容取代CS 和 IP
二、指令系统:数据传送指令、算术指令、逻辑指令、串处理指令、控制转移指令!!!
1、通用数据传送指令:MOV、PUSH、POP、XCHG
(a)MOV
注意:
DST、SRC不能同时为段寄存器
立即数不能直接送到段寄存器。需要用数据寄存器做中转。MOV DS,2000H X 而是:
DST不能是立即数和CS
DST、SRC不能同时为存储器寻址
不影响标志位
(b)PUSH SRC
POP DST
注意: 堆栈的段地址存放在SS,SP指向栈顶,且向低地址方向生长。
堆栈操作必须以字为单位。
不影响标志位
不能用立即寻址方式。 PUSH 1234H X
DST不能是CS
图解:
(c)XCHG
注意:不影响标志位。
不允许使用段寄存器。
累加器专用传送指令(IN / OUT / XLAT)
IN:(I/O-->CPU)外部设备的端口地址:0000H----FFFFH。其中前265个端口直接在指令中指出(长格式),若》256,则使用短格式,将端口号放入DX。
长格式:IN AL,PORT(字节)
IN AX,PORT(字)
短格式:IN AL,DX(字节)
IN AX,DX(字)
OUT同IN用法相似。
注意:不影响标志位
XLAT(换码操作)
地址传送指令(LEA、LDS、LES)
LEA
注意:LEA BX,LIST 与 MOV BX,OFFSET LIST 功能相同,且MOV指令的执行速度比LEA更快,但是OFFSET只能与简单的符号地址相连,而不能与LIST[SI]相连,此时体现LEA在取得访问变量的工具方面的好处。
LDS
LES
类型转换指令(CBW、CWD):无操作数指令;隐含对AL或AX进行符号扩展;不影响条件标志位
CBW:字节转换成字;
CWD:字转换成双字;CDQ:双字转换成四字
例题:
2、算术指令:加法指令(ADD、ADC、INC)、减法指令(SUB、SBB、DEC、NEG、CMP)、乘法指令(MUL、IMUL)、
除法指令(DIV、IDIV)、十进制调整指令(DAA、DAS、AAA、AAS、AAM、AAD)
(1)加法指令
ADD:
ADC:
INC:
除INC指令不影响CF标志外,均对条件标志位有影响
加法操作可能影响的条件标志位:
(2)减法指令
注意:除DEC指令不影响CF标志外,均对条件标志位有影响。
减法指令影响的条件标志位
NEG指令对CF/OF的影响
(3)乘法指令
注意:AL(AX)为隐含的乘法寄存器
AX(DX,AX)为隐含的乘积寄存器
SRC不能为立即数
影响CF和OF,对其他条件标志位无定义(“无定义”与“无影响”不同,“无定义”是指指令执行后这些条件码位的状态不定;“无影响”是指该指令的结果并不影响条件码,条件码应保持原状态不变)
乘法指令对CF/OF的影响:
(4)除法指令:
注意:AX(DX,AX)为隐含的被除数寄存器
AL(AX)为隐含的商寄存器
AH(DX)为隐含的余数寄存器
SRC不能是立即数
对所有条件标志位均无定义。
对DIV和IDIV指令,如果字节操作时,而当结果溢出时,计算机会自动产生一个中断类型号为0的除法错中断,相当于执行了除数为0的运算,所得的商和余数都不确定。
(5)十进制调整指令
BCD码:用二进制编码的十进制数,又称而已十进制数压缩的BCD码,用4位二进制数表示1位十进制数
如:59D=0101,1001H
非压缩的BCD码:用八位二进制数表示一位十进制数
如:59D=0000,0101,0000,1001H
数字的ASCII码是一种非压缩的BCD码