版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、【例5-1】设X、Y 、Z为有符号字变量,编写程序计算表达式 (X+Y)*5+8-X)Z的值,结果存放到双字变量RESULT中。(1)程序的基本结构:(2)计算表达式的值算法分析:步骤1:计算X+Y;步骤2:计算(X+Y)*5;步骤3:计算(X+Y)*5+8步骤4:计算 (X+Y)*5+8-X步骤5:计算(X+Y)*5+8-X)Z程序算法流程图如图5-3所示。(3) (3) 根据流程图编写汇编程序:根据流程图编写汇编程序:DATA SEGMENT DATA SEGMENT ;数据段,;数据段, 定义定义X X、Y Y、Z Z为字变量为字变量 X DW ?X DW ?Y DW ?Y DW ?Z
2、DW ?Z DW ?RESULT DD ? RESULT DD ? ;RESULTRESULT为双字变量为双字变量DATA ENDSDATA ENDSCODE SEGMENT CODE SEGMENT CODECODE ;代码段;代码段 ASSUME CSASSUME CS:CODECODE,DSDS:DATA DATA STARTSTART: MOV AXMOV AX,DATADATAMOV DSMOV DS,AX AX ;数据段段地址送;数据段段地址送DSDS中中MOV AXMOV AX,X XADD AXADD AX,Y Y ; 计算计算X+YAXX+YAXMOV BXMOV BX,5
3、5IMUL BX IMUL BX ;计算;计算(X+Y)(X+Y)* *5 5, AXAX* *5DX5DX:AXAXADD AXADD AX,8 8ADC DXADC DX,0 0 ;计算;计算(X+Y)(X+Y)* *5+85+8,(,(DXDX:AXAX)+8DX+8DX:AXAXSUB AXSUB AX,X XSBB DXSBB DX,0 0 ;计算;计算 (X+Y)(X+Y)* *5+8-X5+8-X,(,(DXDX:AXAX)-XDX-XDX:AXAXIDIV Z IDIV Z ;计算;计算(X+Y)(X+Y)* *5+8-X)5+8-X)Z Z 商商AXAX,余数,余数DXDXM
4、OV WORD PTR RESULTMOV WORD PTR RESULT,AX AX ;商;商RESULTRESULTMOV WORD PTR RESULT+2MOV WORD PTR RESULT+2,DX DX ;余数;余数RESULT+2RESULT+2MOV AXMOV AX,4C00H 4C00H ;程序结束返回;程序结束返回DOSDOS INT 21H INT 21HCODE ENDS CODE ENDS ;代码段结束;代码段结束 END STARTEND START (4) (4) 程序说明:程序说明:1 1) 变量变量X X、Y Y 、Z Z为有符号字变量,在数据段为有符号字
5、变量,在数据段中定义。加减法指令不分有符号或无符号,乘除中定义。加减法指令不分有符号或无符号,乘除法指令用有符号乘除法指令法指令用有符号乘除法指令IMULIMUL和和IDIVIDIV。2 2)由于把)由于把5 5送到送到BXBX中,在中,在IMUL BXIMUL BX指令之前要把指令之前要把乘数乘数AXAX符号扩展到符号扩展到DXDX中,才可以做中,才可以做 (DXDX:AXAX)* *BXDXBXDX:AXAX。 3 3)RESULTRESULT是双字变量,当商是双字变量,当商AXAX送送RESULTRESULT低字低字,DXDX余数送余数送RESULTRESULT高字时,要说明高字时,要说
6、明RESULTRESULT的字属的字属性。性。 4 4)该程序在调试过程中,应把)该程序在调试过程中,应把X X、Y Y、Z Z的值写的值写在程序的数据段中,执行结果是在在程序的数据段中,执行结果是在RESULTRESULT中,可中,可以通过以通过DEBUGDEBUG或或CodeViewCodeView看到。看到。【例例5-35-3】 通过键盘键入一个两位十进制数,将该数转换成压缩的通过键盘键入一个两位十进制数,将该数转换成压缩的BCDBCD码,送码,送BUFBUF中。中。(1 1)分析:)分析:1 1)获取键盘键入的数据是利用下面两条指令来完成:)获取键盘键入的数据是利用下面两条指令来完成:
7、 MOV AHMOV AH,01H 01H ;1 1号功能,通过键盘读入号功能,通过键盘读入1 1个个ASCIIASCII码码ALAL INT 21H INT 21H ;中断;中断21H21H 2 2)通过键盘键入的数字的)通过键盘键入的数字的ASCIIASCII码为:码为: 键盘键入123456789ASCII码31H32H33H34H35H36H37H38H39H 将将ASCIIASCII码转换成码转换成BCDBCD码,用去掉码,用去掉30H30H的方法:的方法: SUB ALSUB AL,30H30H (2 2)程序流程图如图)程序流程图如图5-55-5所示。所示。(3 3)根据流程图编
8、写汇编程序:)根据流程图编写汇编程序:DATA SEGMENT DATA SEGMENT ;定义数据段;定义数据段BUF DB BUF DB ? ;BUFBUF为字节变量为字节变量DATA ENDSDATA ENDSCODE SEGMENT CODE SEGMENT CODECODE ;定义代码段;定义代码段 ASSUME CSASSUME CS:CODECODE,DSDS:DATADATASTARTSTART: MOV AXMOV AX,DATADATA MOV DS MOV DS,AX AX ;数据段段地址送;数据段段地址送DSDS中中 MOV AHMOV AH,01H 01H ;通过键盘
9、读入十位;通过键盘读入十位ASCIIASCII码码ALAL INT 21H INT 21H SUB AL SUB AL,30H 30H ;将十位;将十位ASCIIASCII码转换成码转换成BCDBCD码码ALAL SHL AL SHL AL,4 4 ;将十位;将十位BCDBCD码左移码左移4 4位位ALAL MOV BUF MOV BUF,AL AL ;将;将ALBUFALBUF保存保存 MOV AHMOV AH,01H 01H ;通过键盘读入个位;通过键盘读入个位ASCIIASCII码码ALAL INT 21H INT 21H SUB AL SUB AL,30H 30H ;将个位;将个位AS
10、CIIASCII码转换成码转换成BCDBCD码码ALAL OR BUF OR BUF,AL AL ;将十位;将十位BCDBCD码和个位码和个位BCDBCD码合并码合并BUFBUF MOV AX MOV AX,4C00H 4C00H ;程序结束返回;程序结束返回DOSDOS INT 21H INT 21HCODE ENDS CODE ENDS ;代码段结束;代码段结束 END STARTEND START(4 4)程序说明:)程序说明:1 1)用中断)用中断21H21H的的1 1号功能,每次只能读入号功能,每次只能读入1 1个个ASCIIASCII码送码送ALAL,在程序中分别两次从端口获取数据
11、。,在程序中分别两次从端口获取数据。2 2) 将将ASCIIASCII码转换成码转换成BCDBCD码后,将十位码后,将十位BCDBCD码和码和个位个位BCDBCD码合并送码合并送BUFBUF中。中。3 3)该程序的执行结果在数据段的字节变量)该程序的执行结果在数据段的字节变量BUFBUF中中,可以通过,可以通过DEBUGDEBUG或或CodeViewCodeView看到。看到。条件转移指令助记符条件转移指令助记符 短标号短标号用途比较指令标志寄存器比较结果比较DST和 SRC 是否相等(有符号或无符号)CMP DST ,SRC 做DST-SRCZF=1(结果为0)DSTSRC ZF=0(结果为
12、不0)DST SRC 比较两个无符号数的大小 (由CF、ZF判断)CMP DST ,SRC 做DST-SRCCF=0 (无借位) ZF=1DSTSRC ZF=0DSTSRC CF=1(有借位)DSTSRC 比较两个有符号数的大小 (由SF、OF判断)CMP DST ,SRC 做DST-SRCOF=0(无溢出)SF=0DSTSRC SF=1DSTSRCOF=1(有溢出)SF=0DSTSRC SF=1DSTSRC【例例5-45-4】设设AX=5AX=5,BX=8BX=8,比较两数的大小。,比较两数的大小。执行执行CMP AXCMP AX,BXBX后,标志寄存器中:后,标志寄存器中:CF=1CF=1
13、,SF=1SF=1,OF=0OF=0,ZF=0ZF=0。当把当把AXAX和和BXBX中的数看做是无符号数时,中的数看做是无符号数时,CF=1CF=1则则AXAXBXBX。当把当把AXAX和和BXBX中的数看做是有符号数时,中的数看做是有符号数时,OF=0OF=0,SF=1SF=1则则AXAXBXBX。 设设AX=5AX=5,BX=-8BX=-8执行执行CMP AXCMP AX,BXBX后,标志寄存器中:后,标志寄存器中:CF=1CF=1,SF=0 SF=0 ,0F=00F=0,ZF=0ZF=0。当当AXAX和和BXBX中的数是有符号数:中的数是有符号数:OF=0OF=0,SF=0SF=0则则A
14、XAXBXBX。当认为当认为AXAX和和BXBX中的数是无符号数时:中的数是无符号数时:AX=0005HAX=0005H,BX=0FFF8HBX=0FFF8H,CF=1CF=1则则AXAXBXBX。助记符功 能转移条件JC 有进位(或借位)时转移CF=1 JNC无进位(或无借位)时转移CF=0JZJE结果为零相等时转移ZF=1JNZJNE结果不为零不相等时转移ZF=0JS 结果为负数时转移时转移SF=1 JNS结果为正数时转移SF=0JO有溢出时转移时转移0F=1JNO无溢出时转移0F=0JPJPE偶校验时转移PF=1JNPJPO奇校验时转移PF=0 假如:比较两数假如:比较两数X X和和Y
15、Y是否相等,相等执行程序段是否相等,相等执行程序段L1L1,不等执行程序段,不等执行程序段L2L2。 则:则: MOV AXMOV AX,Y Y CMP AX CMP AX,X X ;Y-XY-X结果不送目的操作数结果不送目的操作数 JZ L1 JZ L1 ;相等时;相等时ZF=1ZF=1转到转到L1L1 ;L2L2程序段,不等时程序段,不等时ZF=0ZF=0执行执行L2L2程序段程序段 L1 L1 : ;L1L1程序段程序段 或:或: MOV AXMOV AX,Y Y CMP AX CMP AX,X X ;Y-XY-X结果不送目的操作数结果不送目的操作数 JNZ L2 JNZ L2 ;不等时
16、;不等时ZF=0ZF=0转到转到L2L2 ;L1L1程序段,相等时程序段,相等时ZF=1ZF=1执行执行L1L1程序段程序段 L2L2: ;L2程序段 助 记 符功 能 转移条件实例描述JZJE结果为零相等时转移ZF=1A=BJNZJNE结果不为零不相等时转移ZF=0ABJAJNBE高于不低于且不等于时转移CF=0and ZF=0AB 时转移JAEJNB高于等于不低于时转移CF=0 or ZF=1 AB时转移JBJNAE低于不高于且不等于时转移CF=1 and ZF=OAB时转移JBEJNA 低于或等于不高于时转移CF=1 or ZF=1AB时转移 其中:A、B为无符号数【例例5-55-5】设
17、设AXAX和和BXBX中存放的是无符号数,中存放的是无符号数,计算计算AX-BXAX-BX结果送数据段结果送数据段RESULTRESULT字变量字变量中。中。(1 1)分析:)分析: 1 1)在数据段中定义字变量)在数据段中定义字变量RESULTRESULT。2 2)在程序中将用)在程序中将用MOVMOV指令将指令将AXAX和和BXBX赋值。赋值。3 3)AXBXAXBX时作时作AX-BXAX-BX,当,当AX BXAX BX时作时作BX-BX-AXAX4 4)AXAX和和BXBX中存放的是无符号数采用无符中存放的是无符号数采用无符号数条件转移指令号数条件转移指令JAEJAE或或JNBJNB。
18、(2 2)程序流程图如图)程序流程图如图5-75-7所示。所示。图5-7例5-5流程图(3 3)根据流程图编写汇编程序:)根据流程图编写汇编程序:DATA SEGMENT DATA SEGMENT ;定义数据段;定义数据段RESULT DW RESULT DW ? DATA ENDSDATA ENDSCODE SEGMEND CODE SEGMEND ;定义代码段;定义代码段 ASSUME CSASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACK STACK STARTSTART:MOV AXMOV AX,DATADATA MOV DS MOV DS,AX A
19、X ;数据段段地址送;数据段段地址送DSDS中中 MOV AX, 1MOV AX, 1 MOV BX, 6 MOV BX, 6 CMP AX CMP AX,BX BX ;比较;比较 JAE LOP JAE LOP ;AXBXAXBX时转移时转移 XCHG AXXCHG AX,BX BX ;如果;如果AXBXAXBX,交换,交换AXAX、BXBXLOPLOP: SUB AXSUB AX,BXBX MOV RESULT MOV RESULT,AXAX MOV AX MOV AX,4C00H 4C00H ;程序结束返回;程序结束返回DOS DOS INT 21H INT 21HCODE ENDS C
20、ODE ENDS ;代码段结束;代码段结束 END STARTEND START(4 4)程序说明:)程序说明: 1 1)比较两数的大小,大数减小数,因此,当)比较两数的大小,大数减小数,因此,当AXBXAXBAB时转移时转移J G EJ G E JNL JNL 大于等于不小于时转移大于等于不小于时转移S F = O F o r S F = O F o r ZF=1ZF=1ABAB时转移时转移JLJLJNGE JNGE 小于不大于且不等于时小于不大于且不等于时转移转移SFOF and SFOF and ZF=O ZF=O ABASHU5-12D:MASM611BINSHU5-12FOUND!F
21、OUND!D:MASM611BIND:MASM611BIN(4)(4)程序说明:程序说明:1 1)该循环程序是一个)该循环程序是一个 DoDo-WhileWhile结构的循环体,先执行结构的循环体,先执行1 1遍循环体后再判遍循环体后再判断循环条件的程序。断循环条件的程序。2 2)用指令)用指令LOOPNE NEXTLOOPNE NEXT进行循环,退出循环有两种可能性:进行循环,退出循环有两种可能性:其一:当循环没结束时其一:当循环没结束时CX0CX0找到了空格,此时找到了空格,此时ZF=1ZF=1,转到,转到NEXTNEXT标号。标号。其二:当循环结束时其二:当循环结束时CX=0CX=0没找
22、到空格,此时没找到空格,此时ZF=0ZF=0,退出,接着执行下一,退出,接着执行下一条指令。条指令。因此:退出循环是找到退出还是没找到退出?是由因此:退出循环是找到退出还是没找到退出?是由JNZ NJNZ N-FOUNDFOUND再进行判再进行判别。别。3 3)在循环体中,由于)在循环体中,由于INC SIINC SI指令不能放在比较指令指令不能放在比较指令CMP ALCMP AL,BUFF+SIBUFF+SI后面,因后面的循环令要根据比较指令的比较结果来决定转移方向,因此后面,因后面的循环令要根据比较指令的比较结果来决定转移方向,因此,加,加1 1指令只能放在比较指令的前面,所以,指令只能放
23、在比较指令的前面,所以,SISI的初始值为的初始值为-1-1。指令功能指令功能指令指令 格式格式 执行操作执行操作进位位置进位位置0 0CLCCLCCF0CF0进位位置进位位置1 1STCSTCCF1CF1进位位求反进位位求反CMCCMCCFCFCFCF方向标志置方向标志置0 0CLDCLDDF0DF0方向标志置方向标志置1 1STDSTDDF1DF1中断标志置中断标志置0 0CLICLIIF0IF0中断标志置中断标志置1 1STISTIIF1IF1表表5-8 5-8 标志处理指令标志处理指令(1 1)重复前缀)重复前缀 REPREP指令指令 REP REP 串操作指令串操作指令 其中其中 :
24、串操作指令包括:串操作指令包括:MOVSMOVS、STOSSTOS、LODSLODS、INSINS、OUTSOUTS。指令功能:指令功能: 重复执行串操作指令,直到计数器重复执行串操作指令,直到计数器CXCX(或(或EAXEAX)的内容为)的内容为0 0为止。为止。操作步骤:操作步骤:)CX0CX0时,执行串操作指令。时,执行串操作指令。2 2) CX-1CXCX-1CX3 3) 重复执行重复执行1 1)、)、2 2),直到),直到CX=0CX=0为止。为止。需要注意的问题:需要注意的问题:1 1)当串操作指令)当串操作指令MOVSMOVS、STOSSTOS、LODSLODS、INSINS、O
25、UTSOUTS的前面不加重复前缀的前面不加重复前缀REPREP时,时,只做只做1 1次操作,实际上没有达到串操作的目的,只有用重复前缀指令次操作,实际上没有达到串操作的目的,只有用重复前缀指令REPREP与串操作与串操作指令的配合使用才能进行批量串处理。指令的配合使用才能进行批量串处理。2 2)重复前缀指令)重复前缀指令REPREP只能位于串操作指令之前。只能位于串操作指令之前。3 3)重复次数放在)重复次数放在CXCX(或(或ECXECX)中,如果是字节重复传送则串长送)中,如果是字节重复传送则串长送CXCX(或(或ECXECX);字重复传送则串长除;字重复传送则串长除2 2送送CXCX(或
26、(或ECXECX);双字重复传送则串长除);双字重复传送则串长除4 4送送CXCX(或(或ECXECX)。需要注意的问题!(2 2)重复前缀)重复前缀REPZ/REPEREPZ/REPE指令指令 指令指令格式:格式: REPZ/REPE REPZ/REPE 串操作指令串操作指令 其中 :串操作指令包括:CMPS或SCAS。指令功能:当CX0且ZF=1时重复串操作指令,直到CX=0或ZF=0时退出。操作步骤:操作步骤:1 1)判)判CX=0CX=0或或ZF=1ZF=1时退出,否则往下执行。时退出,否则往下执行。2 2)CX-1CXCX-1CX3 3)执行后面的串操作指令重复)执行后面的串操作指令
27、重复1 1)3 3)。)。(4 4)串传送指令)串传送指令指令格式:指令格式: MOVS DSTMOVS DST,SRCSRC MOVSB /MOVSW/ MOVSD MOVSB /MOVSW/ MOVSD其中其中 :MOVSDMOVSD指令用于指令用于8038680386以上版本。以上版本。指令功能:将源操作指令功能:将源操作DSDS:SISI所指的内容送到所指的内容送到ESES:DIDI所指的目的位置上去,即:所指的目的位置上去,即:SIDISIDI。修改地址。修改地址SISI和和DIDI,使之指向下一个单元,即:,使之指向下一个单元,即:SISInSInSI, DIDInDInDI。其中
28、:其中:n=1n=1,2 2,4 4。当。当n=1n=1时为字节操作,当时为字节操作,当n=2n=2时为字操作,时为字操作,n=4n=4时为双字操作时为双字操作。字节操作:字节操作:ESES:DI DSDI DS:SISI;当当DF=0DF=0时时SI+1SISI+1SI, DI+1DIDI+1DI,当,当DF=1DF=1时时SI-1SISI-1SI, DI-1DI DI-1DI 。字操作:字操作: ESES:DI DSDI DS:SISI;当当DF=0DF=0时时SI+2SISI+2SI, DI+2DIDI+2DI,当,当DF=1DF=1时时SI-2SISI-2SI, DI-2DI DI-2
29、DI 。双字操作:双字操作:ESES:DI DSDI DS:SISI; 当当DF=0DF=0时时SI+4SISI+4SI,DI+4DIDI+4DI,当,当DF=1DF=1时时SI-4SISI-4SI, DI-4DI DI-4DI 。MOVSMOVS指令:根据操作数的类型属性,可以进行字节、字和双字操作。指令:根据操作数的类型属性,可以进行字节、字和双字操作。 当当DF=0DF=0时用时用+,使地址增,使地址增,DF=1DF=1时用时用-使地址减。使地址减。需要注意的问题!(5 5)串存储指令)串存储指令指令格式:指令格式: STOSB/ STOSW / STOSDSTOSB/ STOSW /
30、STOSD 其中 :STOSD指令用于80386以上版本。指令功能:字节操作:字节操作:ESES:DIALDIAL;当;当DF=0DF=0时时DI+1DIDI+1DI,当,当DF=1DF=1时时DI-1DI DI-1DI 。字操作:字操作: ESES:DIAXDIAX;当;当DF=0DF=0时时DI+2DIDI+2DI,当,当DF=1DF=1时时DI-2DI DI-2DI 。双字操作:双字操作:ESES:DIEAXDIEAX;当;当DF=0DF=0时时DI+4DIDI+4DI,当,当DF=1DF=1时时DI-4DI DI-4DI 。STOS指令根据目的操作数的类型属性,可以进行字节、字和双字操
31、作。当DF=0时用+,使地址增,DF=1时用-使地址减。需要注意的问题:需要注意的问题: 串存储指令当与REP联用时,把AL、AX或 EAX的内容存入一个长度为CX的缓冲区中。该指令不涉及SI寄存器。 需要注意的问题!(6 6)串装入指令)串装入指令指令格式:指令格式: LODSB/ LODSW / LODSDLODSB/ LODSW / LODSD 其中 :STOSD指令用于80386以上版本。指令功能:字节操作:AL DS:SI , SI1SI。字操作: AX DS:SI, SI2SI。双字操作:EAXDS:SIEAX, SI4SI。STOS指令根据源操作数(SRC)的类型属性,可以进行字
32、节串、字串和双字串的装入操作。 当DF=0时用+,使地址增,DF=1时用-使地址减。LODS SRCLODS SRC需要注意的问题:需要注意的问题: 串装入指令一般不与REP联用,假设有指令:REP LODSB 是将DS:SI的值重复传送到AL中,共传送CX个字节,实际上最终结果只是把源串中的最后一个字节送AL中,其中CX中存放的是源串的长度。该指令不涉及DI寄存器。需要注意的问题!(7 7)串比较指令)串比较指令指令格式:指令格式: CMPSB/ CMPSW / CMPSDCMPSB/ CMPSW / CMPSD 其中其中 :CMPSDCMPSD指令用于指令用于8038680386以上版本。
33、以上版本。指令功能:指令功能:字节操作:将源串(字节操作:将源串( DSDS:SISI)减目的串()减目的串(ESES:DIDI),结果不送回,),结果不送回, SISI1SI1SI, DIDI1DI1DI。字操作:字操作: 将源串(将源串( DSDS:SISI)减目的串()减目的串(ESES:DIDI),结果不送回,),结果不送回, SISI2SI2SI, DIDI2DI2DI。双字操作:将源串(双字操作:将源串( DSDS:SISI)减目的串()减目的串(ESES:DIDI),结果不送回,),结果不送回, SISI4SI4SI, DIDI4DI4DI。 CMPSCMPS指令根据操作数的类型
34、属性,可以进行字节、字和双字操作,即进行指令根据操作数的类型属性,可以进行字节、字和双字操作,即进行OPR1-OPR2OPR1-OPR2操作,结果不送回,只影响标志寄存器。操作,结果不送回,只影响标志寄存器。 当当DF=0DF=0时用时用+ +,使地址增,使地址增,DF=1DF=1时用时用- -使地址减。使地址减。需要注意的问题:需要注意的问题:串比较指令与串比较指令与REPE/REPZREPE/REPZ(REPNE/REPNZREPNE/REPNZ)联用,在使用串比较指令时,后面一)联用,在使用串比较指令时,后面一定跟着条件转移指令,这样才能发挥串比较指令的作用。定跟着条件转移指令,这样才能
35、发挥串比较指令的作用。需要注意的问题!(8 8)串搜索指令)串搜索指令指令格式:指令格式: SCASB/ SCASW / SCASDSCASB/ SCASW / SCASD 其中其中 :SCASDSCASD指令用于指令用于8038680386以上版本。以上版本。指令功能:指令功能:将将AL/AX/EAXAL/AX/EAX中的数据减去由中的数据减去由ESES:DIDI为指针的目的操作数,不送为指针的目的操作数,不送回,只影响标志寄存器。回,只影响标志寄存器。字节操作:将字节操作:将ALAL的内容减的内容减ESES:DIDI中的一个字节,结果不送回中的一个字节,结果不送回, DIDI1DI1DI。
36、字操作:将字操作:将AXAX的内容减的内容减ESES:DIDI中的一个字,结果不送回,中的一个字,结果不送回, DIDI2DI2DI。双字操作:将双字操作:将EAXEAX的内容减的内容减ESES:DIDI中的一个双字,结果不送回中的一个双字,结果不送回, DIDI4DI4DI。SCASSCAS指令根据指令根据DST DST 操作数的类型属性,可以进行字节、字和双操作数的类型属性,可以进行字节、字和双字操作,即进行字操作,即进行ALAL(或(或AXAX或或EAXEAX)的内容减)的内容减DSTDST操作,结果不送回,操作,结果不送回,只影响标志寄存器。只影响标志寄存器。 当当DF=0DF=0时用
37、时用+ +,使地址增,使地址增,DF=1DF=1时用时用- -使地址减。使地址减。需要注意的问题!(9 9)串输入指令)串输入指令指令格式:指令格式: INSB/ INSW / INSDINSB/ INSW / INSD 其中 :INSD指令用于80386以上版本。指令功能:1 1)将)将I/OI/O端口的由端口的由DXDX端口号所指的端口号所指的I/OI/O空间的字节、字、双字送到空间的字节、字、双字送到ESES:DIDI单单元中。元中。字节操作:将I/O端口DX的一个字节送目的操作数ES:DI,DI1DI。字操作: 将I/O端口DX的一个字送目的操作数ES:DI, DI2DI。双字操作:将
38、I/O端口DX的一个双字送目的操作数ES:DI,DI4DI。2 2)INSINS指令根据操作数的类型属性,可以进行字节、字和双字操作,即进行指令根据操作数的类型属性,可以进行字节、字和双字操作,即进行DXDX送目的操作数送目的操作数DSTDST中。中。 当DF=0时用+,使地址增,DF=1时用-使地址减。需要注意的问题:需要注意的问题:串输入指令与REP联用时,可以把字节串(或字串或双字串)送缓冲区中,在使用该指令时,应注意I/O端口的处理速度必须与REP INS指令的执行速度相匹配,该指令不影响影响标志寄存器。需要注意的问题!(1010)串输出指令)串输出指令指令格式:指令格式: OUTSB
39、/ OUTSW / OUTSDOUTSB/ OUTSW / OUTSD 其中 :OUTSD指令用于80386以上版本。指令功能:指令功能:1 1)将源变址寄存器所指的内存字节(或字或字节)单元的内容送)将源变址寄存器所指的内存字节(或字或字节)单元的内容送I/OI/O端口的由端口的由DXDX端口号所指的端口中去。端口号所指的端口中去。字节操作:将源操作数字节操作:将源操作数ESES:SI SI 的一个字节送的一个字节送I/OI/O端口端口DX DX , SISI1SI1SI。字操作:字操作: 将源操作数将源操作数ESES:SI SI 的一个字送的一个字送I/OI/O端口端口DX DX , SI
40、SI2SI2SI。双字操作:将源操作数双字操作:将源操作数ESES:SI SI 的一个双字送的一个双字送I/OI/O端口端口DX DX , SISI4SI4SI。2 2)OUTSOUTS指令根据源操作数指令根据源操作数SRCSRC的类型属性,可以进行字节、字和双字操作,即的类型属性,可以进行字节、字和双字操作,即进行进行SRCSRC送送DXDX所指的端口中。所指的端口中。 当当DF=0DF=0时用时用+ +,使地址增,使地址增,DF=1DF=1时用时用- -使地址减。使地址减。需要注意的问题:需要注意的问题: 串输出指令与REP联用时,可以把存储器中字节串(或字串或双字串)送DX所指的I/O端
41、口中,应注意I/O端口的处理速度必须与REP OUTS指令的执行速度相匹配,该指令不影响影响标志寄存器。 OUTS DXOUTS DX,SRC SRC 需要注意的问题!串操作及重复前缀指令小结:串操作及重复前缀指令小结:(1 1)初始化:)初始化: 1 1)源操作串的偏移地址放在)源操作串的偏移地址放在SISI中,目操作串的偏移地中,目操作串的偏移地址放在址放在DIDI中。中。2 2)设定方向标志)设定方向标志DFDFCLDCLD指令:使指令:使DF=0 DF=0 ;串操作数地址自动增加,用于从前;串操作数地址自动增加,用于从前向后执行(低地址到高地址)。向后执行(低地址到高地址)。STDST
42、D指令:使指令:使DF=1 DF=1 ;串操作数地址自动减,用于从后向;串操作数地址自动减,用于从后向前执行(高地址到低地址)。前执行(高地址到低地址)。3 3)设置循环控制常数)设置循环控制常数CXCX值,值,CXCX为串的长度。为串的长度。【例5-13 】编写程序把数据段BLOCK数据区中的字数据按正数、负数取出,分别送到正数缓冲区PLUS-BUF和负数缓冲区MINUS-BUF中。(1)分析:1)首先在数据段中定义3个缓冲区,源串缓冲区BLOCK、目的串缓冲区PLUS-BUF、目的串缓冲区MINUS-BUF。2)初始化操作;包括:源、目的串偏移地址分别送SI、DI、BX。 源串长度送CX。
43、 设置方向标志CLD。3)程序设计思路:用LODSW 指令将源串中的一个字取出送AX,判AX中的最高位是否为1,为1是负数,否则为正数,然后分别存到PLUS-BUF和INUS-BUF缓冲区中(2)程序算法流程图如图5-19示。(3)根据流程图编写汇编程序:DATA SEGMENT ;定义数据段BLOCK DW -5,0FF11H,3,0C3H,-9,34H,88H,2556,-656,0A56H,-9,-78COUNT EQU ($- BLOCK)/2PLUS_BUF DB 10H DUP(?)MINUS_BUF DB 10H DUP(?)DATA ENDSCODE SEGMENT ;定义代码
44、段 ASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA MOV DS,AX ;数据段段地址送DS中 MOV ES,AX MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS_BUF MOV BX,OFFSET MINUS_BUF MOV CX,COUNT CLDAGAIN: LODSW ;SI AX,SI+2SI TEST AX,8000H ;保留符号位,屏蔽其它位,只影响标志 JNE MINUS ;结果不为0是负数,转到存负数 STOSW ;存正数AXDI,DI+2DI JMP EXT MINUS: XCHG BX,DI
45、;BX(负数地址)与DI地址交换 STOSW ;存负数AXDI,DI+2DI XCHG BX,DI ;再将地址交换过来EXT: DEC CX ;CX-1CX, JNZ AGAIN ;DX0继续取下一个数,否则退出 MOV AX,4C00H ;程序结束返回DOS INT 21HCODE ENDS ;代码段结束 END START 执行结果:执行结果:通过通过DEBUGDEBUG或或CodeViewCodeView看到运行结果。看到运行结果。(4)程序说明:1)该循环程序中的目的串操作数有两组,分别放在PLUS_BUF 和MINUS_BUF缓冲区中,无论判断出是正数还是负数,都是用存串操作指令ST
46、OSB来完成,因此就存在目的变址寄存器DI与BX交换的操作,因为STOSB指令要求将AX内容送DI所指的的单元中,然后DI+2DI。2) COUNT 为BLOCK数据区中字的个数,在数据段中定义: COUNT EQU $- BLOCK ;此时COUNT为BLOCK数据区中字节的个数因此:求BLOCK数据区中字的个数时要除2。 【例例5-14 5-14 】将例将例5-125-12中的查找中的查找“空格空格”的操作用串搜索指令来完成,找到在屏幕上的操作用串搜索指令来完成,找到在屏幕上输出输出FOUND!FOUND!,并输出,并输出“空格空格”的个数,没找的个数,没找到则输出到则输出NOT FOUN
47、D!NOT FOUND!。 (1)(1)分析分析 1 1 ) 查 找 时 采 用 串 搜 索 指 令) 查 找 时 采 用 串 搜 索 指 令 R E P N Z R E P N Z SCASB SCASB ,因此在使用该指令之前要设置:,因此在使用该指令之前要设置: MOV AXMOV AX,DATADATA MOV DS MOV DS,AXAX MOV ES MOV ES,AX AX ;将;将ESES指向指向DSDS MOV CX MOV CX,N N ;循环常数送;循环常数送CXCX CLD CLD ;设置增量标志;设置增量标志 MOV DIMOV DI,OFFSET BUFF OFFS
48、ET BUFF ;串的偏移地址;串的偏移地址DIDI MOV AL MOV AL,20H20H ;要查找的字符;要查找的字符ALAL 2 2)重复搜索)重复搜索REPNZREPNZ:当:当CX0CX0且且ZF=0ZF=0时时重复串操作指令,直到重复串操作指令,直到CX=0CX=0或或ZF=1ZF=1时退出搜时退出搜索。索。 (2)(2) 程序算法流程图如图程序算法流程图如图5-215-21所示。所示。(3)(3)根据流程图编写汇编程序:根据流程图编写汇编程序:STACK SEGMENT STACKSTACK SEGMENT STACK DW 100 DUP DW 100 DUP(?)(?)ST
49、ACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTBUFF DB BUFF DB How are youN EQU $-BUFF N EQU $-BUFF ;共有;共有N N个元素个元素FOUND DB FOUND DB FOUND FOUND,0DH0DH,0AH0AH,$ $N N-FOUND DB FOUND DB NO FOUND NO FOUND ,0DH0DH,0AH0AH,$ $ DATA ENDSDATA ENDSCODE SEGMENT CODE SEGMENT CODECODE ASSUME CS:CODE ASSUME CS:CODE,D
50、SDS:DATADATA,ESES:DATADATA,SSSS:STACKSTACK START: MOV AXSTART: MOV AX,DATADATA MOV DS MOV DS,AXAX MOV ES MOV ES,AXAX MOV CX MOV CX,N N ;循环常数送;循环常数送CXCX CLD CLD MOV DI MOV DI,OFFSET BUFFOFFSET BUFF MOV AL MOV AL,20H20H MOV BX MOV BX,0 0 ;BXBX中为空格的个数,先清零中为空格的个数,先清零LP1: REPNE SCASB LP1: REPNE SCASB ;当;
51、当CX0CX0且且ALESALES:DI DI 继续搜索继续搜索 JNE DISP JNE DISP ;当;当ALESALES:DIDI时(时(ZF=0ZF=0), ,未找到,转到未找到,转到DISPDISP显示显示 INC BX INC BX ;找到,;找到,BXBX中空格的个数加中空格的个数加1 1 CMP CX,0 CMP CX,0 ;判断是否扫描完;判断是否扫描完 JNZ LP1 JNZ LP1 ;未扫描完,循环扫描;未扫描完,循环扫描 ;扫描完,判断显示;扫描完,判断显示DISPDISP: CMP BX,0 CMP BX,0 ;判断是否找到空格(;判断是否找到空格(BX=0?BX=0
52、?) JZ DISP_N JZ DISP_N ;未找到,转;未找到,转DISP_NDISP_N,显示,显示not found!not found! MOV DX MOV DX,OFFSET FOUND OFFSET FOUND ;找到,显示;找到,显示found!found! MOV AH MOV AH,09H 09H INT 21H INT 21H ;把;把BXBX中的空格个数转换成十进制显示出来(设结果不超过两位数)中的空格个数转换成十进制显示出来(设结果不超过两位数) MOV AXMOV AX,BX BX ;个数除以;个数除以1010 MOV BL MOV BL,1010 DIV BL
53、DIV BL MOV BH MOV BH,AH AH ;把个位数保存到;把个位数保存到BHBH中中 MOV AHMOV AH,2 2 ;显示十位数;显示十位数 MOV DLMOV DL,ALAL OR DL OR DL,30H30H INT 21H INT 21H MOV DL MOV DL,BH BH ;显示个位数;显示个位数 OR DLOR DL,30H30H MOV AH MOV AH,,2,2 INT 21H INT 21H JMP EXIT JMP EXITDISP_N: MOV DXDISP_N: MOV DX,OFFSET NOFFSET N-FOUND FOUND ;没找到,显
54、示;没找到,显示not found!not found! MOV AH MOV AH,09H 09H INT 21H INT 21HEXITEXIT: MOV AX, 4C00H MOV AX, 4C00H ;返回;返回DOSDOS状态状态 INT 21HINT 21H CODE ENDS CODE ENDS END START END START 执行结果:执行结果:D:MASM611BINSHU5-14D:MASM611BINSHU5-14FOUND!FOUND!0202D:MASM611BIND:MASM611BIN(4)(4)程序说明:程序说明:1 1)该程序的查找是用是串搜索指令)该
55、程序的查找是用是串搜索指令SCASB SCASB ,在该指令中的被查,在该指令中的被查找的串操作数的偏移地址必须放找的串操作数的偏移地址必须放在在DIDI中,要搜索的字符应放在中,要搜索的字符应放在ALAL中。中。2 2)退出)退出REPNE SCASB REPNE SCASB 指令有两种可能性:指令有两种可能性:其一;当循环没结束时其一;当循环没结束时CX0CX0找到了空格,此时找到了空格,此时ZF=1ZF=1,则退出。,则退出。其二;当循环结束时其二;当循环结束时CX=0CX=0没找到空格,此时没找到空格,此时ZF=0ZF=0,则退出。因此,则退出。因此,用条件转移指令再来判断是找到了退出
56、,还是没找到退出。,用条件转移指令再来判断是找到了退出,还是没找到退出。【例例5-15 5-15 】设有设有2 2个缓冲区个缓冲区BUF1BUF1和和BUF2BUF2,用,用REP MOVSDREP MOVSD指令将缓冲区指令将缓冲区BUF1BUF1的内容的内容传送到传送到BUF2BUF2中。中。 (1)(1)分析:分析:1 1)设缓冲区)设缓冲区 BUF1BUF1中有中有N N个双字元素,则在数据段中定义:个双字元素,则在数据段中定义: BUF1 DD 11111111H,22222222H,33333333H BUF1 DD 11111111H,22222222H,33333333H 用用
57、EQUEQU伪指令获取伪指令获取BUF1BUF1的长度的长度N N,由于,由于EQUEQU获取的是字节个数,因此除获取的是字节个数,因此除4 4得到双字个得到双字个数:数:N EQU N EQU ($-BUF1$-BUF1)/4 /4 2 2)串传送时采用串传送指令)串传送时采用串传送指令REP MOVSD REP MOVSD ,因此在使用该指令之前要设置:,因此在使用该指令之前要设置: MOV AXMOV AX,DATADATAMOV DSMOV DS,AXAXMOV ESMOV ES,AX AX ;将;将ESES指向指向DSDSMOV CXMOV CX,N N ;循环常数送;循环常数送CX
58、CXCLD CLD ;设置增量标志;设置增量标志MOV SIMOV SI,OFFSET BUF1 OFFSET BUF1 ;源串的偏移地址;源串的偏移地址SISIMOV DIMOV DI,OFFSET BUF2 OFFSET BUF2 ;目的串的偏移地址;目的串的偏移地址DIDI(2)(2)程序算法流程图如图程序算法流程图如图5-225-22所示。所示。(3)(3)根据流程图编写汇编程序:根据流程图编写汇编程序: MODEL SMALLMODEL SMALL 386386 DATADATA BUF1 DD 11111111H,22222222H,33333333H BUF1 DD 111111
59、11H,22222222H,33333333H N EQU N EQU ($-BUF1$-BUF1)/4 /4 ;共有;共有N N个元素个元素 BUF2 DD N DUPBUF2 DD N DUP(?)(?) CODE CODE ;代码段;代码段 STARTUPSTARTUP MOV AX MOV AX,DATADATA MOV DS MOV DS,AXAX MOV ES MOV ES,AXAX MOV SI MOV SI,OFFSET BUF1OFFSET BUF1 MOV DI MOV DI,OFFSET BUF2OFFSET BUF2 MOV CX MOV CX, N N ;循环常数送;
60、循环常数送CXCX CLD CLD REP MOVSD REP MOVSD EXIT EXIT ;返回;返回DOSDOS END END 执行结果:执行结果:3 3)根据流程图编写汇编程序:)根据流程图编写汇编程序:DATA SEGMENTDATA SEGMENTARRAY DB 0,0,0,7,0,0,4,25,34ARRAY DB 0,0,0,7,0,0,4,25,34N EQU $-ARRAY N EQU $-ARRAY ;数组元素的个数为;数组元素的个数为N NSTRING DB NOT FOUND!,$ STRING DB NOT FOUND!,$ DATA ENDSDATA END
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第十单元 第38讲 古代世界的帝国与文明的交流
- 单招护理笔试题及答案
- 家政模拟考试试题及答案
- 中学班主任主题班会课件:感恩教育主题班会
- 粉色卡通风感恩主题班会(带音乐)
- 东盟跨境数字棕榈油可持续认证跨国线上提交系统对接-基于印尼可持续棕榈油实证
- 齐齐哈尔市梅里斯达斡尔族区2025年数学四年级下学期期中达标测试试题含答案解析
- 皮手套及皮装饰制品制造行业(2025年)深度分析报告
- ISO 220972023 建筑物的热绝缘.反射绝缘产品.热性能的测定标准立项发展报告
- ISO 94672023 多位置小型发动机的排气系统.火花消除器的试验程序和性能要求标准立项发展报告
- 化纤工业安全培训课件
- 农业产业化项目融资方案范文
- 2025年普通高校招生全国统一考试数学试题(北京卷)(含答案)
- 城市轨道交通智慧车站认知课件
- 2024风力发电场后评价及改造技术规范
- 延长石油招聘笔试试题
- 项目实施、验收组织方案
- 2024年阿维菌素市场分析:全球阿维菌素市场规模约为7.5亿美元
- GB/T 21837-2023铁磁性钢丝绳电磁检测方法
- 康复治疗师考试知识点汇总
- 传播学教程课件
评论
0/150
提交评论