1、进入夏天,少不了一个热字当头,电扇空调陆续登场,每逢此时,总会进入夏天,少不了一个热字当头,电扇空调陆续登场,每逢此时,总会想起那一把蒲扇。蒲扇,是记忆中的农村,夏季经常用的一件物品。记想起那一把蒲扇。蒲扇,是记忆中的农村,夏季经常用的一件物品。记忆中的故乡,每逢进入夏天,集市上最常见的便是蒲扇、凉席,不论男女老忆中的故乡,每逢进入夏天,集市上最常见的便是蒲扇、凉席,不论男女老少,个个手持一把,忽闪忽闪个不停,嘴里叨叨着少,个个手持一把,忽闪忽闪个不停,嘴里叨叨着“怎么这么热怎么这么热”,于是三,于是三五成群,聚在大树下,或站着,或随即坐在石头上,手持那把扇子,边唠嗑五成群,聚在大树下,或站着
2、,或随即坐在石头上,手持那把扇子,边唠嗑边乘凉。孩子们却在周围跑跑跳跳,热得满头大汗,不时听到边乘凉。孩子们却在周围跑跑跳跳,热得满头大汗,不时听到“强子,别跑强子,别跑了,快来我给你扇扇了,快来我给你扇扇”。孩子们才不听这一套,跑个没完,直到累气喘吁吁,。孩子们才不听这一套,跑个没完,直到累气喘吁吁,这才一跑一踮地围过了,这时母亲总是,好似生气的样子,边扇边训,这才一跑一踮地围过了,这时母亲总是,好似生气的样子,边扇边训,“你你看热的,跑什么?看热的,跑什么?”此时这把蒲扇,是那么凉快,那么的温馨幸福,有母亲此时这把蒲扇,是那么凉快,那么的温馨幸福,有母亲的味道!蒲扇是中国传统工艺品,在我国
3、已有三千年多年的历史。取材的味道!蒲扇是中国传统工艺品,在我国已有三千年多年的历史。取材于棕榈树,制作简单,方便携带,且蒲扇的表面光滑,因而,古人常会在上于棕榈树,制作简单,方便携带,且蒲扇的表面光滑,因而,古人常会在上面作画。古有棕扇、葵扇、蒲扇、蕉扇诸名,实即今日的蒲扇,江浙称之为面作画。古有棕扇、葵扇、蒲扇、蕉扇诸名,实即今日的蒲扇,江浙称之为芭蕉扇。六七十年代,人们最常用的就是这种,似圆非圆,轻巧又便宜的蒲芭蕉扇。六七十年代,人们最常用的就是这种,似圆非圆,轻巧又便宜的蒲扇。蒲扇流传至今,我的记忆中,它跨越了半个世纪,也走过了我们的扇。蒲扇流传至今,我的记忆中,它跨越了半个世纪,也走过
4、了我们的半个人生的轨迹,携带着特有的念想,一年年,一天天,流向长长的时间隧半个人生的轨迹,携带着特有的念想,一年年,一天天,流向长长的时间隧道,袅道,袅第第5章章 微机微机CPU的指令系统的指令系统5.1 汇编语言指令格式汇编语言指令格式5.1.1 指令格式指令格式 汇编语言的指令格式如下:指令助忆符 操作数1,操作数2,操作数3(*);注释 指令助忆符体现该指令的功能,它对应一条二进制编码的机器指令。一条指令可以没有操作数,也可以有一个、二个或三个操作数。绝大多数指令的操作数要显式的写出来,但也有指令的操作数是隐含的。当指令含有操作数,并要求在指令中显式地写出来时,则在书写时必须遵守:u指令
5、助忆符和操作数之间要有分隔符,分隔符可以是若干个空格或TAB键;u如果指令含有多个操作数,那么,操作数之间要用逗号“,”分开。u指令后面还可以书写注释内容,不过,要在注释之前书写分号“;”。(*)操作数1为第一操作数,操作数2(如有的话)为第二操作数,其后以此类推。第第5章章 微机微机CPU的指令系统的指令系统3.交换指令XCHG(Exchange Instruction)交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同。XCHG Reg/Mem,Reg/Mem 该指令的功能和MOV指令不同,后者是一个操作数的内容被修改,而前者是两个操作数都会发生改
6、变。寄存器不能是段寄存器,两个操作数也不能同时为内存变量。例5.2 已知:AX=5678H,BX=1234H,指令XCHG AX,BX执行后,求各寄存器的值。第第5章章 微机微机CPU的指令系统的指令系统4.取有效地址指令LEA(Load Effective Address)指令LEA是把一个内存变量的有效地址送给指定的寄存器。其指令格式如下:LEA Reg,Mem 该指令通常用来对指针或变址寄存器BX、DI或SI等置初值之用。BUFFER DB 100 DUP(?)LEASI,BUFFER;把字节变量BUFFER在数据段内的偏移量送给SILEABX,BX+DI+200;把有效地址BX+DI+
7、200送给BX问题:指令“LEA BX,BUFFER”和“MOV BX,OFFSET BUFFER”的执行效果是一样的吗?指令“LEA BX,BX+200”和“MOV BX,OFFSET BX+200”二者都正确吗?第第5章章 微机微机CPU的指令系统的指令系统4.取段寄存器指令(Load Segment Instruction)该组指令的功能是把内存单元的一个“低字”传送给指令中指定的16位寄存器,把随后的一个“高字”传给相应的段寄存器(DS、ES、FS、GS和SS)。LDS/LES/LFS/LGS/LSS Reg,Mem 指令LDS(Load Data Segment Register)和
8、LES(Load Extra Segment Register)在8086CPU中就存在,而LFS和LGS(Load Extra Segment Register)、LSS(Load Stack Segment Register)是80386及其以后CPU中才有的指令。若Reg是16位寄存器,那么,Mem必须是32位指针;若Reg是32位寄存器,那么,Mem必须是48位指针,其低32位给指令中指定的寄存器,高16位给指令符中的段寄存器。第第5章章 微机微机CPU的指令系统的指令系统例如:PT1 DD 12345678HPT2 DF 43219012ABCDHLES BX,PT1LDS ESI,
9、PT2 执行上述二条指令后,各寄存器的内容分别为:(BX)=5678H,(ES)=1234H,(ESI)=9012ABCDH,(DS)=4321H。第第5章章 微机微机CPU的指令系统的指令系统5、进栈操作1).PUSH(Push Word or Doubleword onto Stack)指令格式:PUSH Reg/Mem PUSH Imm;80286+一个字进栈,系统自动完成两步操作:SPSP-2,(SP)操作数;一个双字进栈,系统自动完成两步操作:ESPESP-4,(ESP)操作数。2).PUSHA(Push All General Registers)指令格式:PUSHA;80286+
10、其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。3).PUSHAD(Push All 32-bit General Registers)指令格式:PUSHAD;80386+其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。第第5章章 微机微机CPU的指令系统的指令系统6、出栈操作1).POP(Pop Word or Doubleword off Stack)指令格式:POP Reg/Mem 弹出一个字,系统自动完成两步操作:操作数(SP),SPSP+2;弹出一个双字,系统自动完成两步操作:操作数(ESP),ESPESP+4。2).P
11、OPA(Pop All General Registers)指令格式:POPA;80286+其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。其实,程序员不用记住它们的具体顺序,只要与指令PUSHA对称使用就可以了。3).POPAD(Pop All 32-bit General Registers)指令格式:POPAD;80386+其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出栈,它与PUSHAD对称使用即可。第第5章章 微机微机CPU的指令系统的指令系统7、转换指令XLAT(Translate Instruction)转换指
12、令有两个隐含操作数BX和AL。指令格式如下:XLAT/XLATB 其功能是把BX的值作为内存字节数组首地址、下标为AL的数组元素的值传送给AL。其功能描述的表达式是:ALBXAL。第第5章章 微机微机CPU的指令系统的指令系统5.2.2 标志位操作指令标志位操作指令1、进位CF操作指令l清进位指令CLC(Clear Carry Flag):CF0l置进位指令STC(Set Carry Flag):CF1l进位取反指令CMC(Complement Carry Flag):CFnot CF2、方向位DF操作指令n清方向位指令CLD(Clear Direction Flag):DF0n置方向位指令S
13、TD(Set Direction Flag):DF13、中断允许位IF操作指令u清中断允许位指令CLI(Clear Interrupt Flag):IF0 其功能是不允许可屏蔽的外部中断来中断其后程序段的执行。u置中断允许位指令STI(Set Interrupt Flag):IF1 其功能是恢复可屏蔽的外部中断的中断响应功能,通常是与CLI成对使用的。第第5章章 微机微机CPU的指令系统的指令系统4、取标志位操作指令uLAHF(Load AH from Flags):AHFlags的低8位uSAHF(Store AH in Flags):Flags的低8位AH5、标志位堆栈操作指令uPUSHF
14、/PUSHFD(Push Flags onto Stack):把16位/32位标志寄存器进栈;uPOPF/POPFD(Pop Flags off Stack):把16位/32位标志寄存器出栈;第第5章章 微机微机CPU的指令系统的指令系统1.加法指令u加法指令ADD(ADD Binary Numbers Instruction)指令格式:ADD Reg/Mem,Reg/Mem/Imm 指令的功能是把源操作数的值加到目的操作数中。u带进位加指令ADC(ADD With Carry Instruction)指令格式:ADC Reg/Mem,Reg/Mem/Imm 指令的功能是把源操作数和进位标志位
15、CF的值(0/1)一起加到目的操作数中。u加1指令INC(Increment by 1 Instruction)指令格式:INC Reg/Mem 指令的功能是把操作数的值加1(不影响CF)。u交换加指令XADD(Exchange and Add)指令格式:XADD Reg/Mem,Reg;80486+指令的功能是先交换两个操作数的值,再进行算术“加”法操作。5.2.3 算术运算指令算术运算指令第第5章章 微机微机CPU的指令系统的指令系统例5.3 已知有二个32位数d1和d2(用类型DD说明),编写程序片段把d2的值加到d1中。解:32位数d1和d2在内存中如下所示。方法1:用16位寄存器编写
16、程序MOV AX,word ptr d1;由于d1是双字类型,必须使用强制类型说明符。MOV DX,word ptr d1+2;(DX,AX)构成一个32位数据ADD AX,word ptr d2;低字相加ADC DX,word ptr d2+2;高字相加。在低字相加时,有可能会产生“进位”MOV word ptr d1,AX;低字送给d1的低字MOV word ptr d1+2,DX;高字送给d1的高字d1 低字高字 d2第第5章章 微机微机CPU的指令系统的指令系统方法2:用32位寄存器编写程序MOV EAX,d1ADD EAX,d2MOV d1,EAX 从上面两段程序不难看出:用32位寄
17、存器来处理32位数据显得简单、明了,而16位微机虽然也能处理32位数据,但做起来就要复杂一些。d1 低字高字 d2第第5章章 微机微机CPU的指令系统的指令系统2.减法指令u减法指令SUB(Subtract Binary Values Instruction)指令格式:SUB Reg/Mem,Reg/Mem/Imm 指令的功能是从目的操作数中减去源操作数。u带借位减SBB(Subtract with Borrow Instruction)指令格式:SBB Reg/Mem,Reg/Mem/Imm 指令的功能是把源操作数和标志位CF的值从目的操作数中一起减去。u减1指令DEC(Decrement
18、by 1 Instruction)指令格式:DEC Reg/Mem 指令的功能是把操作数的值减去1(不影响CF)。u求补指令NEG(Negate Instruction)指令格式:NEG Reg/Mem 指令的功能:操作数0操作数,即改变操作数的正负号。第第5章章 微机微机CPU的指令系统的指令系统例5.4 已知有二个32位数d1和d2,编写程序片段从d1中减去d2的值。解:方法1:用16位寄存器编写程序MOV AX,word ptr d1;取低字MOV DX,word ptr d1+2;取高字,(DX,AX)构成一个32位数据SUB AX,word ptr d2;低字相减SBB DX,wor
19、d ptr d2+2;高字相减。在低字相减时,有可能会产生“借位”MOV word ptr d1,AX;低字送给d1的低字MOV word ptr d1+2,DX;高字送给d1的高字d1 低字高字 d2第第5章章 微机微机CPU的指令系统的指令系统方法2:用32位寄存器编写程序MOV EAX,d1SUB EAX,d2MOV d1,EAXd1 低字高字 d2第第5章章 微机微机CPU的指令系统的指令系统3.乘法指令 乘法指令分为无符号乘法和有符号乘法指令,它们的唯一区别就在于:数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。乘法指令的被乘数大多数是隐含的,乘数在指令中显式地写出来
20、。CPU会根据乘数是8位、16位,还是32位操作数,来自动选用被乘数:AL、AX或EAX。u无符号数乘法指令MUL(Unsigned Multiply Instruction)指令格式:MUL Reg/Mem 受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按下表的对应关系存放。乘数位数隐含的被乘数乘积的存放位置举例8位ALAXMUL BL16位AXDX-AXMUL BX32位EAXEDX-EAXMUL ECX第第5章章 微机微机CPU的指令系统的指令系统u有符号数乘法指令IMUL(Signed Integer M
21、ultiply Instruction)指令格式:1)、IMUL Reg/Mem 2)、IMUL Reg,Imm;80286+3)、IMUL Reg1,Reg2/Mem,Imm;80286+4)、IMUL Reg1,Reg2/Mem;80386+1)、指令格式1该指令的功能是把显式操作数和隐含操作数(都作为有符号数)相乘,所得的乘积按表5.2的对应关系存放。2)、指令格式2其寄存器必须是16位/32位通用寄存器,其计算方式为:Reg Reg Imm4)、指令格式4其寄存器必须是16位/32位通用寄存器,其计算方式为:Reg1 Reg1Reg2 或 Reg1 Reg1Mem3)、指令格式3其寄存
22、器只能是16位通用寄存器,其计算方式为:Reg1 Reg2Imm 或 Reg1 MemImm 在指令格式24中,各操作数的位数要一致。如果乘积超过目标寄存器所能存储的范围,则系统将置溢出标志OF为1。第第5章章 微机微机CPU的指令系统的指令系统4.除法指令 除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。u无符号数除法指令DIV(Unsigned Divide
23、Instruction)指令格式:DIV Reg/Mem 指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按表5.3的对应关系存放。指令对标志位的影响无定义。除数位数隐含的被除数商余 数举 例8位AXALAHDIV BH16位DX-AXAXDXDIV BX32位EDX-EAXEAXEDXDIV ECX第第5章章 微机微机CPU的指令系统的指令系统5.有符号数除法指令IDIV(Signed Integer Divide Instruction)指令格式:IDIV Reg/Mem 指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系。6.类型转换指
24、令(Type Conversion Instruction)系统提供了四条数据类型转换指令:CBW、CWD、CWDE和CDQ。指令的执行不影响任何标志位。u字节转换为字指令CBW(Convent Byte to Word)指令格式:CBW 该指令的隐含操作数为AH和AL。其功能是用AL的符号位去填充AH,即:当AL为正数,则AH=0,否则,AH=0FFH。u字转换为双字指令CWD(Convent Word to Doubleword)指令格式:CWD 该指令的隐含操作数为DX和AX,其功能是用AX的符号位去填充DX。第第5章章 微机微机CPU的指令系统的指令系统u字转换为扩展的双字指令CWDE
25、(Convent Word to Extended Doubleword)指令格式:CWDE;80386+该指令的隐含操作数为AX和EAX,其功能是用AX的符号位填充EAX的高位。u双字转换为四字指令CDQ(Convent Doubleword to Quadword)指令格式:CDQ;80386+该指令的隐含操作数为EDX和EAX,指令的功能是用EAX的符号位填充EDX。例5.5:编写一程序段计算下面公式,并把所得的商和余数分别存入X和Y中。(C-120+A*B)/C其中:A,B,C,X和Y都是有符号的字变量。解:A DW?B DW?C DW?X DW?Y DW?MOV AX,CSUB AX
26、,120D;书写指令“ADD AX,-120D”也可以CWDMOV CX,DXMOV BX,AX;(CX,BX)(DX,AX),为作乘法准备必要的寄存器MOV AX,AIMUL B;(DX,AX)A*BADD AX,BX;计算32位二进制之和,为作除法作准备ADC DX,CXIDIV C;AX是商,DX是余数MOV X,AX;分别保存商和余数到指定的字变量单元里MOV Y,DX第第5章章 微机微机CPU的指令系统的指令系统5.2.4 逻辑运算指令逻辑运算指令 逻辑运算指令是一组重要的指令,它包括:与、或、非和异或等指令。u逻辑与操作指令AND(Logical AND Instruction)指
27、令格式:AND Reg/Mem,Reg/Mem/Imm 指令的功能是把源操作数中的每个二进制位与目的操作数中的相应二进制进行逻辑“与操作”,操作的结果再置回到目标操作数中。例5.6:已知(BH)=67H,要求把其的第0、1和5位置为0。解:可以构造一个立即数,其第0、1和5位的值为0,其它位的值为1,该立即数即为:0DCH或11011100B,然后用指令AND来实现此功能。第第5章章 微机微机CPU的指令系统的指令系统u逻辑或操作指令OR(Logical OR Instruction)指令格式:OR Reg/Mem,Reg/Mem/Imm 指令的功能是把源操作数中的每个二进制位与目的操作数中的
28、相应二进制进行逻辑“或操作”,操作的结果再置回到目标操作数中。例5.7:已知(BL)=46H,要求把其的第1、3、4和6位置为1。解:构造一个立即数,使其第1、3、4和6位的值为1,其它位的值为0,该立即数即为:5AH或01011010B,然后用指令OR来实现此功能。第第5章章 微机微机CPU的指令系统的指令系统u逻辑非操作指令NOT(Logical NOT Instruction)指令格式:NOT Reg/Mem 其功能是把操作数中的每位变反,指令的执行不影响任何标志位。例5.8:已知(AL)=46H,执行指令“NOT AL”后,AL的值是什么?解:执行该指令后,(AL)=0B9H。第第5章
29、章 微机微机CPU的指令系统的指令系统u逻辑异或操作指令XOR(Exclusive OR Instruction)指令格式:XOR Reg/Mem,Reg/Mem/Imm 指令的功能是把源操作数中的每个二进制位与目的操作数中的相应二进制进行逻辑“异或操作”,操作的结果再置回到目标操作数中。例5.9:已知(AH)=46H,要求把其的第0、2、5和7位的二进制值变反。解:构造一个立即数,使其第0、2、5和7位的值为1,其它位的值为0,该立即数即为:0A5H或10100101B,然后再用指令XOR来实现此功能。第第5章章 微机微机CPU的指令系统的指令系统5.2.5 移位操作指令移位操作指令 移位操
30、作指令包括算术移位、逻辑移位、循环移位、双精度移位和带进位的循环移位等五大类。移位指令都有指定移动二进制位数的操作数,该操作数可以是立即数或CL的值。在8086中,该立即数只能为1,但在其后的CPU中,该立即数可以是131之内的数。第第5章章 微机微机CPU的指令系统的指令系统u算术移位指令 指令有:算术左移SAL(Shift Algebraic Left)和算术右移SAR(Shift Algebraic Right)。它们的指令格式如下:SAL/SAR Reg/Mem,CL/Imm 算术左移SAL把目的操作数的低位向高位移,空出的低位补0;算术右移SAR把目的操作数的高位向低位移,空出的高位
31、用最高位填补。第第5章章 微机微机CPU的指令系统的指令系统例5.10:已知(AH)=12H,(BL)=0A9H,试给出分别用算术左移和右移指令移动1位后,寄存器AH和BL的内容。解:用算术左移和右移指令移动1位后,寄存器AH和BL的结果如下表所示。操作数的初值执行的指令执行后操作数的内容(AH)=12HSAL AH,1(AH)=24H(BL)=0A9HSAL BL,1(BL)=52H(AH)=12HSAR AH,1(AH)=09H(BL)=0A9HSAR BL,1(BL)=0D4H思考题:下面有两组指令序列,问每组指令执行后,寄存器AX的不会变化吗?SAL AX,1或SAR AX,1SAR
32、AX,1SAL AX,1第第5章章 微机微机CPU的指令系统的指令系统u逻辑移位指令 此组指令有:逻辑左移SHL(Shift Logical Left)和逻辑右移SHR(Shift Logical Right)。SHL/SHR Reg/Mem,CL/Imm 逻辑左移/右移指令只有它们的移位方向不同,移位后空出的位都补0。操作数的初值执行的指令执行后操作数的内容(AH)=12HSHL AH,1(AH)=24H(BL)=0A9HSHL BL,1(BL)=52H(AH)=12HSHR AH,1(AH)=09H(BL)=0A9HSHR BL,1(BL)=54H第第5章章 微机微机CPU的指令系统的指令
33、系统例5.11:已知(AH)=12H,(BL)=0A9H,试给出分别用逻辑左移和右移指令移动1位后,寄存器AH和BL的内容。解:用算术左移和右移指令移动1位后,寄存器AH和BL的结果如下表所示。第第5章章 微机微机CPU的指令系统的指令系统u双精度移位指令 此组指令有:双精度左移SHLD(Shift Left Double)和双精度右移SHRD(Shift Right Double)。它们都是具有三个操作数的指令:SHLD/SHRD Reg/Mem,Reg,CL/Imm;80386+其中:第一操作数是一个16位/32位的寄存器或存储单元;第二操作数(与前者具有相同位数)一定是寄存器;第三操作数
34、是移动的位数,它可由CL或一个立即数来确定。在执行SHLD指令时,第一操作数向左移n位,其“空出”的低位由第二操作数的高n位来填补,但第二操作数自己不移动、不改变。在执行SHRD指令时,第一操作数向右移n位,其“空出”的高位由第二操作数的低n位来填补,但第二操作数自己也不移动、不改变。第第5章章 微机微机CPU的指令系统的指令系统u循环移位指令 指令有:循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right)。ROL/ROR Reg/Mem,CL/Imm 循环左移/右移指令只有移位的方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。第第5章章 微机微机CP
35、U的指令系统的指令系统 下面是几个循环移位的例子及其执行结果。循环移位指令指令操作数的初值指令执行后的结果ROL AX,1(AX)=6789H(AX)=0CF12HROL AX,3(AX)=6789H(AX)=3C4BHROR AX,2(AX)=6789H(AX)=59E2HROR AX,4(AX)=6789H(AX)=9678H第第5章章 微机微机CPU的指令系统的指令系统u带进位的循环移位指令 带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。RCL/RCR Reg/Mem,CL/Imm
36、 带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。第第5章章 微机微机CPU的指令系统的指令系统 下面是几个带进位循环移位的例子及其执行结果。双精度移动指令指令操作数的初值指令执行后的结果RCL AX,1CF=0,(AX)=0ABCDH(AX)=579AHRCL AX,1CF=1,(AX)=0ABCDH(AX)=579BHRCR AX,2CF=0,(AX)=0ABCDH(AX)=AAF3HRCR AX,2CF=1,(AX)=0ABCDH(AX)=EAF3H例5.12:编写指令序列把由DX和AX组成的32位二进制算术左移、循环左移1位。解:(DX
37、,AX)算术左移1位指令序列(DX,AX)循环左移1位指令序列SHL AX,1SHLD DX,AX,1RCL DX,1RCL AX,1第第5章章 微机微机CPU的指令系统的指令系统5.2.6 位操作指令位操作指令1.位扫描指令(Bit Scan Instruction)BSF/BSR Reg,Reg/Mem;80386+第一操作数不能是段寄存器和8位寄存器,第二操作数的类型与前者相同。位扫描指令是在第二个操作数中找第一个“1”的位置。如果找到,则该“1”的位置保存在第一操作数中,并置标志位ZF为1,否则,置标志位ZF为0。根据位扫描的方向不同,指令分二种:正向扫描指令和逆向扫描指令。u正向扫描
38、指令BSF(Bit Scan Forward)从右向左扫描,从低位向高位扫描u逆向扫描指令BSR(Bit Scan Reverse)从左向右扫描,从高位向低位扫描第第5章章 微机微机CPU的指令系统的指令系统2.位检测指令(Bit Test Instruction)BT/BTC/BTR/BTS Reg/Mem,Reg/Imm;80386+指令中的操作数不能是段寄存器和8位寄存器。位检测指令是把第一个操作数中某一位的值传送给标志位CF,具体的哪一位由指令的第二操作数来确定,若第二操作数的值超过第一操作数的位数,那么,该指令不作任何操作。根据指令中对具体位的处理不同,又分一下几种指令:uBT:把指
39、定的位传送给CFuBTC:把指定的位传送给CF后,还使该位变反uBTR:把指定的位传送给CF后,还使该位变为0uBTS:把指定的位传送给CF后,还使该位变为1第第5章章 微机微机CPU的指令系统的指令系统例如:假设(AX)=1234H,分别执行下面指令。BT AX,2;指令执行后,CF=1,(AX)=1234hBTC AX,6;指令执行后,CF=0,(AX)=1274hBTR AX,10;指令执行后,CF=0,(AX)=1234hBTS AX,14;指令执行后,CF=0,(AX)=5234h第第5章章 微机微机CPU的指令系统的指令系统3.检测位指令TEST(Test Bits Instruc
40、tion)检测位指令是把二个操作数进行逻辑“与”操作,并根据运算结果设置相应的标志位,但并不保存该运算结果,所以,不会改变指令中的操作数。在该指令后,通常用JE、JNE、JZ和JNZ等条件转移指令。TEST Reg/Mem,Reg/Mem/Imm例如:TEST AX,1;测试AX的第0位TEST CL,10101B;测试CL的第0、2、4位第第5章章 微机微机CPU的指令系统的指令系统5.2.7 比较运算指令比较运算指令 在程序中,我们要时经常根据某个变量或表达式的取值去执行不同指令,从而使程序表现出有不同的功能。为了配合这样的操作,在CPU的指令系统中提供了各种不同的比较指令。通过这些比较指
41、令的执行来改变有关标志位,为进行条件转移提供依据。1.比较指令CMP(Compare Instruction)CMP Reg/Mem,Reg/Mem/Imm 指令的功能:用第二个操作数去减第一个操作数,并根据所得的差设置有关标志位,为随后的条件转移指令提供条件。但并不保存该差,所以,不会改变指令中的操作数。第第5章章 微机微机CPU的指令系统的指令系统2.比较交换指令(Compare And Exchange Instruction)前面介绍了交换指令XCHG,不管二个操作数的值是什么,都无条件地进行交换。而比较交换指令,是先进行比较,再根据比较的结果决定是否进行操作数的交换操作。比较交换指令
42、的功能:当二个操作数相等时,置标志位ZF为1;否则,把第一操作数的值赋给第二操作数,并置标志位ZF为0。u8位/16位/32位比较交换指令CMPXCHG Reg/Mem,AL/AX/EAX;80486+u64位比较交换指令 该指令只有一个操作数,第二个操作数EDX:EAX是隐含的。CMPXCHG8B Reg/Mem;Pentium+3.字符串比较指令(Compare String Instruction)参见后面第5.2.11节字符串操作类指令中的叙述。第第5章章 微机微机CPU的指令系统的指令系统5.2.8 循环指令循环指令 循环结构是程序的三大结构之一。汇编语言提供了多种循环指令,这些循环
43、指令的循环次数都是保存在计数器CX或ECX中。除了CX或ECX可以决定循环是否结束外,有的循环指令还可由标志位ZF来决定是否结束循环。汇编语言中,CX或ECX只能递减,所以,循环计数器只能从大到小。在程序中,必须先把循环次数赋给循环计数器。汇编语言的循环指令放在循环体的下面。循环时,首先执行一次循环体,然后把循环计数器CX或ECX减1。当循环终止条件达到满足时,该循环指令下面的指令将是下一条被执行的指令,否则,程序向上转到循环体的第一条指令。在循环未终止,而向上转移时,规定:该转移只能是一个短转移,即偏移量不能超过128,也就是说循环体中所有指令码的字节数之和不能超过128。如果循环体过大,可
44、以用后面介绍的“转移指令”来构造循环结构。循环指令本身的执行不影响任何标志位。第第5章章 微机微机CPU的指令系统的指令系统1.循环指令(Loop Until Complete)循环指令LOOP的一般格式:LOOP 标号LOOPW 标号;CX作为循环计数器,80386+LOOPD 标号;ECX作为循环计数器,80386+循环指令的功能如下图所示,其文字描述如下:u(CX)=(CX)-1或(ECX)=(ECX)-1;u如果(CX)0或(ECX)0,转向“标号”所指向的指令,否则,终止循环,执行该指令下面的指令。第第5章章 微机微机CPU的指令系统的指令系统例5.13:编写一段程序,求1+2+10
45、00之和,并把结果存入AX中。解:方法1:因为计数器CX只能递减,可把求和式子改变为:1000+999+2+1。XORAX,AXMOVCX,1000Dagain:ADDAX,CX;计算过程:1000+999+2+1LOOPagain方法2:不用循环计数器进行累加,求和式子仍为:1+2+999+1000。XORAX,AXMOVCX,1000DMOVBX,1again:ADDAX,BX;计算过程:1+2+999+1000INCBXLOOPagain从程序段的效果来看:方法1要比方法2好。第第5章章 微机微机CPU的指令系统的指令系统2.相等或为零循环指令(Loop While Equal or L
46、oop While Zero)相等或为零循环指令的一般格式:LOOPE/LOOPZ 标号LOOPEW/LOOPZW 标号;CX作为循环计数器,80386+LOOPED/LOOPZD 标号;ECX作为循环计数器,80386+这是一组有条件循环指令,它们除了要受CX或ECX的影响外,还要受标志位ZF的影响。其具体规定如下:u(CX)(CX)-1或(ECX)(ECX)-1;(不改变任何标志位)u如果循环计数器0且ZF=1,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。第第5章章 微机微机CPU的指令系统的指令系统 指令LOOPE/LOOPZ所组成的循环功能如下图所示,指令LOO
47、PEW/LOOPZW、LOOPED/LOOPZD与之功能相一致,所不同就在于循环寄存器是CX,还是ECX。图5.13 LOOPE的功能示意图 图5.14 LOOPNE的功能示意图第第5章章 微机微机CPU的指令系统的指令系统3.不等或不为零循环指令(Loop While Not Equal or Loop While Not Zero)不等或不为零循环指令的一般格式:LOOPNE/LOOPNZ 标号LOOPNEW/LOOPNZW 标号;CX作为循环计数器,80386+LOOPNED/LOOPNZD 标号;ECX作为循环计数器,80386+这也是一组有条件循环指令,它们与相等或为零循环指令在循环
48、结束条件上有点不同。其具体规定如下:u(CX)(CX)-1或(ECX)(ECX)-1;(不改变任何标志位)u如果循环计数器0且ZF=0,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。第第5章章 微机微机CPU的指令系统的指令系统4.循环计数器为零转指令(Jump if CX/ECX is Zero)在前面的各类循环指令中,不管循环计数器的初值为何,循环体至少会被执行一次。当循环计数器的初值为0时,通常的理解应是循环体被循环0次,即循环体一次也不被执行。其实不然,循环体不是不被执行,而是会被执行65536次(用CX计数)或4294967296次(几乎是死循环,用ECX计数)
49、。为了解决指令的执行和常规思维之间差异,指令系统又提供了一条与循环计数器有关的指令循环计数器为零转指令。该指令一般用于循环的开始处,其指令格式如下:JCXZ 标号;当(CX)=0时,则程序转移标号处执行。JECXZ 标号;当(ECX)=0时,则程序转移标号处执行。80386+第第5章章 微机微机CPU的指令系统的指令系统例5.14:编写一段程序,求1+2+k(K0)之和,并把结果存入AX中。解:KDW?;变量定义XORAX,AX;AX置初值0MOVCX,KJCXZnextagain:ADDAX,CX;计算过程:K+(K-1)+2+1LOOPagainnext:第第5章章 微机微机CPU的指令系
50、统的指令系统5.2.9 转移指令转移指令 转移指令是汇编语言程序员经常使用的一组指令。在高级语言中,时常有“尽量不要使用转移语句”的劝告,但如果在汇编语言的程序中也尽量不用转移语句,那么该程序要么无法编写,要么没有多少功能,所以,在汇编语言中,不但要使用转移指令,而且还要灵活运用。转移指令分无条件转移指令和有条件转移指令两大类。第第5章章 微机微机CPU的指令系统的指令系统1、无条件转移指令(Transfer Unconditionally)无条件转移指令:JMP、子程序的调用和返回指令、中断调用和返回指令等。无条件转移指令JMP(Unconditional Jump)的一般形式:JMP 标号