1、,微型计算机原理及接口技术,主讲:张媛 理论学时:64 实验学时:6 适用专业:通信工程 学分:4.5,第三章 8086的寻址方式和指令系统,3-1 8086的寻址方式 3-2 指令的机器码表示方法 3-3 8086的指令系统,3-1 8086的寻址方式,一、立即寻址方式例3-1 MOV AL,26H将一个8位立即数送到AL寄存器例3-2 MOV CX,2050H将一个16位立即数送到CX寄存器注:立即数只能作源操作数以AF打头的数字出现在指令中时,前面要加0,以免与其他符号相混,二、寄存器寻址方式例3-3 MOV DX,AX将寄存器AX的内容拷贝到寄存器DX中例3-4 MOV CL,AH意义
2、同上 三、直接寻址方式 1.直接寻址方式例3-5 MOV AX,2000H有效地址EA:2000H 默认段寄存器:DS 操作数物理地址=10HDS+EA,例3-6 MOV AL,2000H意义同上 2.段超越前缀例3-7 MOV AX,ES:500H源操作数物理地址=16ES+500H3.符号地址例3-8 MOV AX,AREA1AERA1:有效地址,也可表示立即数,程序中用伪指令来加以说明,例3-9 AERA1 EQU 0867H 等值伪指令MOV AX,AREA1例3-10 AREA1 DW 0867HMOV AX,AREA1此处AERA1为一个地址变量,其值为0867H 四、寄存器间接寻
3、址方式 指令中给出操作数的有效地址例3-11 MOV BX,SI当给出的有效地址在BX,SI或DI时,默认段地址存放在DS中,五、寄存器相对寻址方式 操作数的有效地址为一个基址或变址寄存器的内容与一个8位或16位位移量之和 例3-12 MOV BX,COUNTSI与寄存器间接寻址类似,主要区别在于这种方式的有效地址还要加上一个偏移量COUNT。故操作数的物理地址=16DS+SI+COUNT这种寻址方式也允许使用段超越前缀,如MOV DH,ES:ARRAYSI,六、基址变址寻址方式 操作数的有效地址由一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和若基址寄存器为BX,则段寄存
4、器用DS若基址寄存器为BP,则段寄存器用SS例3-13 MOV AX,BXSI操作数的物理地址=16DS+BX+SI也可写作 MOV AX,BX+SI,八、其他 1.隐含寻址。指令中不指定操作数,但隐含规定的寻址方式 2.I/O端口寻址。直接端口寻址和间接端口寻址例3-15 IN AL,63H 直接端口寻址例3-16 MOV DX,213HIN AL,DX 间接端口寻址 3.一条指令有几种寻址方式例3-17 MOV BX,AL 4.转移类指令寻址,六、基址变址寻址方式 操作数的有效地址由一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和若基址寄存器为BX,则段寄存器用DS若基
5、址寄存器为BP,则段寄存器用SS例3-13 MOV AX,BXSI操作数的物理地址=16DS+BX+SI也可写作 MOV AX,BX+SI,3-2 指令的机器码表示方式,一、机器语言指令的编码目的和特点1 机器语言指令2 机器语言指令的编码特点为每种基本指令类型给出一个编码格式,对照格式填上数字表示不同的寻址方式、数据类型等,从而就能求出每条指令的机器码。二、机器语言指令代码的编制,八、其他 1.隐含寻址。指令中不指定操作数,但隐含规定的寻址方式 2.I/O端口寻址。直接端口寻址和间接端口寻址例3-15 IN AL,63H 直接端口寻址例3-16 MOV DX,213HIN AL,DX 间接端
6、口寻址 3.一条指令有几种寻址方式例3-17 MOV BX,AL 4.转移类指令寻址,3-3 8086的指令系统,一、数据传送指令 1.通用数据传送指令 MOV传送指令指令格式:MOV 目的,源指令功能:将源操作数送到目的操作数 注:IP寄存器不能作为源或目的操作数目的操作数不允许用立即数和CS寄存器除源操作数为立即数外,两个操作数必有一 个寄存器,但不能都是段寄存器,例3-24 MOV AL,B 传送字符的ASKII码例3-25 MOV AX,DATAMOV DS,AX DATA是一个段地址变量例3-26 MOV DX,OFFSET ARRAY将ARRAY的偏移地址送到DX寄存器例3-27
7、MOV AL,AREA1 将AREA1的内容送入ALMOV AREA2,AL 再将内容传送到AREA2中例3-28 MOV AX,TABLEBPDI将地址16SS+BP+DI+TABLE的字存储单元的内容送进AX,PUSH进栈指令指令格式:PUSH 源指令功能:将源操作数推入堆栈 POP出栈指令指令格式:POP 目的指令功能:将当前堆栈指针SP所指的字送入到指定的目的操作数中例3-29 设SS=2000H,SP=40H,BX=3120H,AX=25FEH,依次执行下列指令:PUSH BX ,PUSH AX ,POP BX 。堆栈中数据和SP变化如下图所示。,XCHG 交换指令指令格式:XCHG
8、 目的,源指令功能:将一个字或字节的源操作数和目的 操作数相交换。交换一般在寄存器之间、寄存器和存储器之间进行。例3-30 设AX=2000H, DS=3000H, BX=1800H, (31A00H)=1995H,执行:XCHG AX,BX+200H 表转换指令指令格式:XLAT 转换表指令功能:将字节从一种代码转换成另一种代码。,例3-31 求数字5的七段码值,2.输入输出指令 IN输入指令指令格式:IN AL,端口地址 (AL可以是AX)IN AL,DX (端口地址放在DX中)指令功能:从8位(或16位)端口读入一个字节(或字)到AL(或AX)寄存器。其中当端口地址号大于FFH时,必须用
9、第二种方式。例3-32 以下是几个具体例子IN AL,0F1H IN AX,80HMOV DX,310H IN AL,DX,例3-33 符号地址变量存储端口号ATOD EQU 54HIN AL,ATOD OUT输出指令指令格式:OUT 端口地址,AL (AL可以是AX)OUT DX,AL (端口地址放在DX中)指令功能:将AL(或AX)寄存器一个字节(或字)写入8位(或16位)端口。例3-34 下面几个操作实例OUT 85H,AL MOV DX,0FF4H OUT DX,AX,3.地址目标传送指令 LEA取有效地址指令指令格式:LEA 目的,源指令功能:取源操作数地址偏移量,将其送入目的操作数
10、所在单元。例3-35设SI=1000H,DS=5000H,(51000H)=1234H执行LEA BX,SI后 BX=1000H注意区分 MOV BX,SI例3-36 以下两条指令等价LEA BX,TABLEMOV BX,OFFSET TABLE,例3-37 某数组含20个元素,每一元素占一个字节,序号019。设DI指向数组开头,求序号为6的元素的偏移地址:LEA BX,6DI 将双子指针送到寄存器和DS指令指令格式:LDS 目的,源指令功能:从源操作数指定的存储单元取出变量的4字节地址指针,送进一对目的寄存器。例3-38 设 DS=1200H,(12450H)=F346H,(12452H)=
11、0A90H执行 LDS SI,450H,LES将双字指针送到寄存器和ES指令指令格式:LES 目的,源指令功能:取源操作数地址偏移量,将其送入目的操作数所在单元(包括目的寄存器和ES)。例3-39 设DS=0100H,BX=0020H,(01020H)=0300H,(01022H)=0500H执行LES DI,BX后 DI=0300H ES=0500H 4.标志传送指令 LAHF标志送到AH指令 格式:LAHF SAHF送标志寄存器指令 格式:SAHF,PUSHF标志入栈指令 格式:PUSHF POPF标志出栈指令 格式:POPF 二、算术运算1.加法指令 ADD加法指令指令格式:ADD 目的
12、,源指令功能:目的源+目的 ADC加法指令指令格式:ADC 目的,源指令功能:目的源+目的+CF,例3-40 以下是一些实例ADD AL,18H ADC BL,CLADD AL,COSTBX(ADD COST BX,BL) 例3-41 试用加法指令对5EH和3CH求和,并分析加法运算执行后对标志位的影响。MOV AL,5EH MOV BL,3CHADD AL,BL标志位:ZF=0,AF=1,CF=0SF=1,PF=1,OF=1,INC增量指令指令格式:INC 目的指令功能:目的目的+1例3-42 INC BL BL寄存器内容增1INC CX CX寄存器内容增1例3-43INC BYTE PTR
13、BX内存字节单元内容增1,AAA加法的ASCII调整指令指令格式:AAA指令功能:执行加法指令后,结果存储在AL中。调整AL寄存器的内容为1位非压缩十进制数,结果仍然存在AL寄存器中若AL低4位9或半进位标志AF=1 则 1)ALAL+62)用与操作将AL高4位清03)AF置1,CF置1,AHAH+1否则,仅将AL寄存器的高4位清0,例3-44 设AL=BCD 9,BL=BCD 5,求两数之和。设AH=0,其运算如下,则结果为? ADD AL,BLAAA结果:AX=0104H 例3-45 求ASCII码数9(39H)和5(35H)之和,设AH=0MOV AL,39H MOV BL,35HADD
14、 AL,BLAAA 结果:AX=0104H,DAA加法的ASCII调整指令指令格式:AAA指令功能:执行两个压缩BCD数加法指令后,结果存储在AL中。调整AL寄存器的内容为正确的压缩BCD数。若AL低4位9或半进位标志AF=1 则 若ALAL+6,对低半字节进行调整若AL的高半字节9或CF=1则ALAL+60H,CF置1。否则CF置0,例3-46 设AL=BCD 38,BL=BCD 15,求两数之和。则结果为? ADD AL,BLDAA结果:AL=BCD 53,CF=0 例3-47 设AL=BCD 88,BL=BCD 49,求两数之和。则结果为? ADD AL,BLDAA结果:AL=BCD 3
15、7,CF=1,减法指令(Subtraction)(1)SUB减法指令指令格式:SUB 目的, 源指令功能:将目的操作数减去源操作数,结果送回目的操作数。即目的 目的 源 例3-48 SUB AX, BX ;AX AX BXSUB DX,1850H ;DX DX 1850HSUB BL BX ;BL中内容减去物理地址=DS:(BX)处的字节,结果存入BL。,减法指令(Subtraction)(2)SBB带借位的减法指令指令格式:SBB 目的, 源指令功能:与SUB类似,只是在两个操作数相减后,还要减去进位/借位标志CF的当前值。即 目的 目的 源 CF 例3-49 SBB AL, CL ;AL
16、AL CL CFSBB主要用于多字节减法中。,减法指令(Subtraction)(3)DEC减量指令指令格式:DEC 目的指令功能:对指定的目的操作数减1,结果送回此操作数。即目的 目的-1例3-50 DEC BXDEC WORD PTRBP,减法指令(Subtraction)(4)NEG取负指令指令格式:NEG 目的指令功能:对目的操作数减取负,结果送回目的操作数。即目的 0-目的例3-51 NEG AXNEG BYTE PTRBX,减法指令(Subtraction)(5)CMP比较指令指令格式:CMP 目的, 源指令功能:将目的操作数减去源操作数,但结果不回送到目的操作数中,仅将结果反映在
17、标志位上,接着可用条件跳转指令决定程序的去向。即目的 源例3-52 CMP AL, 80HCMP BX, DATA1 比较指令主要用在希望比较两个数的大小,而又不破坏原操作数的场合。,以上五种指令实际上都做减法运算,而且都可以进行字或字节的运算,对于SUB,SBB,CMP这类双操作数所指令,源操作数可以是寄存器,存储器或立即数,而且要求两个操作数不能同时为存储器。对于操作数指令,目的操作数可以是寄存器或存储器,但不能为立即数,如果是存储器操作数,还必须说明其类型是字节还是字。 例 3-53 设AL=1011 001B,DL=0100 1010B,若要求AL-DL,只要执行指令SUB AL,DL
18、,与加法操作那样,对结果的解释也取决于参与算数的性质。运算后标志位ZL=0,AF=1,CF=0,SF=0,PF=0,OF=1。,减法指令(Subtraction)(6)AAS减法的ASCII调整指令指令格式:AAS指令功能:在用SUB或SBB指令对两个非压缩十进制数或以ASCII码表示的十进制数进行相减后,对AL中所得结果进行调整,在AL中得到一个正确的非压缩十进制数之差。如果有错位,则CF置1。AAS指令必须紧跟在SUB或SBB指令之后。AAS指令执行时,调整过程为:若AL寄存器的低4位9或AF=1,则1.AL AL- 6,AF置12.将AL寄存器高4位清零3.AH AH - 1,CF置1
19、否则,不要调整。 例 3-54 设AL=BCD3,CL=BCD8, 求两数之差。显然结果为BCD5,但要向高位借位。运算过程如下:SUB AL,CLASS 结果为5,CF=1,表示有借位。,减法指令(Subtraction)(7)DAS减法的十进制调整指令指令格式:DAS指令功能:在两个压缩十进制数用SUB或SBB相减后,结果已存在AL中的情况下,对所得结果进行调整,在AL中得到正确的压缩十进制数。同样,它也要对AL中高半字节和低半字节分别进行调整。 DAS指令执行时,调整过程为:如果AL寄存器的低4位9或AF=1则AL AL-6,AF置1如果此时AL高半字节9或标志位CF=1则AL AL-6
20、0H,CF置1 例3-55 设AL=BCD56,CL=BCD98,求两数之差。SUB AL,CLDAS 运算结果为:AL=BCD58,CF=1,表示有借位。,乘法指令(Multiply)(1)MUL无符号数乘法指令指令格式:MUL 源指令功能:把源操作数和累加器中的数都当成无符号数,然后将两数相乘,源操作数可以是字节或字。如果源操作数是一个字节,则它与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送到AL。即AL AL * 源,乘法指令中,源操作数可以是寄存器,也可以使存储单元,但不能是立即数。当源操作数是存储单元时,必须在操作数前加B或W说明是字节还是字。例 3-56
21、 MUL DLMUL CXMUL BSIMUL WBX MUL指令执行后影响CF和OF标志,如果结果的高半部分不为零,表明其内容是结果的有效位,则CF和OF均置1。否则,CF和OF均清零。通过测试这两个标志,可检测并除去结果中的无效前导零。乘法指令使AF,PF,SF和ZF的状态不定。,例 3-57 设AL=55H,BL=14H,计算它们的积。只要执行下面这条指令:MUL BL结果,AX=06A4H。由于AH=06H不等于0,高位部分有效,所以CF=1,OF=1 例 3-58 试计算FFH*FFH。若把它们当成无符号数,相当于255*255=65025的运算,结果正确。若把它们看成带符号数,上面
22、的计算表示(-1)*(-1)=-511,显然结果不正确。 由此可见,如果用MUL指令作带符号的乘法,会得到错误的结果,所以必须用下面的介绍的IMUL指令,才能使(-1)*(-1)得到正确的结果 0000 0000 0000 0001,乘法指令(Multiply)(2)IMUL整数乘法指令指令格式:IMUL 源指令功能:把源操作数和累加器中的数都作为带符号数,进行相乘。存放结果的方式与MUL相同。如果源操作数为字节,则与AL相乘,双倍长结果送到AX中。如源操作数为字,则与AX相乘,双倍长结果送到DX和AX中,最后给乘积赋予正确的符号。,例 3-59 设AL=-28H,BL=59H,试计算它们的乘
23、积。IMUL BL结果,AX=F98CH=-1652,CF=1,OF=1 (3)AAM乘法的ASCII调整指令指令格式:AAM指令功能:对已存在AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,使得在AX中得到正确的非压缩十进制数的乘积,高位放在AH中,低位放在AL中。调整过程:把AL寄存器内容除以10,商放在AH中,余数放在AL中。即AH AL/10所得的商AL AL/10所得的余数 指令执行后,将影响ZF,SF和PF,但AF,CF和OF无定义。,例 3-60 求两个非压缩十进制数09和06之乘积,可用如下指令实现:MOV AL, 09HMOV BL, 06HMUL BLAAM 最后可
24、在AX中得到正确结果AX=0504H,即BCD数54。 如果AL和BL中分别存放9和6的ASCII码,求两数之积时要用以下指令实现:AND AL, OFHAND BL, OFHMUL BLAAM 如果将结果转换成ASCII码,可再用指令OR AX,3030H实现,使AX=3534H。乘法调整指令仅此一条。,除法指令(Division)(1)DIV无符号数除法指令指令格式:DIV 源指令功能:对两个无符号数进行除法操作。源操作数可以是字或字节。 如果源操作数为字节,16位被除数必须放在AX中,8位除数为源操作数,它可以是寄存器或存储单元。相除之后,8位商在AL中,余数在AH中。 如果被除数只有8
25、位,必须把它放在AL中,并将AH清零,然后相除。 如果源操作数为字,32位被除数在DX,AX中,其中,DX为高位字,16位除数做源操作数,它可以是寄存器或存储单元。相除之后,AX中存16位商,DX存16位余数。 要是被除数只有16位,除数也是16位,则必须将16位被除数送到AX中,再将DX寄存器清零,然后相除。,(2)IDIV整数除法指令指令格式: IDIV 源指令功能:该指令执行的操作与DIV相同,但操作数都必须是带符号数,商和余数也都是带符号数,而且规定余数的符号和被除数相同。 注意:除法指令字节操作时商为8位,字操作时商为16位。 例3-61 两个无符号数7A86H和04H相除的商应为1
26、EA1H,若用DIV指令进行计算,即MOV AX, 7A86HMOV BL, 04HDIV BL 这时,由于BL中的除数04H为字节,商1EA1H大于AL中能存放的最大无符号数FFH,结果将产生除法错误中断。 注意:对于带符号数除法指令,字节操作时要求被除数为16位,字节操作时要求被除数为32位,若被除数不满足此条件,适用下面的符号扩展指令。,(3)CBW把字节转换为字指令指令格式:CBW 指令功能:把寄存器AL中字节的符号位扩充到AH的所有位,这时AH被称为是AL的符号扩充。若AL中的D7=0,就将这个0扩展到AH中去,使AH=00H,即D7 D0 D7 D0AH 00 AL 0 AL=正数
27、 若AL中的D7 =1,则将这个1扩展到AH中去,使AH=FFH,即 D7 D0 D7 D0AH 11 AL 1 AL=正数 CBW指令执行后,不影响标志位。,(4)CWD把字转换成双字指令指令格式:CWD 指令功能:把AX中字的符号位扩充到DX寄存器的所有位中去。若AX的D15=0,则DX 000H,即D15 D0 D15 D0DX 00 AX 0 AX=正数 若AX中的D15 =1,则DX FFFFH,即D15 D0 D15 D0DX 11 AX 1 AX=负数 CWD指令执行后,也不影响标志位。,例3-62 编程求-38/3的商和余数MOV AL, 11011010BMOV CH, 00
28、000011BCBWIDIV CH (5)ADD除法的ASCII调整指令指令格式:AAD指令功能:在做除法前,把BCD码转换成二进制数。除法的ASCII调整指令在除法之前进行。 调整过程: AL AH*10+ALAH 00,例3-63 设AX中存有两个非压缩BCD数0307H,即十进制数的37,BL中存有一个非压缩BCD数05H,若要完成AX/BL的运算,可用以下指令:AAD DIV BL 结果: AL=7(商)AH=2(余数) 由于8086只提供了非压缩十进制数的乘除法调整指令,如果要进行压缩十进制数的乘除法运算,应先将操作数转换成非压缩十进制数,再按非压缩十进制数进行运算,分几步完成操作。
29、,例3-64 编写程序,计算756=123FIRST DB 06HSECOND DB 75HTHIRD DB 2 DUP(0)FOUR DB ? .MOV AH, 00HMOV AL, SECONDAND AL, 0F0HMOV CL, 04HROL AL, CLDIV FIRSTMOV THIRST+1, ALMOV AL, SECONDAND AL, 0FHAAD DIV FIRSTMOV THIRT, ALMOV FOUR, AH,下图表示上述除法程序执行过程中,数据在内存中的存放格式。,三 逻辑运算和移位指令逻辑运算和移位指令对字节或字进行按位操作,这类运算可分成逻辑运算,算术逻辑移位
30、和循环移位三类,见表3-7,逻辑运算指令 (1)NOT取反指令指令格式:NOT 目的指令功能:将目的操作数取反,结果送回目的操作数,即目的 目的目的操作数可以是8位或16位寄存器或存储器。对于存储器操作数,要说明其类型是字节还是字。执行指令后,对操作数没有影响。 例3-65 NOT指令的几种用法:NOT AX NOT BLNOT BYTE PTRBX,逻辑运算指令 (2)AND逻辑与指令指令格式:AND 目的, 源指令功能:对两个操作数进行按位逻辑与操作,结果送回目的操作数 ,即目的 目的源它主要用于使操作数的某些位保留(和“1”相与),而使某些位清除(和“0”相与) 例3-66 假设AX中存
31、有数字5和8的ASCII码,即AX=3538H,要将他们转换成BCD码,并把结果仍放回AX,可用如下指令实现:ADD AX,0F0FH 它将AH和阿AL中的高4位用全0屏蔽掉,截取低4位,最后在AX中得到5和8的BCD码0508H。,逻辑运算指令 (3)OR逻辑或指令指令格式:OR 目的, 源指令功能:对两个操作数进行按位逻辑或操作,结果送回目的操作数,即目的 目的源它主要用于使操作数的某些位保留(和“0”相或),而使某些位置1(和“1”相或)。 例3-67 假设AX中存有两个BCD数0508H,要将它们分别转换成ASCII码,结果仍在AX中,可用如下指令实现:OR AX,3030H,逻辑运算
32、指令 (4)XOR异或指令指令格式:XOR 目的, 源指令功能:对两个操作数进行按位逻辑异或运算,结果送回目的操作数,即目的 目的 源它主要用于使操作数的某些位保留(和“0”相异或),而使某些位取反(和“1”相异或)。 例3-68若AL中存有某外设端口的状态信息,其中D1位控制扬声器发声,要求该位在0,1之间来回变化,其余各位保留不变,可以用以下指令实现:XOR AL, 00000010B,逻辑运算指令 (5)TEST测试指令指令格式:TEST 目的, 源指令功能:对于两个操作数进行逻辑与操作,并修改标志位,但不回送结果,即指令执行后,两个操作数都不变。即目的源 例3-69 设AL寄存器存有报
33、警标志。若D7=1,表示温度报警,程序要转到温度报警程序T_ALARM;D6=1,则转压力警报程序P_ALARM。为此,可用如下方法适用TEST指令来实现这种功能:TEST AL, 80HJNZ T_ALARMTEST AL, 40HJNZ P_ALARM,算术逻辑移位指令可对寄存器或存储器中的字或字节进行算术移位或逻辑移位,移动的次数由指令中的计数值决定,图3-17是移位指令的操作示意图。,算术逻辑移位指令(1)SAL算术左移指令指令格式:SAL 目的, 计数值(2)SHL逻辑左移指令指令格式:SHL 目的, 计数值指令功能:以上两条指令的功能完全相同,均将寄存器或存储器中的目的操作数的各位
34、左移,每移一次,最低有效位LSB补0,最高有效位MSB进入标志位CF。移位次数为1的情况下,若符号位被改变,则OF置1,否则清0。不论移一次或多次,CF总是等于目的操作数最后被移出去的那一位的值。,例3-70MOV AH,06HSAL AH,1MOV CL,03HSHL DI,CLSAL BYTE PTRBX,1 内存单元字节左移1位(3)SHR逻辑右移指令指令格式:SHR 目的,计数值指令功能:对目的操作数中各位进行右移,每执行一次操作后,操作数右移一位,最低位进入CF,最高位补0。右移次数由计数值决定,同SAL/SHL指令一样。 若目的操作数为无符号数,每右移一次,使目的操作数除以2。用这
35、种方法做除法时,余数将被丢掉。,例3-71 用右移的方法作除法133/8=165,即MOV AL, 10000101B指令执行后,AL=10H=16,余数5被丢失。标志位CF=1,ZF=0,SF=0,PF=0,OF和AF不定。 (4)SAR算术右移指令指令格式:SAR 目的, 计数值指令功能:每位移一次,目的操作数各位右移一位,最低位进入CF,但最高位(即符号位)保持不变,而不是补0。每移一次,相当于对带符号数进行除2操作。 例3-72 用SAR指令计算-128/8=-16的程序段如下:MOV AL, 10000000BMOV CL, 03HSAR AL, CL,循环移位指令上述的算术逻辑移位
36、指令,移出操作数的数位均被丢失,而循环移位指令把操作数从一端移到操作数的另一端,这样从操作数中移走的位就不会丢失了。 循环移位指令共四条: (1)ROL循环左移指令指令格式:ROL 目的, 计数值 (2)ROR循环右移指令指令格式:ROR 目的, 计数值 (3)RCL通过进位位循环左移指令格式:RCL 目的, 计数值 (4)RCR通过进位位循环右移指令格式:RCR 目的, 计数值,循环移位指令的操作示意图如下:四条指令都按指令中计数值规定的移位次数进行循环移位,移位后的结果仍送回目的操作数。目的操作数可以使8/16位的寄存器或内存操作数,循环移位的次数可以是1,也可以由CL寄存器的值指定。,这
37、4条指令中,ROL和ROR指令没有把进位标志CF包含在循环中,而RCL和RCR指令把CF作为整个循环的一部分,一起参加循环移位。OF位只有在移位次数为1的时候才有效,在移位后当前最高有效位发生变化(由1变0或由0变1)时,则OF标志位置1,否则OF置0,在多位循环移位时,OF的值是不确定的,CF的值总是由最后一次被移出的值决定的。 例3-73ROL BX, CLROR WORD PTRSI,例3-74设CF=1,AL=1011 0100B若执行指令ROL AL,1,则AL=0110 1001B,CF=1,OF=1若执行指令ROR AL,1,则AL=0110 1001B,CF=0,OF=1若执行
38、指令RCR AL,1,则AL=0110 1001B,CF=0,OF=0若执行指令MOV CL,3和RCL AL,CL,Z则AL=1010 0110B,CF=1,OF不确定,四 字符串处理指令字符串处理指令包含以下隐含约定:1)源串位于当前数据段,由DS寻址,源串的元素由SI作指针,即源串字符的起始地址(或末地址)为DS:SI。源串允许使用段地址前缀来修改段地址。2)目的串必须位于当前附加段中,由ES寻址,目的串元素由DI作指针,但不允许使用段超越前缀修改ES。3)每执行一次字符串指令,指针SI和DI会自动进行修改。,四 字符串处理指令(续)4)DF标志控制字符串处理的方向。DF=0为递增方向,
39、DF=1为递减方向。可用标志操作指令STD和CLD来改变DF值,STD使DF置1,CLD将DF置1。5)要处理的字符串长度(字节或字数)放在CX寄存器中。为加快串运算指令,在基本指令前加重复前缀。REP 无条件重复REPE/REPZ 相等/结果为零则重复REPNE/REPNZ 不相等/结果非零则重复,MOVS字符串传送指令指令格式:MOVS 目的串,源串指令功能:把由SI作指针的源串中的一个字节或字,传送到由DI作指针的目的串中,且自动修改指针SI和DI。 例3-75 要求把数据段中以SRC_MESS为偏移地址的一串字符“HELLO!”,传送到附加段中以NEW_LOC开始的单元中。实现该操作的
40、程序如下:DATA SEGMENTSEC_MESS DB”HELLO!”DATA ENDS,EXTRA SEGMENTNEW_LOC DB 6 DUP(?)EXTRA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:EXTRASTART: MOV AX, DATAMOV DS, AXMOV AX, EXTRAMOV ES, AXLEA SI, SRC_MESSLEA DI, NEW_LOCMOV CX, 6CLDREP MOVSBCODE ENDSENDS START,CMPS字符串比较指令指令格式:CMPS 目的串,源串指令功能:从SI作指针的源串中减去由
41、DI作指针的目的串数据,相减后的结果反映在标志位上,但不改变两个数据串的原始值。同时源串和目的串指针会自动修改,指向下一对待比较的串。常用该指令比较两个串是否相同。 在CMPS指令前可以加重复前缀,即REPE CMPSREPZ CMPSCX=0或ZF=0停止操作。否则重复比较。,例3-76 比较两字符串,一个是你在程序中设定的口令串PASSWORD,另一个是从键盘输入的字符串IN_WORD,若,输入串与口令串相同,程序开始执行。否则,程序驱动PC机的扬声器发声,警告用户口令不符,拒绝往下执行。可以用CMPS指令来实现,程序段如下:DATA SEGMENTPASSWORD DB 750430LI
42、IN_WORD DB 750430LECOUNT EQU 8DATA ENDSCODE SEGMENTASSUME DS:DATA,ES:DATA,LEA SI,PASSWORDLEA DI,IN_WORDMOV CX,COUNTCLDREPZ CMPSBJNE SOUND OK: SOUND: CODE ENDS,SCAS字符串扫描指令指令格式:SCAS 目的串指令功能:从AL或AX寄存器的内容减去附加段中以DI为指针的目的串元素,结果反映在标志位上,但不改变两个数据串原始值。同时操作后目的串指针会自动修改,指向下一个待比较的串。SCAS常用来在内存中搜索所需要的数据。指令前可以加重续前缀。
43、例3-77 搜索某一字串中是否有字符,若有,记下搜索次数,送到BX寄存器;否则,BX寄存器清零,设字符串起始地址为STRING,长度为CX。,MOV DI,OFFSET STRING 偏移地址MOV CX,COUNT 字符串长度MOV AL,ACLDREPNE SCASBJZ FINDMOV DI,0 FIND: MOV BX,DIHLT LOAD 字符串装入指令指令格式:LODS 源串,指令功能:把数据段中以SI作为指针的串元素,传送到AL或AX中,同时修改SI,使它指向串中的下一个元素,SI的修改量由方向标志DF和源串的类型确定。(无重复前缀形式) STOS数据串存储指令指令格式:STOS
44、 目的串指令功能:将累加器AL或AX中一个字节或字,传送到附加段中以DI为目标指针的目的串中,同时修改DI,以指向串中的下一个单元。可以与REP重复前缀连用。 例3-78 设数据段中一个数据块的起始地址为BLOCK,数据块为8位带符号数,要求将其中正负数分开,将正数送到附加段中始址为PLUS_DATA,的缓冲区,负数则送到附加段中始址为MINUS_DATA的缓冲区。START:MOV SI,OFFSET BLOCK ;SI源串指针MOV DI,OFFSET PLUS_DATAMOV BX,OFFSET MINUS_DATA MOV CX,COUNTCLDGOON: LODS BLOCKTEST
45、 AL,80HJNZ MINUSSTOSBJMP AGAIN,MINUS:XCHG BX,DISTOSBXCHG BX,DIAGAIN:DEC CXJNZ GOONHLT 五 控制转移指令 JMP无条件转移指令 指令格式:JMP 目的 指令功能:使程序无条件地转移到指令中指定的目的地址去执行。 指令分为段内转移和段间转移两种。前者仅改变IP,寄存器值,CS值不变。后者两个寄存器值都变。 就转移地址提供的方式又可分为直接转移和间接转移,前者直接给出转移的目的地址,用一个标号来表示。后者目的地址在某个16位寄存器或存储单元中,CPU根据寻址方式间接求出转移地址。,MINUS:XCHG BX,DIS
46、TOSBXCHG BX,DIAGAIN:DEC CXJNZ GOONHLT 五 控制转移指令 JMP无条件转移指令 指令格式:JMP 目的 指令功能:使程序无条件地转移到指令中指定的目的地址去执行。 指令分为段内转移和段间转移两种。前者仅改变IP,段地址CS不变,而后者CS和IP都要改变。,不论是段内转移还是段间转移,就转移地址提供的方式而言,又可分为直接转移和间接转移。 前者在指令码中直接给出转移的目的地址,目的操作数用一个标号来表示,后者目的地址包含在某个16位寄存器或存储单元中,CPU必须根据寄存器或存储器寻址方式,间接地求出转移地址。,段内直接转移指令 指令格式为:JMP SHORT
47、标号JMP NEAR PRT 标号(或JMP 标号) 这是一种段内相对转移指令,程序转向有效地址等于当前IP寄存器的内容加上8位或16位位移量(DISP)。若位移量位是16位,表示近转移,说明目的地址与当前IP的距离在-32768+32767个字节之间。如果转移的范围在-128+127个字节之内,则成为短转移。 对于位移量为8位的短转移,在标号前需加说明符SHORT。JMP SHORT PROG_SJMP NEAR PRT PROG_N,程序段举例:CODE SEGMENTASSUME CS:CODEPROG_S ADD AL, 05H NOP JMP SHORT PROG_SNOP CODE
48、 ENDSEND 段内间接转移指令这类指令转向的16位有效地址存放在一个16位寄存器或字存储器单元中。用寄存器间接寻址的段内转移指令,要转向的有效地址存放在寄存器中,执行的操作为:IP 寄存器内容,例3-79JMP BX 例3-80JMP WORD PTR 5BX 段间直接(远)指令 用指令中的偏移地址取代IP寄存器的内容,用指令中指定的地址段取代CS寄存器的内容,就可使程序从一个代码段转到另一个代码段。 例3-81JMP FAR PTR PROG_F 指令执行后,IP=080AH,CS=3500H,程序转到3500:08H处执行。,段间间接转移指令 将目的地址的段地址和偏移量事先放在存储器中的4个连续地址单元中,其中前两个字节为偏移量,后两个字节为段地址,转移指令中给出存放目标地址的存储单元的首字节地址值,这种指令的目的操作数前要加说明符DWOED PTR,表示转向地址需取双字。 例3-82JMP DWORD PTR SI+0125H 指令执行过程如图3-20所示,(2)过程调用和返回指令指令格式:CALL 过程名RET 1.段内直接调用和返回 例3-83CALL PROG_N 执行过程如图3-21(a)示:,