【教学课件】第二章80x86汇编语言程序设计.ppt
1,第二章 80 x86汇编语言程序设计,2,第一节 80 x86的寻址方式,指令格式:操作码-应包含操作类型和操作数类型;操作数-可以是数据或用地址表示。说明操作数类型(8/16/32位、有/无符号等)可在操作码或操作数字段中表示(Intel为后者),存放操作数字段数据的部件:寄存器、存储器、I/O接口,指令和堆栈。说明-寄存器、存储器、I/O接口均独立编址,分别构成从0编址的寄存器空间、存储器空间、I/O空间;指令中,堆栈不用地址表示,通过操作码表示。,寻址方式:产生操作数或其有效地址的方法。,3,80 x86的寻址方式:,说明:与比例有关的寻址方式在80386及以后CPU中才出现;I/O空间和存储器的对应寻址方式表示形式不同。,4,存储器的有效地址(EA)与物理地址(PA):有效地址基于段的地址(段内偏移地址);EA=基址+(变址*比例因子)+位移量 物理地址基于存储器空间的地址。实地址模式的PA=段地址10H+EA 保护模式的PA=段地址的映像及变换+EA,回9页,5,存储器有效地址生成的相关约定:,存储器物理地址生成中的相关约定:a.访存操作选择默认段寄存器规则 取指操作和相对IP寻址的访存操作代码段CS,堆栈操作和用ESP/EBP为基址的访存操作堆栈段SS,串处理指令的目的串的访存操作附加数据段ES,除堆栈和串处理的除目的串外的访存操作数据段DS。,回下页,回9页,回13页,6,b.指令中访问非默认段数据方法段超越 可使用段超越前缀方式指明所访问数据所在的段。段超越前缀种类:CS:、DS:、SS:、ES:、FS:、GS:。,段超越示例:MOV AX,10H;DS段10H处的一个字的数据;赋给AX寄存器 MOV AX,ES:10H;ES段10H处的一个字的数据;赋给AX寄存器,不允许使用段超越前缀的情况:(1)串处理指令的目的串必须用ES段;(2)压栈/出栈指令的目的/源段必须用SS段;(3)与程序中指令有关的操作必须用CS段。,转上页,7,1、立即寻址 操作数存放在指令中(以常量形式)。,示例:MOV AH,-40;0C0H(-40)AH MOV AX,5060H;50HAH,60HAL MOV EAX,12345678H;12345678HEAX 说明:80 x86的操作数类型在地址码中表示,应用:适合于对常数的操作。,8,2、寄存器寻址 操作数存放在指令所指定寄存器号的寄存器中。,示例:MOV AH,BL;(BL)AH MOV DS,AX;(AX)DS MOV SI,AX;(AX)SI MOV ECX,EDX;(EDX)ECX,错误示例:MOV CS,AX;CS不能为MOV目的寄存器 MOV IP,BX;IP不能做MOV目的寄存器 MOV AX,CL;目的与源REG类型(位数)不同 MOV BH,DX;目的与源REG类型(位数)不同,应用:适合于对频繁使用的数据的操作。,9,3、直接寻址 存储器操作数的有效地址直接存放在指令中,即:EA=指令地址码字段内容。,示例1:MOV AL,100H 若(DS)=3000H,,则PA=3000H*10H+100H=30100H(AL)=11H,示例2:MOV BL,ES:100H 若(DS)=3000H,(ES)=2000H,则PA=2000H*10H+100H=20100H。,示例3:MOV AL,BUF或MOV AL,BUF表示将从BUF开始的内容送AL,BUF以预先定义地址。说明:汇编语言允许用符号(变量或标号)地址代替数值地址。,转4页,转5页,10,4、寄存器间接寻址 存储器操作数的有效地址存放在指令所指定寄存器中,即:EA=(寄存器)。,寄存器的使用限制,11,示例1:MOV AL,BX;PA=(DS)*10H+(BX)MOV AX,CS:SI;PA=(CS)*10H+(SI)MOV ECX,EDX;PA=(EDS)*10H+(EDX)MOV AH,BP;PA=(SS)*10H+(BP),示例2:MOV AH,BP MOV BX,SI 设(SS)=100H,(DS)=200H,(BP)=0B0H,(SI)=2AH,则第一条指令PA=(SS)*10H+(BP)=1000H+0B0H=10B0H;第二条指令PA=(DS)*10H+(SI)=2000H+2AH=202AH。,应用:适合于对复杂数据结构的数据元素寻址。,12,5、寄存器相对寻址(基址寻址或变址寻址)操作数的有效地址为相对于指令所指定寄存器中地址的偏移地址,即:EA=(寄存器)+位移量。寄存器的使用限制与寄存器间接寻址方式相同。,示例1:MOV AX,300HSI(或MOV AX,SI+300H)若(DS)=3000H,(SI)=2000H 则PA=(DS)*10H+(SI)+300H=32300H,示例2:MOV AX,BUFSI(或MOV AX,SI+BUF)若BUF=300H,则与上例一致。说明:汇编语言允许定义数据变量,所在存储器位置称为符号地址,与指令的地址标号不同(所用段寄存器不同)。,应用:适合于动态再定位和对数组元素的访问。,13,6、基址变址寻址 操作数的有效地址由指令所指定的基址REG与变址REG的内容相加而成,即:EA=(基址REG)+(变址REG)。寄存器的使用限制,转5页,示例:MOV AX,BXDI(亦可表示为 MOV AX,BX+DI)若(DS)=2000H,(BX)=1000H,(DI)=100H 则物理地址=(DS)*10H+(BX)+(DI)=21100H,应用:适合于对多维数组等复杂结构元素的访问。,14,7、基址变址相对寻址 操作数的有效地址为相对于指令所指定的基址REG与变址REG的内容相加的地址的偏移地址,即:EA=(基址REG)+(变址REG)+位移量。寄存器的使用限制 与基址变址寻址方式相同。,示例:MOV AX,34HBXDI(亦可表示为 MOV AX,34HBX+DI)若(DS)=2000H,(BX)=1000H,(DI)=100H 则PA=(DS)*10H+(BX)+(DI)+34H=21134H,应用:适合于对多维数组等复杂结构元素的访问。,15,8、比例变址寻址 操作数的有效地址为相对于指令所指定的变址REG内容和比例因子相乘的地址的偏移地址,即:EA=(变址REG)*比例因子+位移量。寄存器的使用限制 与基址变址寻址方式中变址REG限制相同。,示例:MOV AX,200HESI*8 若(DS)=2000H,(ESI)=4 则PA=(DS)*10H+(ESI)*4+200H=20220H,应用:适合于对结构数组等复杂结构元素的访问。,16,9、基址比例变址寻址 操作数的有效地址为指令所指定的变址REG内容和比例因子相乘后与基址REG内容相加的地址,即:EA=(基址REG)+(变址REG)*比例因子。寄存器的使用限制 与基址变址寻址方式相同。,示例:MOV AX,EBX+ESI*8,应用:适合于对结构数组等复杂结构元素的访问。,17,10、相对基址比例变址寻址 操作数的有效地址为相对于指令所指定的变址REG内容和比例因子相乘后与基址REG内容相加的偏移地址,即:EA=(基址REG)+(变址REG)*比例因子+位移量。寄存器的使用限制 与基址变址寻址方式相同。,示例:MOV AX,200HEBX+ESI*8,应用:适合于对矩阵、结构数组等复杂结构元素的访问。,18,各种寻址方式比较,注:(X)X的内容;SR段REG;A位移量;B基址REG I变址REG;S比例因子;LA线性地址 采用32位寄存器时,B、I基本可为任意通用寄存器,19,第二节 80 x86的指令系统,指令系统概况:指令系统指令i,1iN;指令格式 格式定义:前缀操作码操作数,操作数 操作数类型:整数(长度/符号)、浮点数、指针、位域数、串数据、SIMD数据、BCD/压缩BCD数据 特性:定长/变长、寻址方式种类及其表示,指令表示形式:二进制格式通过二进制编码串描述具体指令;汇编语言格式通过助记符形式描述具体指令。,20,80 x86指令的汇编语言一般格式:标号:指令助记符目的操作数,源操作数;注释 说明-标号又称地址标号,表示指令的地址(符号地址)80 x86目的操作数在前,源操作数在后 操作数可用立即数、地址码形式表示,80 x86指令系统指令类型:数据传送类指令 控制转移类指令 算术运算类指令 串操作类指令 逻辑运算与移位类指令 处理器控制类指令,21,一、数据传送类指令 包含通用数据传送、地址传送、标志传送、输入输出、类型转换5种子类型的指令。,1、通用数据传送指令 MOV(move)传送 MOVSX(move with sigh-extend)带符号扩展传送 MOVZX(move with zero-extend)带零扩展传送 PUSH(push onto the stack)进栈 POP(pop from the stack)出栈 PUSHA/PUSHAD(push all registers)所有寄存器进栈 POPA/POPAD(pop all registers)所有寄存器出栈 XCHG(exchange)交换 XLAT(translate)换码(查表)MOVSX、MOVSZ、PUSHA/PUSHAD、POPA/POPAD非8086指令,22,(1)MOV 传送指令 格式:MOV DST,SRC 操作:DST(SRC)即把源操作数的内容送入目的操作数 说明:1)SRC、DST操作数允许类型见下图 2)SRC、DST数据类型应相同 3)可进行8/16/32位数据传送,由操作数类型确定 4)该指令不影响任何状态标志位,回24页,回25页,回段REG指定,23,MOV指令例1:MOV AL,BL;寄存器间传送(数据长度一致)MOV BP,SI,MOV EAX,EBX+ECX*4;存储器寄存器(数据长度 MOV AX,ARRAYSI;由REG决定),MOV AX,0B00H;立即数寄存器(数据长度 MOV CL,10000000B;由REG决定),MOV VALUE,100H;立即数存储器(数据长度 MOV ES:BX,4BH;由VALUE决定),MOV BX,CX;寄存器存储器 MOV BUFFBPDI,AX,MOV指令例2:MOV AX,1000HSI 设(DS)=3000H,(SI)=2000H,则PA=33000H,(AX)=340BH,24,注意事项:(理解P22示意图)两个操作数长度必须一致 MOV AL,BX;不合法,数据类型不一致 MOV AX,0B4H;合法,执行后(AX)=0FFB4H;源为立即数,长度小于目的寄存器;位数时,高位按符号位方式扩展 MOV AX,100H;合法,存储器操作数长度由寄存器 MOV SI,AL;操作数长度决定 MOV DI,1234H;DI所指存储单元未定义为字类;型时不合法,可通过寄存器中转 MOV BYTE PTRSI,40;合法,将类型通知汇编程序,转22页,25,不允许两个操作数均是存储器操作数 MOV X,Y;不合法 可通过寄存器中转传送:MOV AX,Y MOV X,AX,不允许两个操作数均为段寄存器 不允许用立即数为段寄存器赋值,不允许CS、立即数做目的操作数 MOV CS,AX;不合法 MOV 100H,AX;不合法,不允许IP做操作数,表示目的存储器操作数数据类型的方法:MOV BYTE PTRSI,40;指定数据类型 MOV VALUE,40;通过伪指令定义变量类型,转22页,26,(2)MOVSX/MOVZX 带符号/零扩展传送指令 格式:MOVSX DST,SRC MOVZX DST,SRC 操作:DST符号扩展(SRC)DST零扩展(SRC)即把源操作数的内容扩展后送入目的操作数 说明:1)SRC可为寄存器、存储器操作数,不可为立即数 2)DST只可为寄存器操作数 3)可进行8/16位数据传送,SRC位数应小于DST位数 4)该指令不影响任何状态标志位,27,MOVSX指令示例:MOVSX EAX,CL 设(CL)=0ABH,执行结果(EAX)=0FFFFFFABH;负号扩展 若(CL)=57H,执行结果(EAX)=000000057H;正号扩展,MOVZX指令示例:MOVZX EAX,DATA 设(DATA)=87ADH,执行结果(EAX)=000087ADH;零扩展,28,(3)PUSH 压栈指令 格式:PUSH SRC 16位操作:SP(SP)-2(SP)+1,(SP)(SRC)32位操作:ESP(ESP)-4(ESP)+3,(ESP)+2,(ESP)+1,(ESP)(SRC)说明:1)SRC可为寄存器、存储器操作数 8086后SRC可为立即数 2)SRC必须为16/32位,立即数SRC可自动扩展 3)该指令不影响任何状态标志位,29,示例2:PUSH AX 设(AX)=2135H,示例1:PUSH AX PUSH DATBXSI;注意寻址方式中REG PUSH 1234H PUSH 87654321H,30,(4)POP 出栈指令 格式:POP DST 16位操作:DST(SP)+1,(SP)SP(SP)+2 32位操作:DST(ESP)+3,(ESP)+2,(ESP)+1,(ESP)ESP(ESP)+4 说明:1)DST可为寄存器、存储器操作数 2)DST必须为16/32位 3)该指令不影响任何状态标志位,31,示例1:POP AX POP DATBXSI POP DX,示例2:POP AX,32,(5)PUSHA/PUSHAD 所有寄存器压栈指令 格式:PUSHA PUSHAD 16位操作:16位通用寄存器AX、CX、DX、BX、SP、BP、SI、DI的内容按顺序压栈 SP(SP)-16 32位操作:32位通用寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI的内容按顺序压栈 ESP(ESP)-32 说明:1)压栈时的SP和ESP的内容为指令执行前的内容 2)该指令不影响任何状态标志位,33,(6)POPA/POPAD 所有寄存器出栈指令 格式:POPA POPAD 16位操作:16位通用寄存器DI、SI、BP、SP、BX、DX、CX、AX的内容按顺序出栈 SP(SP)+16 32位操作:32位通用寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX、EAX的内容按顺序出栈 ESP(ESP)+32 说明:1)指令执行后SP或ESP的内容与栈中弹出的SP或ESP的内容无关 2)该指令不影响任何状态标志位,34,(7)XCHG 交换指令 格式:XCHG OPER1,OPER2 操作:(OPER1)(OPER2)说明:1)OPER1和OPER2可为寄存器、存储器操作数,但绝不允许为段寄存器,且不允许同时为存储器操作数 2)OPER1和OPER2数据长度必须相同 3)该指令不影响任何状态标志位,示例:XCHG EAX,EBX;寄存器间交换 XCHG BX,BP+DI;寄存器与存储器间交换 XCHG DS,EX;不合法 XCHG SI,DI;不合法,35,(8)XLAT 查表指令 格式:XLAT TABLE 或XLAT 操作:AL(BX)+(AL)或AL(EBX)+(AL)说明:1)操作前必须先将表首址(TABLE)送给BX,再将目标项与距表头的偏移量送给AL 2)该指令不影响任何状态标志位,示例:LEA BX,TABLE;表首址给BX MOV AL,4;偏移量给AL XLAT,36,2、地址传送指令 LEA(load effective address)有效地址送寄存器 LDS(load DS with pointer)地址指针送寄存器和DS LES(load ES with pointer)地址指针送寄存器和ES LFS(load FS with pointer)地址指针送寄存器和FS LGS(load GS with pointer)地址指针送寄存器和GS LSS(load SS with pointer)地址指针送寄存器和SS LFS、LGS、LSS非8086指令。,37,(1)LEA 取有效地址指令 格式:LEA DST,SRC 操作:DSTSRC的有效地址EA 说明:1)SRC必须是存储器操作数 2)DST必须是16位或32位通用寄存器 3)该指令不影响任何状态标志位,示例1:LEA SI,BX 设(DS)=2000H,(BX)=1234H 执行后,示例2:LEA DI,BUFF;将BUFF的有效;地址送DI,而;非将BUFF的值;送DI,38,(2)LDS 装载数据段地址指针指令 格式:LDS DST,SRC 操作:DST(SRC)或 DST(SRC+2,SRC)DS(SRC+2)DS(SRC+4)说明:1)SRC必须是存储器操作数 2)DST必须是16位或32位通用寄存器 3)该指令不影响任何状态标志位,LES、LFS、LGS、LSS指令:格式-同LDS,仅操作助记符不同 操作同LDS,仅目标段寄存器不同,39,LDS指令示例1:LDS DI,BX 设(DS)=2000H,(BX)=1000H,LDS指令示例2:LEA SI,BUFF(与LEA比较)LDS DI,BUFF 设(DS)=2000H,EABUFF=1000H,执行后(SI)=1000H(DI)=4140H,(DS)=4342H,40,3、标记传送指令 LAHF(load AH with flags)取标志到AH SAHF(store AH into flags)从AH存标志 PUSHF/PUSHFD(push the flags or eflags)标志进栈 POPF/POPFD(pop the flags or eflags)标志出栈 PUSHFD、POPFD非8086指令。,41,(2)SAHF 存FLAG标志寄存器指令 格式:SAHF 操作:FLAG70(AH)将AH的内容存到FLAG标志寄存器的低8位中。说明:该指令改变SF、ZF、AF、PF、CF标志。,(1)LAHF 取FLAG标志寄存器指令 格式:LAHF 操作:AH(FLAG)70 将FLAG标志寄存器的低8位送到AH中。说明:该指令不影响标志状态位。,42,(4)POPF/POPFD FLAG标志寄存器出栈指令 格式:POPF和POPFD 操作:FLAG(SP)+1,(SP)SP(SP)+2 和EFLAG(ESP)+3,(ESP)+2,(ESP)+1,(ESP)ESP(ESP)+4,(3)PUSHF/PUSHFD FLAG标志寄存器进栈指令 格式:PUSHF和PUSHFD 操作:SP(SP)-2(SP)+1,(SP)(FLAG)和ESP(ESP)-4(ESP)+3,(ESP)+2,(ESP)+1,(ESP)(EFLAG)AND 0FCFFFFH,43,4、输入输出指令 IN(input)从I/O接口空间读数据 OUT(output)向I/O接口空间写数据,I/O接口空间大小:16根地址线、每个地址对应1个8位空间;即64K个8位空间=32K个16位空间=16K个32位空间。I/O接口空间内数据的传输方式:支持8位、16位、32位数据传输;16位和32位传输时,地址需按整数边界对齐。8086不支持32位数据传输。,44,I/O空间的寻址方式:只支持直接寻址、(寄存器)间接寻址两种。,说明 直接寻址只支持8位的地址(高8位为0);(寄存器)间接寻址只能使用DX寄存器(16位);寻址方式格式与存储器操作数的格式不同。,回下页,回46页,回I/O接口技术,45,(1)IN 从I/O接口输入数据指令 格式:IN AL,n IN AX,n 直接寻址,n是地址常量 IN EAX,n IN AL,DX IN AX,DX(寄存器)间接寻址 IN EAX,DX 操作:AL(n)或(DX)AX(n+1,n)或(DX)+1,(DX)EAX(n+3,n)或(DX)+3,(DX)说明:目的操作数只能是AL/AX/EAX寄存器;源操作数要求参见寻址方式说明(上页);读入数据长度取决于目的寄存器的位数。,转上页,46,(2)OUT 向I/O接口输出数据指令 格式:OUT n,AL OUT n,AX 直接寻址,n是地址常量 OUT n,EAX OUT DX,AL OUT DX,AX(寄存器)间接寻址 OUT DX,EAX 操作:n或(DX)(AL)(n+1,n)或(DX)+1,(DX)(AX)(n+3,n)或(DX)+3,(DX)(EAX)说明:源操作数只能是AL/AX/EAX寄存器;目的操作数要求参见寻址方式说明;写出数据长度取决于源寄存器的位数。,转44页,47,IN指令示例:IN AL,20H;从20H端口读入字节数据AL IN AX,48H;从48H端口读入字数据AX MOV DX,3FCH IN EAX,DX;从03FCH端口读入双字数据EAX,OUT指令示例:OUT 32H,AX;传送字数据到32H端口 MOV DX,400H MOV AL,86H OUT DX,AL;传送字节数据到DX指定的端口 OUT DX,86H;不合法,立即数可扩展(8/16?),48,5、类型转换指令 CBW(convert byte to word)字节转换为字 CWD/CWDE(convert word to double word)字转换为双字 CDQ(convert double to quad)双字转换为4字 BSWAP(byte swap)字节交换 CWDE、CDQ、BSWAP非8086指令。,(1)CBW 字节转换为字指令 格式:CBW 操作:扩展AL中符号位至AH中,将8位数扩展成等效的16位数。,49,(2)CWD/CWDE 字转换为双字指令 格式:CWD 操作:扩展AX中符号位至DX中,形成等效的32位数。格式:CWDE 操作:扩展AX中符号位至EAX中,形成等效的32位数。说明:用于有符号数相除前,形成双倍长度被除数。,(3)CDQ 双字转换为4字指令 格式:CDQ 操作:扩展EAX中符号位至EDX中,形成EDX:EAX形式的4字数据。,50,数据传送指令小结1、数据传送指令不影响标志位(除SAHF、POPF)2、除XCHG指令外,都是从源到目的的单向传送3、注意MOV指令与LEA指令的区别 MOV传送的是地址对应的内容,LEA传送的是EA,4、80286后才允许PUSH指令使用立即数寻址方式5、与存储器操作数有关的寄存器问题 MEM操作数的寻址方式中只能用基址、变址寄存器6、段寄存器问题 只能在MOV、PUSH、POP等指令中作为操作数出现,CS寄存器比其他段寄存器有更多限制。,7、最常用指令:MOV、IN/OUT、LEA、PUSH/POP、XCHG、CBW,51,二、算术运算类指令 包含加法、减法、乘法、除法、十进制调整运算5种子类型指令。,算术运算指令可对4种类型操作数运算:无符号二进数 有符号二进数 非压缩十进数 一个字节存放一位十进数的BCD码,高4位为零。压缩十进数 一个字节存放两位十进数的BCD码。,52,0、算术运算中的相关标志及处理(1)8086标志寄存器FLAG的标志位,回下页,回103页,53,(2)算术运算与FLAG中标志位的关系 FLAG标志位的补充说明:CF的含义是无符号数运算的溢出标志(CF=Cn);ZF表示运算结果是否为零(含最高位),即无符号数运算结果是否为零。,转上页,回下页,54,加法运算及FLAG标志位关系例题:,汇编语言程序员编程时的处理方法:对有/无符号数-手工用补码/原码表示;对溢出问题无符号运算时应关心CF,有符号运算时应关心OF。,转上页,55,1、加法指令 有ADD、ADC、INC、XADD四种,XADD非8086指令。,(1)ADD 加法指令 格式:ADD DST,SRC 操作:DST(DST)+(SRC)说明:1)DST、SRC操作数允许类型见下图(5种组合)2)可进行无符号和有符号的8位或16位运算 3)两个操作数类型应一致 4)运算结果对CF、SF、OF、PF、ZF、AF均有影响,56,ADD指令示例1:ADD DX,BX 设(DX)=4652H,(BX)=0F0F0H,57,ADD指令示例2:ADD WORD PTRBX,8F76H 设(DS)=2000H,(BX)=1000H,58,(2)ADC 带进位加法指令 格式:ADC DST,SRC 操作:DST(DST)+(SRC)+(CF)说明:所有限制与ADD指令相同。,ADC指令示例:-双字加法 设目的操作数在DX(高位字)和AX、源操作数在BX(高位字)和CX中,(DX)=0418H,(AX)=0F365H,(BX)=1005H,(CX)=0E024H,指令序列为:ADD AX,CX;低位字相加 ADC DX,BX;高位字相加,ADD指令结果:(AX)=0D389H,CF=1ADC指令结果:(DX)=141EH,59,(3)INC 加1指令 格式:INC DST 操作:DST(DST)+1 说明:1)DST只可为(通用)寄存器、存储器操作数 2)运算结果影响SF、OF、PF、ZF、AF,不影响CF,示例1:INC SI INC WORD PTRBX INC CL,示例2:(左右两边结果相同)LEA BX,ARRAY;MOV BX,0 MOV AL,BX;MOV AL,ARRAYBX;INC BX;INC BX,60,2、减法指令 有SUB、SBB、DEC、NEG、CMP、CMPXCHG、CMPXCHG8B 7种,CMPXCHG、CMPXCHG8B非8086指令。,(1)SUB 减法指令 格式:SUB DST,SRC 操作:DST(DST)-(SRC)说明:所有限制与ADD指令相同。,SUB指令示例:SUB BX,CX 设(BX)=9543H,(CX)=28A7H 执行后:(BX)=6C9CH 标志位 CF=0、OF=1、ZF=0、SF=0,61,(2)SBB 带借位减法指令 格式:SBB DST,SRC 操作:DST(DST)-(SRC)-(CF)说明:所有限制与ADC指令相同。,(3)DEC 减1指令 格式:DEC DST 操作:DST(DST)-1 说明:所有限制与INC指令相同。,(4)NEG 取补指令 格式:NEG DST 操作:DST-(DST),或DST0-(DST)说明:所有限制与SUB指令相同。,62,(5)CMP 比较指令 格式:CMP OPRD1,OPRD2 操作:(OPRD1)-(OPRD2),结果不送给任何操作数 说明:1)该指令无目的操作数,即不改变任何操作数值;2)所有限制和对标志位的影响均与SUB指令相同;3)该指令仅改变FLAG标志位,常用作转移条件。,应用:比较两数是否相等,根据ZF判断 若ZF=1,则两数相等;否则不等,比较两数大小时,需区分是有/无符号数比较 无符号数若CF=0,则DSTSRC;否则DSTSRC 有符号数若SF=OF,则DSTSRC;否则DSTSRC(通过DST和SRC的枚举可证明),回78页,63,3、乘法指令,(1)MUL 无符号乘法指令 格式:MUL SRC 操作:字节相乘 AX(AL)(SRC)BYTE 单字相乘 DX:AX(AX)(SRC)WORD 说明:1)SRC可为通用寄存器和存储器操作数,目的操作数只能为AX或DX:AX;2)结果仅影响FLAG的CF和OF。字节或字相乘后(AH)0或(DX)0,则CF=OF=1;否则,CF=OF=0,(2)IMUL 带符号乘法指令 格式:IMUL SRC 操作和说明:与MUL指令相同。,64,MUL和IMUL指令示例:MUL BL 设(AL)=0B4H=180(BL)=11H=17,(AX)=0BF4H=3060,IMUL BL 设(AL)=0B4H=-76(BL)=11H=17-76补=4CH,(AX)=(-050C)补=FAF4H=-1292,65,4、除法指令,(1)DIV 无符号除法指令 格式:DIV SRC 操作:字节除法 AL(商)、AH(余数)(AX)(SRC)BYTE 字除法 AX(商)、DX(余数)(DX)(AX)(SRC)WORD 说明:1)SRC可为通用寄存器和存储器操作数,目的操作数只能为AX或DX:AX;2)结果仅影响FLAG的OF。当商大于商寄存器最大范围时,OF=1;否则OF=0,(2)IDIV 带符号除法指令 格式:IDIV SRC 操作和说明:与DIV指令相同。,66,算术运算指令综合例题:计算(V-(X*Y+Z)/X,其中X,Y,Z,V均为16位有符号数,要求商存入AX,余数存入DX MOV AX,X IMUL Y;DX:AXX*Y MOV CX,AX MOV BX,DX;积存于BX:CX MOV AX,Z CWD;Z扩展DX:AX ADD CX,AX;X*Y+Z ADC BX,DX MOV AX,V CWD;V扩展DX:AX SUB AX,CX;相减 SBB DX,BX IDIV X;除以X,67,5、十进制调整指令 目的:将用二进制ALU运算的十进制数的结果调整为十进制数。种类:对非压缩BCD码有:AAA、AAS、AAM、AAD指令;对压缩BCD码有:DAA、DAS指令。,(1)AAA 非压缩BCD码加调整指令 格式:AAA 操作:对两个非压缩BCD码数相加的结果进行调整。说明:1)隐含的源、目的操作数分别是AL和AX;2)该指令仅对AF和CF标志有影响;3)该指令一般紧跟在ADD指令之后。,68,AAA指令调整算法:如果(AL&0FH)9 或(AF)=1/和10或和16 则 AL(AL)+6 AH(AH)+1/非压缩BCD码进位到AH中 AF1/表示个位和有进位 AL(AL)&0FH/整理成非压缩BCD码 CF(AF),AAA指令示例:MOV AL,9H MOV BL,4H ADD AL,BL;和=0DH AAA;调整后(AH)=01H,(AL)=03H,CF=AF=1,思考:为何调整时用AH(AH)+1,而非AH1?,69,(2)AAS 非压缩BCD码减调整指令 格式:AAS 操作:对两个非压缩BCD码数相减的结果进行调整。说明:1)隐含的源、目的操作数分别是AL和AX;2)该指令仅对AF和CF标志有影响;3)该指令一般紧跟在SUB指令之后。,AAS指令调整算法:如果(AL&0FH)9或(AF)=1 则 AL(AL)-6 AH(AH)-1 AF1 AL(AL)&0FH CF(AF),AAS指令示例:MOV AX,0206H MOV BL,07H SUB AL,BL;(AL)=FFH AAS;调整后(AH)=01H,;(AL)=09H,CF=AF=1,70,(3)AAM 非压缩BCD码乘调整指令 格式:AAM 操作:对两个非压缩BCD码数相乘的结果进行调整。说明:1)隐含的源、目的操作数分别是AL和AX;2)该指令仅对SF、ZF和PF标志有影响;3)该指令一般紧跟在MUL指令之后。,AAM指令调整算法:将AL除以0AH,商放到AH中,余数放到AL中;根据调整后的AL设置SF、ZF、PF。,71,(4)AAD 非压缩BCD码除调整指令 格式:AAD 操作:将非压缩BCD码数调整为二进制数。说明:1)隐含的源、目的操作数均是AX;2)该指令仅对SF、ZF和PF标志有影响;3)该指令应放在DIV指令之前。,AAD指令调整算法:AL10AH+AL AH0 根据调整后的AL设置SF、ZF、PF,应用:可用于将非压缩BCD码数转换成二进制数。,72,(5)DAA 压缩BCD码加调整指令 格式:DAA 操作:对两个压缩BCD码数相加的结果进行调整。说明:1)隐含的源、目的操作数均是AL;2)该指令对AF、CF、PF、SF和ZF标志有影响;3)该指令一般紧跟在ADD指令之后。,DAA指令调整算法:如果(AL&0FH)9 或(AF)=1/个位和10或个位和16 则 AL(AL)+6 AF1/表示个位和有进位 如果 AL9FH 或(CF)=1/十位和10或十位和16 则 AL(AL)+60H/第一版教材P69有错误!CF1/表示十位和有进位,73,(6)DAS 压缩BCD码减调整指令 格式:DAS 操作:对两个压缩BCD码数相减的结果进行调整。说明:1)隐含的源、目的操作数均是AL;2)该指令对AF、CF、PF、SF和ZF标志有影响;3)该指令一般紧跟在SUB指令之后。,DAS指令调整算法:如果(AL&0FH)9 或(AF)=1/个位差9FH 或(CF)=1/十位差0或有借位 则 AL(AL)-60H CF1/表示十位差有借位,74,DAA、DAS指令示例:AC处是4位压缩BCD码数,计算A-B+C,存入C,MOV AL,A SUB AL,B;计算A-B的低两位 DAS;调整低两位差(36H,CF=1)MOV CL,AL MOV AL,A+1 SBB AL,B+1;计算A-B的高两位 DAS;调整高两位差(10H,CF=0)MOV CH,AL,MOV AL,C ADD AL,CL;计算(A-B)的低两位与C的低两位的和 DAA;调整底两位和(00H,CF=1)MOV C,AL MOV AL,C+1 ADC AL,CH;计算(A-B)的高两位与C的高两位的和 DAA;调整高两位和(13H,CF=0)MOV C+1,AL,75,三、逻辑运算和移位类指令,1、逻辑运算类指令 有逻辑非、逻辑与、逻辑或、逻辑异或、测试指令。,示例:MOV AL,52H;0101 0010 NOT AL;执行后 1010 1101,76,(2)AND/OR/XOR 逻辑与/或/异或指令 格式:AND DST,SRC OR DST,SRC XOR DST,SRC 操作:DST(DST)&(SRC)&-表示按位“与”运算 DST(DST)|(SRC)|-表示按位“或”运算 DST(DST)(SRC)-表示按位“异或”运算 说明:1)DST、SRC可为通用寄存器、存储器操作数,SRC还可为立即数操作数,DST和SRC不可同时为存储器操作数;2)DST、SRC数据类型必须一致,立即数可向上扩展;3)可进行8位或16位运算,根据DST数据类型决定;4)该指令影响PF、SF、ZF标志位,置CF=0、OF=0。,77,AND/OR/XOR指令示例:MOV AL,32H AND AL,OFH;屏蔽某些位,或忽略高位 AND AX,AX;值不变,使CF=0 OR AL,30H;置位某些位,或高位加某个值 XOR AL,00H;值不变,使CF=0 XOR AL,0FH;部分位按位取反 XOR AL,AL;值置为0,并清除所有所有标志位,思考:如何实现对某些位的置位和复位?使寄存器值为零有哪些方法?哪种方案最好?如何清除某些标志位?,78,(3)TEST 测试指令 格式:TEST OPRD1,OPRD2 操作:(OPRD1)&(OPRD2),结果不送给任何操作数 说明:1)该指令无目的操作数,即不改变任何操作数值;2)所有限制和对标志位的影响均与AND指令相同;3)该指令仅改变FLAG标志位,常用作转移条件。,转62页,TEST指令示例:IN AL,42H TEST AL,O1H;测试bit0是否为1 JNZ SEND;bit0=1(ZF1)时转SEND处执行,思考:TEST指令与CMP指令作为转移条件的应用范围有何不同?,79,2、逻辑移位类指令(1)指令种类 移位指令:SHL逻辑左移 SHR逻辑右移 SAL算术左移 SAR算术右移 循环移位指令:ROL循环左移 ROR循环右移 RCL带进位循环左移 RCR带进位循环右移,80,(2)指令功能 移位指令:,循环移位指令:,81,(3)指令格式 格式:OP DST,CNT 操作:对DST,按OP的移动规则移动CNT指定位数 说明:1)DST可为寄存器、存储器操作数;2)CNT可为立即数(为1时)、寄存器(只能为CL)操作数,8086以后机型,CNT为立即数时值域为131;3)可进行8/16/32位移位操作,由DST位数决定,DST为存储器操作数时,由定义的数据类型决定;4)循环移位指令结果仅影响CF和OF标志位