第3章+8086的寻址方式和指令系统.ppt_第1页
第3章+8086的寻址方式和指令系统.ppt_第2页
第3章+8086的寻址方式和指令系统.ppt_第3页
第3章+8086的寻址方式和指令系统.ppt_第4页
第3章+8086的寻址方式和指令系统.ppt_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、 CL,AH 意义同上 三、直接寻址方式 1.直接寻址方式 例3-5 MOV AX,2000H 有效地址EA:2000H 默认段寄存器:DS 操作数物理地址=10HDS+EA,例3-6 MOV AL,2000H 意义同上 2.段超越前缀 例3-7 MOV AX,ES:500H 源操作数物理地址=16ES+500H 3.符号地址 例3-8 MOV AX,AREA1 AERA1:有效地址,也可表示立即数,程序中用伪指令来加以说明,例3-9 AERA1 EQU 0867H 等值伪指令 MOV AX,AREA1 例3-10 AREA1 DW 0867H MOV AX,AREA1 此处AERA1为一个地

3、址变量,其值为0867H 四、寄存器间接寻址方式 指令中给出操作数的有效地址 例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)和一个变址寄存器

4、(SI或DI)的内容之和 若基址寄存器为BX,则段寄存器用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,213H IN AL,DX 间接端口寻址 3.一条指令有几种寻址方式 例3-17 MOV BX,AL 4.转移类指令寻址,六、基址变址寻址方式 操作数的有效地址由一个基址寄存器(BX或BP)和一个变址

5、寄存器(SI或DI)的内容之和 若基址寄存器为BX,则段寄存器用DS 若基址寄存器为BP,则段寄存器用SS 例3-13 MOV AX,BXSI 操作数的物理地址=16DS+BX+SI 也可写作 MOV AX,BX+SI,3-2 指令的机器码表示方式,一、机器语言指令的编码目的和特点 1 机器语言指令 2 机器语言指令的编码特点 为每种基本指令类型给出一个编码格式,对照格式填上数字表示不同的寻址方式、数据类型等,从而就能求出每条指令的机器码。 二、机器语言指令代码的编制,八、其他 1.隐含寻址。指令中不指定操作数,但隐含规定的寻址方式 2.I/O端口寻址。直接端口寻址和间接端口寻址 例3-15

6、IN AL,63H 直接端口寻址 例3-16 MOV DX,213H IN AL,DX 间接端口寻址 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,DATA MOV DS,AX DATA是一个

7、段地址变量 例3-26 MOV DX,OFFSET ARRAY 将ARRAY的偏移地址送到DX寄存器 例3-27 MOV AL,AREA1 将AREA1的内容送入AL MOV 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,依次执行下

8、列指令:PUSH BX ,PUSH AX ,POP BX 。堆栈中数据和SP变化如下图所示。,XCHG 交换指令 指令格式:XCHG 目的,源 指令功能:将一个字或字节的源操作数和目的 操作数相交换。交换一般在寄存器之间、寄存器和存储器之间进行。 例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 A

9、L,DX (端口地址放在DX中) 指令功能:从8位(或16位)端口读入一个字节(或字)到AL(或AX)寄存器。其中当端口地址号大于FFH时,必须用第二种方式。 例3-32 以下是几个具体例子 IN AL,0F1H IN AX,80H MOV DX,310H IN AL,DX,例3-33 符号地址变量存储端口号 ATOD EQU 54H IN AL,ATOD OUT输出指令 指令格式:OUT 端口地址,AL (AL可以是AX) OUT DX,AL (端口地址放在DX中) 指令功能:将AL(或AX)寄存器一个字节(或字)写入8位(或16位)端口。 例3-34 下面几个操作实例 OUT 85H,AL

10、 MOV DX,0FF4H OUT DX,AX,3.地址目标传送指令 LEA取有效地址指令 指令格式:LEA 目的,源 指令功能:取源操作数地址偏移量,将其送入目的操作数所在单元。 例3-35设SI=1000H,DS=5000H,(51000H)=1234H 执行LEA BX,SI后 BX=1000H 注意区分 MOV BX,SI 例3-36 以下两条指令等价 LEA BX,TABLE MOV BX,OFFSET TABLE,例3-37 某数组含20个元素,每一元素占一个字节,序号019。设DI指向数组开头,求序号为6的元素的偏移地址: LEA BX,6DI 将双子指针送到寄存器和DS指令 指

11、令格式:LDS 目的,源 指令功能:从源操作数指定的存储单元取出变量的4字节地址指针,送进一对目的寄存器。 例3-38 设 DS=1200H,(12450H)=F346H,(12452H)=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指令

12、 格式:LAHF SAHF送标志寄存器指令 格式:SAHF,PUSHF标志入栈指令 格式:PUSHF POPF标志出栈指令 格式:POPF 二、算术运算 1.加法指令 ADD加法指令 指令格式:ADD 目的,源 指令功能:目的源+目的 ADC加法指令 指令格式:ADC 目的,源 指令功能:目的源+目的+CF,例3-40 以下是一些实例 ADD AL,18H ADC BL,CL ADD AL,COSTBX(ADD COST BX,BL) 例3-41 试用加法指令对5EH和3CH求和,并分析加法运算执行后对标志位的影响。 MOV AL,5EH MOV BL,3CH ADD AL,BL 标志位:ZF

13、=0,AF=1,CF=0 SF=1,PF=1,OF=1,INC增量指令 指令格式:INC 目的 指令功能:目的目的+1 例3-42 INC BL BL寄存器内容增1 INC CX CX寄存器内容增1 例3-43 INC BYTE PTRBX 内存字节单元内容增1,AAA加法的ASCII调整指令 指令格式:AAA 指令功能:执行加法指令后,结果存储在AL中。调整AL寄存器的内容为1位非压缩十进制数,结果仍然存在AL寄存器中 若AL低4位9或半进位标志AF=1 则 1)ALAL+6 2)用与操作将AL高4位清0 3)AF置1,CF置1,AHAH+1 否则,仅将AL寄存器的高4位清0,例3-44 设

14、AL=BCD 9,BL=BCD 5,求两数之和。设AH=0,其运算如下,则结果为? ADD AL,BL AAA 结果:AX=0104H 例3-45 求ASCII码数9(39H)和5(35H)之和,设AH=0 MOV AL,39H MOV BL,35H ADD AL,BL AAA 结果:AX=0104H,DAA加法的ASCII调整指令 指令格式:AAA 指令功能:执行两个压缩BCD数加法指令后,结果存储在AL中。调整AL寄存器的内容为正确的压缩BCD数。 若AL低4位9或半进位标志AF=1 则 若ALAL+6,对低半字节进行调整 若AL的高半字节9或CF=1 则ALAL+60H,CF置1。否则C

15、F置0,例3-46 设AL=BCD 38,BL=BCD 15,求两数之和。则结果为? ADD AL,BL DAA 结果:AL=BCD 53,CF=0 例3-47 设AL=BCD 88,BL=BCD 49,求两数之和。则结果为? ADD AL,BL DAA 结果:AL=BCD 37,CF=1,减法指令(Subtraction) (1)SUB减法指令 指令格式:SUB 目的, 源 指令功能:将目的操作数减去源操作数, 结果送回目的操作数。即 目的 目的 源 例3-48 SUB AX, BX ;AX AX BX SUB DX,1850H ;DX DX 1850H SUB BL BX ;BL中内容减去

16、物理地址=DS:(BX)处的字节,结果存入BL。,减法指令(Subtraction) (2)SBB带借位的减法指令 指令格式:SBB 目的, 源 指令功能:与SUB类似,只是在两个操作数相减后,还要减去进位/借位标志CF的当前值。即 目的 目的 源 CF 例3-49 SBB AL, CL ;AL AL CL CF SBB主要用于多字节减法中。,减法指令(Subtraction) (3)DEC减量指令 指令格式:DEC 目的 指令功能:对指定的目的操作数减1,结果送回此操作数。即 目的 目的-1 例3-50 DEC BX DEC WORD PTRBP,减法指令(Subtraction) (4)N

17、EG取负指令 指令格式:NEG 目的 指令功能:对目的操作数减取负,结果送回目的操作数。即 目的 0-目的 例3-51 NEG AX NEG BYTE PTRBX,减法指令(Subtraction) (5)CMP比较指令 指令格式:CMP 目的, 源 指令功能:将目的操作数减去源操作数,但结果不回送到目的操作数中,仅将结果反映在标志位上,接着可用条件跳转指令决定程序的去向。即 目的 源 例3-52 CMP AL, 80H CMP BX, DATA1 比较指令主要用在希望比较两个数的大小,而又不破坏原操作数的场合。,以上五种指令实际上都做减法运算,而且都可以进行字或字节的运算,对于SUB,SBB

18、,CMP这类双操作数所指令,源操作数可以是寄存器,存储器或立即数,而且要求两个操作数不能同时为存储器。对于操作数指令,目的操作数可以是寄存器或存储器,但不能为立即数,如果是存储器操作数,还必须说明其类型是字节还是字。 例 3-53 设AL=1011 001B,DL=0100 1010B,若要求AL-DL,只要执行指令SUB AL,DL,与加法操作那样,对结果的解释也取决于参与算数的性质。 运算后标志位ZL=0,AF=1,CF=0,SF=0,PF=0,OF=1。,减法指令(Subtraction) (6)AAS减法的ASCII调整指令 指令格式:AAS 指令功能:在用SUB或SBB指令对两个非压

19、缩十进制数或以ASCII码表示的十进制数进行相减后,对AL中所得结果进行调整,在AL中得到一个正确的非压缩十进制数之差。如果有错位,则CF置1。AAS指令必须紧跟在SUB或SBB指令之后。 AAS指令执行时,调整过程为: 若AL寄存器的低4位9或AF=1,则 1.AL AL- 6,AF置1 2.将AL寄存器高4位清零 3.AH AH - 1,CF置1 否则,不要调整。 例 3-54 设AL=BCD3,CL=BCD8,求两数之差。显然结果为BCD5,但要向高位借位。运算过程如下: SUB AL,CL ASS 结果为5,CF=1,表示有借位。,减法指令(Subtraction) (7)DAS减法的

20、十进制调整指令 指令格式:DAS 指令功能:在两个压缩十进制数用SUB或SBB相减后,结果已存在AL中的情况下,对所得结果进行调整,在AL中得到正确的压缩十进制数。同样,它也要对AL中高半字节和低半字节分别进行调整。 DAS指令执行时,调整过程为: 如果AL寄存器的低4位9或AF=1 则AL AL-6,AF置1 如果此时AL高半字节9或标志位CF=1 则AL AL-60H,CF置1 例3-55 设AL=BCD56,CL=BCD98,求两数之差。 SUB AL,CL DAS 运算结果为:AL=BCD58,CF=1,表示有借位。,乘法指令(Multiply) (1)MUL无符号数乘法指令 指令格式

21、:MUL 源 指令功能:把源操作数和累加器中的数都当成无符号数,然后将两数相乘,源操作数可以是字节或字。 如果源操作数是一个字节,则它与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送到AL。即 AL AL * 源,乘法指令中,源操作数可以是寄存器,也可以使存储单元,但不能是立即数。当源操作数是存储单元时,必须在操作数前加B或W说明是字节还是字。 例 3-56 MUL DL MUL CX MUL BSI MUL WBX MUL指令执行后影响CF和OF标志,如果结果的高半部分不为零,表明其内容是结果的有效位,则CF和OF均置1。否则,CF和OF均清零。通过测试这两个标志,

22、可检测并除去结果中的无效前导零。乘法指令使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的运算,结果正确。若把它们看成带符号数,上面的计算表示(-1)*(-1)=-511,显然结果不正确。 由此可见,如果用MUL指令作带符号的乘法,会得到错误的结果,所以必须用下面的介绍的IMUL指令,才能使(-1)*(-1)得到正确的结果 0000

23、 0000 0000 0001,乘法指令(Multiply) (2)IMUL整数乘法指令 指令格式:IMUL 源 指令功能:把源操作数和累加器中的数都作为带符号数,进行相乘。 存放结果的方式与MUL相同。如果源操作数为字节,则与AL相乘,双倍长结果送到AX中。如源操作数为字,则与AX相乘,双倍长结果送到DX和AX中,最后给乘积赋予正确的符号。,例 3-59 设AL=-28H,BL=59H,试计算它们的乘积。 IMUL BL 结果,AX=F98CH=-1652,CF=1,OF=1 (3)AAM乘法的ASCII调整指令 指令格式:AAM 指令功能:对已存在AL中的两个非压缩十进制数相乘的乘积进行十

24、进制数的调整,使得在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, 09H MOV BL, 06H MUL BL AAM 最后可在AX中得到正确结果AX=0504H,即BCD数54。 如果AL和BL中分别存放9和6的ASCII码,求两数之积时要用以下指令实现: AND AL, OFH AND BL,

25、 OFH MUL BL AAM 如果将结果转换成ASCII码,可再用指令OR AX,3030H实现,使AX=3534H。 乘法调整指令仅此一条。,除法指令(Division) (1)DIV无符号数除法指令 指令格式:DIV 源 指令功能:对两个无符号数进行除法操作。源操作数可以是字或字节。 如果源操作数为字节,16位被除数必须放在AX中,8位除数为源操作数,它可以是寄存器或存储单元。相除之后,8位商在AL中,余数在AH中。 如果被除数只有8位,必须把它放在AL中,并将AH清零,然后相除。 如果源操作数为字,32位被除数在DX,AX中,其中,DX为高位字,16位除数做源操作数,它可以是寄存器或存

26、储单元。相除之后,AX中存16位商,DX存16位余数。 要是被除数只有16位,除数也是16位,则必须将16位被除数送到AX中,再将DX寄存器清零,然后相除。,(2)IDIV整数除法指令 指令格式: IDIV 源 指令功能:该指令执行的操作与DIV相同,但操作数都必须是带符号数,商和余数也都是带符号数,而且规定余数的符号和被除数相同。 注意:除法指令字节操作时商为8位,字操作时商为16位。 例3-61 两个无符号数7A86H和04H相除的商应为1EA1H,若用DIV指令进行计算,即 MOV AX, 7A86H MOV BL, 04H DIV BL 这时,由于BL中的除数04H为字节,商1EA1H

27、大于AL中能存放的最大无符号数FFH,结果将产生除法错误中断。 注意:对于带符号数除法指令,字节操作时要求被除数为16位,字节操作时要求被除数为32位,若被除数不满足此条件,适用下面的符号扩展指令。,(3)CBW把字节转换为字指令 指令格式:CBW 指令功能:把寄存器AL中字节的符号位扩充到AH的所有位,这时AH被称为是AL的符号扩充。 若AL中的D7=0,就将这个0扩展到AH中去,使AH=00H,即 D7 D0 D7 D0 AH 00 AL 0 AL=正数 若AL中的D7 =1,则将这个1扩展到AH中去,使AH=FFH,即 D7 D0 D7 D0 AH 11 AL 1 AL=正数 CBW指令

28、执行后,不影响标志位。,(4)CWD把字转换成双字指令 指令格式:CWD 指令功能:把AX中字的符号位扩充到DX寄存器的所有位中去。 若AX的D15=0,则DX 000H,即 D15 D0 D15 D0 DX 00 AX 0 AX=正数 若AX中的D15 =1,则DX FFFFH,即 D15 D0 D15 D0 DX 11 AX 1 AX=负数 CWD指令执行后,也不影响标志位。,例3-62 编程求-38/3的商和余数 MOV AL, 11011010B MOV CH, 00000011B CBW IDIV CH (5)ADD除法的ASCII调整指令 指令格式:AAD 指令功能:在做除法前,把

29、BCD码转换成二进制数。 除法的ASCII调整指令在除法之前进行。 调整过程: AL AH*10+AL AH 00,例3-63 设AX中存有两个非压缩BCD数0307H,即十进制数的37,BL中存有一个非压缩BCD数05H,若要完成AX/BL的运算,可用以下指令: AAD DIV BL 结果: AL=7(商) AH=2(余数) 由于8086只提供了非压缩十进制数的乘除法调整指令,如果要进行压缩十进制数的乘除法运算,应先将操作数转换成非压缩十进制数,再按非压缩十进制数进行运算,分几步完成操作。,例3-64 编写程序,计算756=123 FIRST DB 06H SECOND DB 75H THI

30、RD DB 2 DUP(0) FOUR DB ? . MOV AH, 00H MOV AL, SECOND AND AL, 0F0H MOV CL, 04H ROL AL, CL DIV FIRST MOV THIRST+1, AL MOV AL, SECOND AND AL, 0FH AAD DIV FIRST MOV THIRT, AL MOV FOUR, AH,下图表示上述除法程序执行过程中,数据在内存中的存放格式。,三 逻辑运算和移位指令 逻辑运算和移位指令对字节或字进行按位操作,这类运算可分成逻辑运算,算术逻辑移位和循环移位三类,见表3-7,逻辑运算指令 (1)NOT取反指令 指令格

31、式:NOT 目的 指令功能:将目的操作数取反,结果送回目的操作数,即 目的 目的 目的操作数可以是8位或16位寄存器或存储器。对于存储器操作数,要说明其类型是字节还是字。执行指令后,对操作数没有影响。 例3-65 NOT指令的几种用法: NOT AX NOT BL NOT BYTE PTRBX,逻辑运算指令 (2)AND逻辑与指令 指令格式:AND 目的, 源 指令功能:对两个操作数进行按位逻辑与操作,结果送回目的操作数 ,即 目的 目的源 它主要用于使操作数的某些位保留(和“1”相与),而使某些位清除(和“0”相与) 例3-66 假设AX中存有数字5和8的ASCII码,即AX=3538H,要

32、将他们转换成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,逻辑运算指令 (4)XOR异或指令 指令格式:

33、XOR 目的, 源 指令功能:对两个操作数进行按位逻辑异或运算,结果送回目的操作数,即 目的 目的 源 它主要用于使操作数的某些位保留(和“0”相异或),而使某些位取反(和“1”相异或)。 例3-68若AL中存有某外设端口的状态信息,其中D1位控制扬声器发声,要求该位在0,1之间来回变化,其余各位保留不变,可以用以下指令实现: XOR AL, 00000010B,逻辑运算指令 (5)TEST测试指令 指令格式:TEST 目的, 源 指令功能:对于两个操作数进行逻辑与操作,并修改标志位,但不回送结果,即指令执行后,两个操作数都不变。即 目的源 例3-69 设AL寄存器存有报警标志。若D7=1,表

34、示温度报警,程序要转到温度报警程序T_ALARM;D6=1,则转压力警报程序P_ALARM。为此,可用如下方法适用TEST指令来实现这种功能: TEST AL, 80H JNZ T_ALARM TEST AL, 40H JNZ P_ALARM,算术逻辑移位指令 可对寄存器或存储器中的字或字节进行算术移位或逻辑移位,移动的次数由指令中的计数值决定,图3-17是移位指令的操作示意图。,算术逻辑移位指令 (1)SAL算术左移指令 指令格式:SAL 目的, 计数值 (2)SHL逻辑左移指令 指令格式:SHL 目的, 计数值 指令功能:以上两条指令的功能完全相同,均将寄存器或存储器中的目的操作数的各位左

35、移,每移一次,最低有效位LSB补0,最高有效位MSB进入标志位CF。移位次数为1的情况下,若符号位被改变,则OF置1,否则清0。不论移一次或多次,CF总是等于目的操作数最后被移出去的那一位的值。,例3-70 MOV AH,06H SAL AH,1 MOV CL,03H SHL DI,CL SAL BYTE PTRBX,1 内存单元字节左移1位 (3)SHR逻辑右移指令 指令格式:SHR 目的,计数值 指令功能:对目的操作数中各位进行右移,每执行一次操作后,操作数右移一位,最低位进入CF,最高位补0。右移次数由计数值决定,同SAL/SHL指令一样。 若目的操作数为无符号数,每右移一次,使目的操作

36、数除以2。用这种方法做除法时,余数将被丢掉。,例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, 10000000B MOV CL, 03H SAR AL, CL,循

37、环移位指令 上述的算术逻辑移位指令,移出操作数的数位均被丢失,而循环移位指令把操作数从一端移到操作数的另一端,这样从操作数中移走的位就不会丢失了。 循环移位指令共四条: (1)ROL循环左移指令 指令格式:ROL 目的, 计数值 (2)ROR循环右移指令 指令格式:ROR 目的, 计数值 (3)RCL通过进位位循环左移 指令格式:RCL 目的, 计数值 (4)RCR通过进位位循环右移 指令格式:RCR 目的, 计数值,循环移位指令的操作示意图如下: 四条指令都按指令中计数值规定的移位次数进行循环移位,移位后的结果仍送回目的操作数。目的操作数可以使8/16位的寄存器或内存操作数,循环移位的次数可

38、以是1,也可以由CL寄存器的值指定。,这4条指令中,ROL和ROR指令没有把进位标志CF包含在循环中,而RCL和RCR指令把CF作为整个循环的一部分,一起参加循环移位。OF位只有在移位次数为1的时候才有效,在移位后当前最高有效位发生变化(由1变0或由0变1)时,则OF标志位置1,否则OF置0,在多位循环移位时,OF的值是不确定的,CF的值总是由最后一次被移出的值决定的。 例3-73 ROL BX, CL ROR WORD PTRSI,例3-74 设CF=1,AL=1011 0100B 若执行指令ROL AL,1,则AL=0110 1001B,CF=1,OF=1 若执行指令ROR AL,1,则A

39、L=0110 1001B,CF=0,OF=1 若执行指令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会自动进行修改。,四 字符串处理指

40、令(续) 4)DF标志控制字符串处理的方向。DF=0为递增方向,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为偏移地址的一串

41、字符“HELLO!”,传送到附加段中以NEW_LOC开始的单元中。实现该操作的程序如下: DATA SEGMENT SEC_MESS DB”HELLO!” DATA ENDS,EXTRA SEGMENT NEW_LOC DB 6 DUP(?) EXTRA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EXTRA START: MOV AX, DATA MOV DS, AX MOV AX, EXTRA MOV ES, AX LEA SI, SRC_MESS LEA DI, NEW_LOC MOV CX, 6 CLD REP MOVSB CODE ENDS

42、 ENDS START,CMPS字符串比较指令 指令格式:CMPS 目的串,源串 指令功能:从SI作指针的源串中减去由DI作指针的目的串数据,相减后的结果反映在标志位上,但不改变两个数据串的原始值。同时源串和目的串指针会自动修改,指向下一对待比较的串。 常用该指令比较两个串是否相同。 在CMPS指令前可以加重复前缀,即 REPE CMPS REPZ CMPS CX=0或ZF=0停止操作。否则重复比较。,例3-76 比较两字符串,一个是你在程序中设定的口令串PASSWORD,另一个是从键盘输入的字符串IN_WORD,若,输入串与口令串相同,程序开始执行。否则,程序驱动PC机的扬声器发声,警告用户

43、口令不符,拒绝往下执行。可以用CMPS指令来实现,程序段如下: DATA SEGMENT PASSWORD DB 750430LI IN_WORD DB 750430LE COUNT EQU 8 DATA ENDS CODE SEGMENT ASSUME DS:DATA,ES:DATA ,LEA SI,PASSWORD LEA DI,IN_WORD MOV CX,COUNT CLD REPZ CMPSB JNE SOUND OK: SOUND: CODE ENDS,SCAS字符串扫描指令 指令格式:SCAS 目的串 指令功能:从AL或AX寄存器的内容减去附加段中以DI为指针的目的串元素,结果反

44、映在标志位上,但不改变两个数据串原始值。同时操作后目的串指针会自动修改,指向下一个待比较的串。 SCAS常用来在内存中搜索所需要的数据。 指令前可以加重续前缀。 例3-77 搜索某一字串中是否有字符,若有,记下搜索次数,送到BX寄存器;否则,BX寄存器清零,设字符串起始地址为STRING,长度为CX。,MOV DI,OFFSET STRING 偏移地址 MOV CX,COUNT 字符串长度 MOV AL,A CLD REPNE SCASB JZ FIND MOV DI,0 FIND: MOV BX,DI HLT LOAD 字符串装入指令 指令格式:LODS 源串,指令功能:把数据段中以SI作为

45、指针的串元素,传送到AL或AX中,同时修改SI,使它指向串中的下一个元素,SI的修改量由方向标志DF和源串的类型确定。(无重复前缀形式) STOS数据串存储指令 指令格式:STOS 目的串 指令功能:将累加器AL或AX中一个字节或字,传送到附加段中以DI为目标指针的目的串中,同时修改DI,以指向串中的下一个单元。 可以与REP重复前缀连用。 例3-78 设数据段中一个数据块的起始地址为BLOCK,数据块为8位带符号数,要求将其中正负数分开,将正数送到附加段中始址为PLUS_DATA,的缓冲区,负数则送到附加段中始址为MINUS_DATA的缓冲区。 START:MOV SI,OFFSET BLO

46、CK ;SI源串指针 MOV DI,OFFSET PLUS_DATA MOV BX,OFFSET MINUS_DATA MOV CX,COUNT CLD GOON: LODS BLOCK TEST AL,80H JNZ MINUS STOSB JMP AGAIN,MINUS:XCHG BX,DI STOSB XCHG BX,DI AGAIN:DEC CX JNZ GOON HLT 五 控制转移指令 JMP无条件转移指令 指令格式:JMP 目的 指令功能:使程序无条件地转移到指令中指定的目的地址去执行。 指令分为段内转移和段间转移两种。前者仅改变IP,寄存器值,CS值不变。后者两个寄存器值都变。

47、 就转移地址提供的方式又可分为直接转移和间接转移,前者直接给出转移的目的地址,用一个标号来表示。后者目的地址在某个16位寄存器或存储单元中,CPU根据寻址方式间接求出转移地址。,MINUS:XCHG BX,DI STOSB XCHG BX,DI AGAIN:DEC CX JNZ GOON HLT 五 控制转移指令 JMP无条件转移指令 指令格式:JMP 目的 指令功能:使程序无条件地转移到指令中指定的目的地址去执行。 指令分为段内转移和段间转移两种。前者仅改变IP,段地址CS不变,而后者CS和IP都要改变。,不论是段内转移还是段间转移,就转移地址提供的方式而言,又可分为直接转移和间接转移。 前

48、者在指令码中直接给出转移的目的地址,目的操作数用一个标号来表示,后者目的地址包含在某个16位寄存器或存储单元中,CPU必须根据寄存器或存储器寻址方式,间接地求出转移地址。,段内直接转移指令 指令格式为:JMP SHORT 标号 JMP NEAR PRT 标号(或JMP 标号) 这是一种段内相对转移指令,程序转向有效地址等于当前IP寄存器的内容加上8位或16位位移量(DISP)。若位移量位是16位,表示近转移,说明目的地址与当前IP的距离在-32768+32767个字节之间。如果转移的范围在-128+127个字节之内,则成为短转移。 对于位移量为8位的短转移,在标号前需加说明符SHORT。 JM

49、P SHORT PROG_S JMP NEAR PRT PROG_N,程序段举例: CODE SEGMENT ASSUME CS:CODE PROG_S ADD AL, 05H NOP JMP SHORT PROG_S NOP CODE ENDS END 段内间接转移指令 这类指令转向的16位有效地址存放在一个16位寄存器或字存储器单元中。用寄存器间接寻址的段内转移指令,要转向的有效地址存放在寄存器中,执行的操作为: IP 寄存器内容,例3-79 JMP BX 例3-80 JMP WORD PTR 5BX 段间直接(远)指令 用指令中的偏移地址取代IP寄存器的内容,用指令中指定的地址段取代CS

50、寄存器的内容,就可使程序从一个代码段转到另一个代码段。 例3-81 JMP FAR PTR PROG_F 指令执行后,IP=080AH,CS=3500H,程序转到3500:08H处执行。,段间间接转移指令 将目的地址的段地址和偏移量事先放在存储器中的4个连续地址单元中,其中前两个字节为偏移量,后两个字节为段地址,转移指令中给出存放目标地址的存储单元的首字节地址值,这种指令的目的操作数前要加说明符DWOED PTR,表示转向地址需取双字。 例3-82 JMP DWORD PTR SI+0125H 指令执行过程如图3-20所示,(2)过程调用和返回指令 指令格式:CALL 过程名 RET 1.段内

51、直接调用和返回 例3-83 CALL PROG_N 执行过程如图3-21(a)示:,2.段内间接调用和返回 例3-84 CALL BX CALL WORD PTR BX+SI 3.段间直接调用 CALL FAR PTR PROGS_F 指令过程图如下:,4.段间直接调用 例3-86 CALL DWORD PTR BX 该类指令的操作数必须是存储单元。 条件转移指令 指令格式: 条件操作符 标号 1.直接标志转移指令 以CF,ZF,SF,OF,和PF等5个标志的10种状态为判断的条件,共形成10条指令。,例3-87 求AL和BL 寄存器中的两数之和,若有进位,则AH置1,否则AH清0。 ADD

52、AL,BL JC NEXT MOV AH,0 JMP EXIT NEXT: MOV AH,1 EXIT: (2)间接标志转移 以某一个标志的状态或几个标志的状态组合,作为测试条件,若条件成立则转移,否则顺序往下执行,间接转移指令共8条,如表3-12所示:,例3-88 设AL=F0H,BL=35H,执行指令 CMP AL,BL JEN NEXT,以下举例说明条件转移指令的用法。 例3-89 设某个学生的英语成绩已存放在AL寄存器中,若低于60分,则打印F(FALL);若成绩高于或等于85分,则打印G(GOOD);当在60分和84分之间时,打印P(PASS)。 CMP AL,60 JB FALL

53、CMP AL,85 JAE GOOD MOV AL,“P” JMP PRINT FALL: MOV AL,F JMP PRINT GOOD: MOV AL,G PRINT: ,例3-90 假定某温度控制系统中,从温度传感器输入一个8位二进制的摄氏温度值。当系统温度低于100度时,则打开加热器;当温度上升到100度或100度以上时,关闭加热器,进行下一步处理。设温度传感器的端口号为320H,同时假设控制加热器的输出信号连到端口321H的最低有效位,当将这一位置1时,加热器便打开,清0时则关闭加热器。实现上出温度控制的程序为: CET_TEMP: MOV DX,320H IN AL,DX CMP

54、AL,100 JB HEAT_ON JMP HEAT_OFF HEAT_ON: MOV AL,01H MOV DX,321H OUT DX,AL JMP CET_TEMP HEAT_OFF MOV AL,00 MOV DX,321H OUT DX,AL . .,例3-91 在以首地址为TABLE的10个内存子介单元中存放了10个带符号数,要求统计其中正数,负数和零的个数,并将结果分别存入PLUS、NEGT和ZERO单元。程序如下: TABLE DB 01H、80H、0F5H、32H、86H DB 74H、49H、0AFH,25H,40H PLUS DB 0 NEGT DB 0 ZERO DB

55、0 MOV CX,10 MOV BX,0 AGAIN: CMP TABLEBX,0 JGE GRET_EQ INC NEGT JMP NEXT GRET_EQ: JG P_INC INC ZERO JMP NEXT P_INC: INC PLUS NEXT: INC BX DEC CX JNZ AGAIN .,循环控制指令 (1)LOOP循环指令 指令格式:LOOP 短标号 指令功能:控制重复执行一系列指令,相当于以下两条指令的功能: DEC CX JNZ 标号 例3-92 设商店里有8种商品,它们的价格分别为83,76,65,84,71,49,62和58元,现要将每种商品提价7元,变成计算每

56、种商品提价后的价格。 OLD DB 83H,76H,65H,84H DB 71H,49H,62H,58H NEW DB 8 DUP(?) . MOV AL,OLDBX ADD AL,7 DAA MOV NEWBX,AL INC BX LOOP NEXT ,(2)LOOPE/LOOPE相等或结果为0 时循环 指令格式:LOOPE 标号 或LOOPZ 标号 指令功能:LOOPE是结果相等时循环,而LOOPZ是结果为0时循环。这是两条能完成相同功能而具有不同助记符的指令。 例3-94 设有一个由50个字节组成的数组存放在ARRAY开始的内存单元中,现要对该数组中的元素进行测试,若元素为0,而且不是最后一个元素,便继续进行下一元素的测试,直到找到第一个非0元素或查完为止。 ARRAY DB , MOV BX,OFFSET ARRAY DEC BX MOV CX,50 NEXT: INC BX CMP BX,00H LOOPE NEXT ,(3)LOOPNE/LOOPNZ不相等或结果为不为零循环 指令格式:LOOPNE 标号 或LOOPNZ 标号 指令功能:LOOPNE是不相等时循环,而LOOPNZ是结果不为零时循环。 例3-95

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论