0主讲人刘雪洁AssemblyLanguageProgramming汇编语言程序设计1第2章80x86的指令系统2.1指令格式2.2寻址方式2.3数据传送类指令2.4算术运算类指令2.5位操作类指令2.6串操作类指令2.7控制转移类指令2.8处理机控制类指令22.1指令格式计算机是通过执行指令序列来解决问题的。计算机的指令系统就是指该计算机能够执行的全部指令的集合。指令的一般格式:[标号:]操作符OPD,OPS[;注释]算术运算和位操作类指令的部分单操作数指令的格式:[标号:]操作符OPD[;注释]32.2寻址方式2.2.1立即寻址2.2.2寄存器寻址2.2.3直接寻址2.2.4寄存器间接寻址2.2.5变址寻址2.2.6基址加变址寻址2.2.7跨段问题2.2.8与转移地址有关的寻址方式42.2.1立即寻址立即寻址方式中,指令操作码和操作数都在存储器代码段中。立即数可以是用8位或16位二进制补码表示的有符号数。功能:常用于给寄存器赋初值,只能用于源操作数字段,且源操作数与目的操作数长度应一致。5【例】MOVAX,10执行后(AX)=?该例中源操作数为立即寻址方式,立即数为10,存放在指令的下一单元。图形表示:执行:10→AX执行后:(AX)=000AH62.2.2寄存器寻址寄存器寻址方式的操作数在指令指明的寄存器中。【例】下列程序执行后,(AX)=?,(BX)=?MOVAX,1234HMOVBX,5678HADDAX,BX该程序中MOV指令为数据传送指令操作符,ADD指令为加法指令操作符,三条指令皆为双操作数指令。第一、二条指令AX、BX皆为目的操作数地址,为寄存器寻址方式。第三条指令中,AX为目的操作数地址,BX为源操作数地址。源地址和目的地址皆为寄存器寻址方式。7图形表示:执行:1234H→AX5678H→BX(AX)+(BX)→AX执行后:(AX)=68ACH,(BX)=5678H82.2.3直接寻址汇编格式:①含有变量的地址表达式。②段寄存器名:[EA]。功能:指令下一字单元的内容是操作数的有效(偏移)地址EA。图形表示:9【例】寄存器和存储器内容为:(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=4545H。执行指令:MOVAX,BUF(MOVAX,[2000H])执行后:(AX)=?图形表示:执行:(32000H)→AX执行后:(AX)=4545H102.2.4寄存器间接寻址寄存器间接寻址方式中,寄存器的内容为操作数的偏移地址EA,操作数在存储器中。汇编格式:[R]功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。11偏移地址EA计算方法如下:EA=[SI]SI作间址寄存器。[DI]DI作间址寄存器。[BX]BX作间址寄存器。[BP]BP作间址寄存器。12执行指令:MOVAX,[BP]执行后:(AX)=?图形表示如下:执行:(20030H)→AX执行后:(AX)=1234H【例】寄存器和存储器内容分别为:(AX)=0,(BP)=0030H,(SS)=2000H,(20030H)=1234H132.2.5变址寻址变址寻址方式操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中,又称为寄存器相对寻址。汇编格式:X[R](X表示位移量,是8位或16位二进制补码表示的有符号数)功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。图形表示如下:14偏移地址EA计算方法如下:15【例】设执行前:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H执行指令:ADD6[BX],AX执行后:(AX)=?,(BX)=?,(DS)=?,(20036H)=?图形表示如下:执行:(20036H)+(AX)→20036H执行后:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0090H。162.2.6基址加变址寻址基址加变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量X三项之和,操作数在存储器中。汇编格式:X[BR+IR]功能:操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。17操作数偏移地址EA计算方法如下图形表示:182.2.7跨段问题按前述规定:若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。19汇编格式:段寄存器名:操作数地址。功能:段寄存器名指明操作数属哪个段。【例】MOVAX,DS:[BP]MOVCX,SS:[SI]该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:PA1=(DS)左移4位+[BP]PA2=(SS)左移4位+[SI20+2.2.8与转移地址有关的寻址方式这种寻址方式用来确定转移指令及CALL指令的转向地址。段内直接寻址:转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和。位移量IP寄存器EA这种方式的转向有效地址用相对于当前IP值的位移量来表示,所以它是一种相对寻址方式。21指令中的位移量是转向的有效地址与当前IP值之差,所以当这一程序段在内存中的不同区域运行时,这种寻址方式的转移指令本身不会发生变化。这种寻址方式适用于条件转移及无条件转移指令,但当它用于条件转移指令时,位移量只允许8位,无条件转移指令在位移量为8位时称为短跳转,位移量为16位时称为近跳转。例:JMPNEARPTRPROGIAJMPSHORTQUEST其中,PROGIA和QUEST均为转向的符号地址,在机器指令中,用位移量来表示。在汇编指令中,如果位移量为16位,则在符号地址前加NEARPTR;如果位移量为8位,则在符号地址前加SHORT。22段内间接寻址:转向的有效地址是一个寄存器或是一个存储单元的内容。这个寄存器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的转向的有效地址用来取代IP寄存器的内容。这种方式以及以下的两种段间寻址方式都不能用于条件转移指令,而JMP和CALL指令可以用四种寻址方式中的任何一种。数据寻址方式根据数据寻址方式计算出EA值转向的有效地址转向的有效地址或指令存储单元23例:设(DS)=2000H,(BX)=1256H,位移量=20A1H,(232F7H)=3280H,(264E5H)=2450H.指令:JMPBX可求得转向地址为BX寄存器的内容,执行该指令后(IP)=1256H指令:JMPTABLE[BX]执行该指令后(IP)=(16d*(DS)+BX+位移量)=(20000+1256+20A1)=(232F7)=3280H24段间直接寻址:在指令中直接提供了转向段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容就完成了从一个段到别一个段的转移操作。指令的汇编语言格式可表示为:JMPFARPTRNEXTROUTINT其中,NEXTROUTINT为转向的符号地址,FARPTR则是表示段间转移的操作符。偏移地址指令段地址IP寄存器CS寄存器25段间间接寻址:用存储器中的两个相继字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。这里存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得。指令的汇编语言格式可表示为:JMPDWORDPTR[INTERS+BX]其中,[INTERS+BX]说明数据寻址方式为直接寻址方式,DWORDPTR为双字操作符,说明转向地址需要取双字为段间转移指令。数据寻址方式根据数据寻址方式计算出EA值转向的有效地址转向的有效地址指令存储器中两个相继字IPCS262.3数据传送类指令2.3.1通用数据传送指令2.3.2堆栈操作指令2.3.3标志寄存器传送指令2.3.4地址传送指令2.3.5输入输出指令272.3.1通用数据传送指令1.传送指令MOV2.数据交换指令XCHG3.查表转换指令XLAT281.传送指令MOV语句格式:MOVOPD,OPS功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。下图描述了MOV指令在传送数据时允许传送的路径及类型。注:CS不允许做目的操作数.29【例】存储器与寄存器间数据传送。MOVAX,BUF;BUF是变量,源操作数为直接寻址MOVBH,[DI];源操作数为寄存器间接寻址MOVDI,ES:3[SI];源操作数为变址寻址,使用跨段前缀MOVBP,3[BX+SI];源操作数为基址加变址寻址MOVBUFA,DL;BUFA是一字节变量MOV[BP],AX;使用SS段寄存器MOVDS:[BP],DL;使用跨段前缀MOVBUF,DS;BUF是个字变量MOVES,BUF302.数据交换指令XCHG语句格式:XCHGOPD,OPS功能:将源地址与目的地址中的内容互换。即(OPD)→OPS,(OPS)→OPD。【例2.9】寄存器与存储器之间数据交换。MOVAX,5678H;(AX)=5678HMOVBX,0FFFFH;(BX)=0FFFFHXCHGAX,BX;(AX)=0FFFFH,(BX)=5678H313.查表转换指令XLAT语句格式:XLATOPS或XLAT功能:将(BX)为首址,(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。322.3.2堆栈操作指令1.进栈指令PUSH2.出栈指令POP331.进栈指令PUSH语句格式:PUSHOPS功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。即:①(SP)-1→SP(OPS)15~8→[SP]②(SP)-1→SP(OPS)7~0→[SP]342.出栈指令POP语句格式:POPOPD功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。从POP指令功能可看出,该指令为PUSH指令的逆过程。即:①([SP])→(OPD)7~0(SP)+1→SP②([SP])→(OPD)15~8(SP)+1→SP352.3.3标志寄存器传送指令1.标志送AH指令LAHF2.AH送标志指令SAHF3.标志寄存器进栈指令PUSHF4.标志寄存器出栈指令POPF361.标志送AH指令LAHF语句格式:LAHF功能:将标志寄存器的低8位送入AH寄存器。即(FLAGS)7-0→AH。该指令的执行对标志位无影响。【例】标志寄存器传送。执行前:(FLAGS)=0485H,(AX)=0FFFFH执行指令:LAHF执行后:(FLAGS)=0485H,(AX)=085FFH372.AH送标志指令SAHF语句格式:SAHF功能:将AH的内容送入标志寄存器的低8位,高8位不变。即(AH)→FLAGS7-0。从该指令功能可看出,SAHF为LAHF的逆过程。383.标志寄存器进栈指令PUSHF语句格式:PUSHF功能:将标志寄存器的内容压入堆栈。即(FLAGS)→↓(SP)。394.标志寄存器出栈指令POPF功能:将栈顶内容弹出送入标志寄存器中。即↑(SP)→FLAGS。POPF指令与PUSHF指令互为逆过程。【例】将标志寄存器的单步标志TF置位。PUSHF;(FLSGS)→↓(SP)POPAX;(SP)→AXORAX,0100H;设置D