目录
第三章 8086指令系统
3.2寻址方式
3.2.1操作数的寻址方式
1)直接寻址方式 MOV AX,DS:[0010H]
特点:在描述操作数的地址时直接表示出操作数的偏移地址
例:若(DS)=2014H, (20150H)=52H,(20151H)=16H指令MOV AX,DS:[0010H]执行后(AX)=?
由题可知DS:为数据段前缀,0010H为偏移地址
2)寄存器间接寻址方式 MOV DX,[SI]
特点:以某个16位寄存器的内容作为操作数的偏移地址
例:设(DS)= 3010H,(30220H)= 0AH,(30221H)= 28H,指令序列
MOV SI,0120H
MOV DX,[SI]
执行后,(DX)=?
3)寄存器相对寻址方式
MOV CH,[SI+06H] MOV CH,[SI-10H]
特点:操作数地偏移地址产生方式为:偏移地址=(16位寄存器)+D
表示为:[16位寄存器+D]或D[16位寄存器]16位寄存器只能是:SI、DI、BX、BP
设(DS)=2450H,(SI)=0030H,(24536H)=78H,(24520H)=64H,执行以下指令的结果
MOV CH,[SI+06H]
MOV CH,[SI-10H]
4)基址变址寻址方式
MOV AL,[BX+SI]
特点:BX、BP也称为基址寄存器,SI、DI又称变址寄存器
操作数的偏移地址产生方式为:偏移地址=(基址寄存器)+(变址寄存器)
指令表示为:[基址寄存器+变址寄存器] 或:[基址寄存器][变址寄存器]
5)相对基址变址寻址方式
MOV AL,[BX+SI+ARR]
特点:操作数的偏移地址产生方式为:
偏移地址=(基址寄存器)+(变址寄存器)+D
指令表示为:[基址寄存器+变址寄存器+D] 或:D[基址寄存器][变址寄存器]
3.2.2转移地址的寻址方式
3.3指令系统
3.3.1数据传送类指令
MOV 指令
指令格式: MOV DST,SRC
指令功能:DST (SRC)
MOV 指令是常用的数据传送指令,其传送对象可以是数据也可以是地址。
注意:
XCHG 指令
指令格式:XCHG OPR1,OPR2
指令功能:将操作数 OPR1和OPR2的内容互换
XCHG指令中,OPR1和OPR2互为源操作数和目的操作数均可采用寄存器寻址方式以及各种寻址方式,但不能采用立即寻址方式。
注意:
LEA指令
指令格式:LEA DST,SRC
指令功能: SRC 的偏移地址
LEA是一条传送地址信息的指令,将SRC的偏移地址传送给DST
注意:
XLAT指令
指令格式:XLAT
指令功能:AL --((BX)+(AL))
段寄存器固定使用DS,即以(BX)+(AL)为偏移地址访问数据段,读取一个字节数据传送给AL。
XLAT指令通常用于在一个字节数据表中查找所需的元素,所以也叫查表指令,字节数据表定义在数据段中。
PUSH 和POP指令
PUSH 和POP分别是堆栈的进栈和出栈操作指令(堆栈特点:后进先出)
PUSH指令
指令格式:PUSH OPR
指令功能:将子类型操作数OPR存入堆栈
注意:
POP指令
指令格式:POP OPR
指令功能:将栈顶元素取出并存入字类型操作数
注意:
IN 指令和OUT指令
指令功能:IN 指令和OUT指令是8086的输入输出指令,用于在CPU与输入/输出设备之间传送数据。
IN指令
指令格式有四种:
IN指令是输入指令,其功能是将IO端口的数据传送到AL或AX寄存器。
OUT指令
指令格式有四种:
OUT指令是输出指令,其功能是将AL或AX寄存器中的数据传送到
其他传送指令
完整逻辑地址传送指令
3.3.算术运算类指令
ADD 加法指令
指令格式: ADD DST, SRC
指令功能:DST --- (DST)+(SRC)
ADD指令对所有条件标志(CF、ZF、AF、SF、OF、PF,见1.3.1节)均有影响
注意:
例:设数据段内有数组定义如下:
例:设数据段内有数组定义如下:
ARY DW 67H,0C35H,?
试编写指令序列,实现将该数组前两个元素(即67H和0C35H)相加,其和存入数组第三个元素位置(即用?号定义的元素位置)。
指令序列编写如下:
MOV AX,ARY; 取第一个元素到Ax
ADD AX,ARY+2 ; 将第一个元素与第二个元素相加,其和存入AX
MOV ARY+4,AX ; 将和存入数组第三个元素位置
ADC指令
指令格式:ADC DST,SRC
指令功能:DST -- (DST)+(SRC)+CF。
ADC 指令称为带进位加法指令,即在普通加法的基础上再加上此前的指令所产生的CF标志值。该指令主要用于多字节数相加。
例:
编写指令序列,完成两个32位数相加: 20008A04H + 23459DO0H.
MOV AX,8A04H; 被加数的低16位存入AX
MOV DX,2000H; 被加数的高16位存入 DX
MOV CX, 9DO0H; 加数的低16位存入Cx
MOV BX,2345H ; 加数的高16位存入BX
ADD AX,CX; 低16位部分相加,和存入Ax,最高进位进入CF
ADC DX,BX; 高16位部分相加(带CF),和存入DX
执行后,运算结果的低16位(2704H)存于 AX,高16位(4346H)存于 DX,
即(DX:AX) = 43462704H。
INC指令
指令格式:INC OPR
指令功能:OPR-- (OPR)+1。
INC指令也称加Ⅰ指令,常用于计数和修改地址指针.
注意
减法类指令
SUB指令
指令格式:SUB DST, SRC
指令功能:DST-- (DST) -(SRC)。
SUB指令执行常规的减法运算,其在使用上的要求与ADD指令完全相同。
需要注意的是,执行SUB指令后,CF标志记录最高位上产生的借位。
设(AL)=76H,(DL)-OC5H,分析以下指令的执行结果
SUB AL,DL
SBB指令
指令格式:SBB DST, SRC
指令功能:DST--(DST)-(SRC)-CF。
SBB 指令称为带借位减法指令,即在普通减法的基础上再减去此前的指令所产生的CF标志值。该指令用于多字节数相减。
编写指令序列,完成两个32位数相减:20008A04H-23459D00H。
MOV AX,8A04H; 被减数的低16位存入AX
MOV DX,2000H; 被减数的高16位存入DX
Mov CX,9DOOH; 减数的低16位存入Cx
MOV BX,2345H; 减数的高16位存入BX
SUB AX,CX; 低16位部分相减,差存入Ax,最高借位进入CF
SBB DX,BX; 高16位部分相减(带CF),差存入DX
执行后,运算结果的低16位(OED04H)存于AX,高16位(0344H)存于DX.
即(DX:AX) = 0344ED04H。
DEC指令
指令格式:DEC OPR
指令功能:OPR--(OPR)-1。
DEC指令也称减1指令,常用于计数和修改地址指针。
DEC指令在使用上的要求与INC指令完全相同。
相对于INC指令的顺计数,DEC指令的倒计数在汇编语言程序设计中用得更多(如循环计数)。
CMP指令
指令格式:CMP DST,SRC指令功能:(DST)-(SRC)。
CMP指令称为比较指令。CMP指令执行一次减法运算,影响全部状态标志,但不保存运算结果。它在使用上的要求与SUB指令完全相同。
NEG指令
指令格式:NEG OPR
指令功能:OPR --0-(OPR)。
NEG 指令也称求补指令,用于求有符号数(以补码表示)的相反数,各状态标志按0-(OPR)运算来设置。OPR不能为立即数或段寄存器,且必须有明确的数据类型。
乘法类指令
MUL指令
指令格式:MUL SRC;SRC为乘数,被乘数隐含
指令功能:MUL为无符号数乘法指令.
当 SRC为字节类型数据时,被乘数默认为AL,乘积存于AX;
当SRC为字类型数据(16位)时,被乘数默认为AX,
乘积存于DX:AX(即乘积的高16位存于DX,低16位存于AX)。
注意:
IMUL指令
指令格式:IMUL SRC; SRC为乘数,被乘数隐含
指令功能:IMUL为有符号数乘法指令,其在用法上与MUL指令相同。
除法类指令
DIV指令
指令格式:DIV SRC: SRC为除数,被除数隐含
指令功能:DIV为无符号数除法指令
注意:
IDIV指令
指令格式:IDIV SRC; SRC为除数,被除数隐含
指令功能:IDIV为有符号数除法指令,其在用法上与DIV 指令相同。对有符号数除法,余数的符号与被除数符号相同。
3.3.3 逻辑运算与移位操作类指令
AND指令
指令格式:AND DST,SRC
指令功能:DST -- (DST)A(SRC),A代表“与”运算。
AND指令是逻辑“与”运算指令。
AND指令在使用上的要求与ADD指令完全相同,其影响条件标志ZF、PF、SF、CF和OF,并对CF 和OF 清零。
OR指令
指令格式:OR DST, SRC
指令功能:DST--(DST)V(SRC),V代表“或”运算。
OR指令是逻辑“或”运算指令.
OR指令在使用上的要求以及对条件标志的影啊与AND指令完全相同。
XOR指令
指令格式:XOR DST,SRC
XOR指令是逻辑“异或”运算指令。
XOR指令在使用上的要求以及对条件标志的影响与AND指令完全相1
NOT指令
指令格式:NOT OPR
NOT指令是逻辑“非”运算指令。
使用NOT指令时必须注意:
移位操作指令:
注意:
程序控制类指令:
完