微机原理与接口技术(楼顺天)-第4章4_第1页
微机原理与接口技术(楼顺天)-第4章4_第2页
微机原理与接口技术(楼顺天)-第4章4_第3页
微机原理与接口技术(楼顺天)-第4章4_第4页
微机原理与接口技术(楼顺天)-第4章4_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、本教案内容本教案内容第第4 4章章 汇编语言程序设计汇编语言程序设计w汇编语言程序设计基础汇编语言程序设计基础n源程序的汇编、连接与调试源程序的汇编、连接与调试n分支程序设计技术分支程序设计技术n循环程序设计技术循环程序设计技术n子程序设计技术子程序设计技术1.综合程序设计示例综合程序设计示例 循环结构程序设计针对的是处理一些循环结构程序设计针对的是处理一些重复重复进进行的过程的操作。采用循环结构设计的程序,其行的过程的操作。采用循环结构设计的程序,其长度缩短了,不仅长度缩短了,不仅节省了内存节省了内存,也使得程序的可,也使得程序的可读性大大提高。使用循环结构形式设计程序时,读性大大提高。使用

2、循环结构形式设计程序时, 通常将循环程序划分三个部分通常将循环程序划分三个部分: 循环结构程序设计循环结构程序设计4.4 循环程循环程序设计技术设计技术 循环的初始化部分:主要为循环所需的变量赋初值。循环的初始化部分:主要为循环所需的变量赋初值。 循环体:程序所要完成的主要工作部分,循环体:程序所要完成的主要工作部分, 这一部分的这一部分的内容是由所要处理的问题来确定的,这一部分的执行结果可内容是由所要处理的问题来确定的,这一部分的执行结果可能影响到循环是否继续进行。能影响到循环是否继续进行。 循环控制部分:这一部分主要是以条件表达式的结果循环控制部分:这一部分主要是以条件表达式的结果作为是否

3、结束循环的条件。在事先知道了循环次数的情况下,作为是否结束循环的条件。在事先知道了循环次数的情况下, 可采用循环计数控制循环的结束;在事先不知道循环次数的可采用循环计数控制循环的结束;在事先不知道循环次数的情况下,多采用结果及给定特征作为条件来控制循环的结束。情况下,多采用结果及给定特征作为条件来控制循环的结束。 图图 4 - 3 可以帮助我们很好地理解循环结构程序。可以帮助我们很好地理解循环结构程序。 循环结构程序设计循环结构程序设计4.4 循环程循环程序设计技术设计技术 图图 4 - 3循环程序结构循环程序结构 (a) 单循环结构;单循环结构; (b) 双循环结构双循环结构预置循环次数其他

4、准备工作循环体循环减1计数结果为0?退出循环NY预置内循环次数其他准备工作循环体内循环减1计数结果为0?NY预置外循环次数其他准备工作外循环减1计数结果为0?退出循环YN(a)(b)单循环结构下面举一个例子说明单循环结构程序设计的方法。下面举一个例子说明单循环结构程序设计的方法。 假设从假设从BUF单元开始为一个单元开始为一个ASCII码字符串,码字符串, 找出其中的最大数送屏幕显示。找出其中的最大数送屏幕显示。 程序流程图如图程序流程图如图 所示。所示。 数据区首址 D S:BX无符号最小数0 A L数据个数 CXBX A L?BX A LBX 1 BXCX 1 CXCX 0?显示结果返回

5、D O SNNYY程序如下:程序如下: DATA SEGMENT BUF DB ABCREF873 COUNT EQU $-BUF ; 统计串长度统计串长度 MAX DB MAX ,0DH, 0AH, $DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA BEG: MOV AX, DATA MOV DS, AX MOV AL, 0 ; 无符号最小数无符号最小数0AL LEA BX, BUF ; 串首址偏移量串首址偏移量BX MOV CX, COUNT ; 串长度串长度CXLAST: CMP BX, AL ; 比较比较 JC NEXT MOV AL, BX

6、 ; 大数大数AL NEXT: INC BX LOOP LAST ; 循环计数循环计数 MOV MAX+4, AL ; 最大数最大数MAX+4单元单元 MOV AH, 9 MOV DX, OFFSET MAX INT 21H ; 显示结果显示结果 MOV AH, 4CH INT 21H ; 返回返回DOSCODE ENDSEND BEG 在上述程序中,在上述程序中,ASCII应看成无符号数,无符号数的最应看成无符号数,无符号数的最小值为小值为0, 因此,在进行第一次比较时,把因此,在进行第一次比较时,把0送送AL寄存器,寄存器, 各个数都和各个数都和AL比较,每次比较后的较大的数放入比较,每次

7、比较后的较大的数放入AL寄存器寄存器中,中,N个数需要比较个数需要比较N次,若把第一个数送次,若把第一个数送AL作为初始比作为初始比较对象,那么较对象,那么N个数需要比较个数需要比较N-1次。次。 4.4 循环程循环程序设计技术设计技术 对一组数据的操作可以采用循环结构来实现,其数据个对一组数据的操作可以采用循环结构来实现,其数据个数为循环次数。每次循环时要不断地修改指针,而且经常会数为循环次数。每次循环时要不断地修改指针,而且经常会出现同时使用多个指针地情况。指针的正确使用是关系到程出现同时使用多个指针地情况。指针的正确使用是关系到程序设计好坏的重要因素序设计好坏的重要因素可可直接采用直接采

8、用的指针有的指针有4 4个个: SISI、DIDI、BX BX 、BP BP 默认默认段寄存器为段寄存器为 : DSDS SS SS 当程序中只需要一个指针时,可以使用当程序中只需要一个指针时,可以使用SISI、DIDI和和BXBX中的中的任意一个;任意一个; 当程序需要两个指针时,一般会要求程序从源操作数中当程序需要两个指针时,一般会要求程序从源操作数中取出要处理的数据,处理结果存放在另一个目的存储区域中,取出要处理的数据,处理结果存放在另一个目的存储区域中,这样可以将这样可以将SISI指向源操作数区域,指向源操作数区域,DIDI指向目的操作数区域;指向目的操作数区域;当程序需要当程序需要3

9、 3个指针时,可以将个指针时,可以将BXBX用作为第三个指针;用作为第三个指针;4.4 循环程序设计技术循环程序设计技术当需要当需要4个以上的指针时,应该仔细分析数据区域的操作特个以上的指针时,应该仔细分析数据区域的操作特点,找出可以采用同一个指针处理的多个区域。点,找出可以采用同一个指针处理的多个区域。指针的指针的应用方式应用方式有两种:有两种:(1)指针表示绝对地址:将指针指向存储单元的段内偏移地指针表示绝对地址:将指针指向存储单元的段内偏移地 址,例如:址,例如: LEA SI, BUFFER MOV AX, SI这样,指针这样,指针SI的值表示缓冲区的值表示缓冲区BUFFER的偏移地址

10、,通过的偏移地址,通过SI可以进行存储单元的访问。可以进行存储单元的访问。(2)指针表示相对地址:将指针清零,表示指向存储区域内指针表示相对地址:将指针清零,表示指向存储区域内的相对偏移地址,例如:的相对偏移地址,例如:XORSI, SIMOV AX, BUFFERSI4.4 循环程序设计技术循环程序设计技术这样,指针这样,指针SISI就不是就不是BUFFERBUFFER所专用,而是可以同时供其它所专用,而是可以同时供其它存储区域使用,例如可以通过:存储区域使用,例如可以通过:MOV MOV BX, SOURCESIBX, SOURCESI访问另一个存储区域访问另一个存储区域SOURCESOU

11、RCE。例例4 44 4 在在SOURCESOURCE存储区中保存有存储区中保存有500500个字节数据,现在个字节数据,现在要求将数据中的要求将数据中的0FFH0FFH值去掉,并传送到值去掉,并传送到DESTINATIONDESTINATION缓冲区缓冲区中,其有效数据个数保存在中,其有效数据个数保存在NUMBERNUMBER中。中。解解:将:将SISI指向源操作数区域,指向源操作数区域,DIDI指向目的操作数区域,每指向目的操作数区域,每次传送一个字节,但在传送前对其内容进行检测,如果为次传送一个字节,但在传送前对其内容进行检测,如果为0FFH0FFH,则不传送。在传送的同时要使有效数据个

12、数的计数,则不传送。在传送的同时要使有效数据个数的计数单元单元NUMBERNUMBER进行加进行加1 1。汇编语言程序如下:。汇编语言程序如下:4.4 循环程序设计技术循环程序设计技术 N=500N=500STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100H DUP(?) DW 100H DUP(?)TOP LABEL WORDTOP LABEL WORDSTACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTSOURCE LABEL BYTESOURCE LABEL BYTE;假设有;假设有500

13、500个数据,并利用重复个数据,并利用重复 X=17 X=17 ;宏随机产生宏随机产生 REPT 500REPT 500 X=(X+97) mod 256 X=(X+97) mod 256 DB X DB X ENDM ENDMDESTINATIONDESTINATIONDB N DUP(?)DB N DUP(?)NUMBERNUMBERDW ?DW ?DATA ENDSDATA ENDS4.4 循环程序设计技术循环程序设计技术CODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:D

14、ATA,ES:DATA,SS:STACKSTART:START: MOV AX, DATA MOV AX, DATA MOV DS, AX MOV DS, AX MOV ES, AX MOV ES, AX MOV AX, STACK MOV AX, STACK MOV SS, AX MOV SS, AX LEA SP,TOP LEA SP,TOP XOR AX,AX XOR AX,AX;用户编写的程序;用户编写的程序 MOV NUMBER,AXMOV NUMBER,AX MOV CX,N MOV CX,N LEA SI,SOURCE LEA SI,SOURCE LEA DI,DESTINATI

15、ON LEA DI,DESTINATION4.4 循环程序设计技术循环程序设计技术MOVE1:MOVE1:MOV AL,SIMOV AL,SIINC SIINC SICMP AL,0FFHCMP AL,0FFHJZ MOVE2JZ MOVE2MOV DI,ALMOV DI,ALINC DIINC DIINC NUMBERINC NUMBERMOVE2:MOVE2:LOOP MOVE1LOOP MOVE1MOVE_END:MOVE_END:MOV AH,4CHMOV AH,4CH;返回;返回DOSDOS操作系统操作系统INT 21HINT 21HCODE ENDSCODE ENDS END ST

16、ART END START双循环结构-冒泡排序 根据循环程序的嵌套层数不同,可以将循环程根据循环程序的嵌套层数不同,可以将循环程序的结构分成单循环、双循环和多重循环。上序的结构分成单循环、双循环和多重循环。上面介绍的例子是单循环的结构,下面举例说明面介绍的例子是单循环的结构,下面举例说明如何进行双重循环的程序设计假设需要对无序如何进行双重循环的程序设计假设需要对无序表中的元素排序,冒泡排序是最常用的一种方表中的元素排序,冒泡排序是最常用的一种方法。法。 设从地址设从地址ARRAY开始的内存缓冲区中有一个字数组,开始的内存缓冲区中有一个字数组, 要使该数据表中的要使该数据表中的N个元素按照从大到

17、小的次序排列,用个元素按照从大到小的次序排列,用冒泡算法显示的过程叙述如下:冒泡算法显示的过程叙述如下: 从第一个数开始依次进行相邻两个数的比较从第一个数开始依次进行相邻两个数的比较, 即第一个即第一个数与第二个数比较数与第二个数比较, 第二个数与第三个数比较第二个数与第三个数比较 ,比较,比较时若两个数的次序符合排序要求,则不做任何操作;若次时若两个数的次序符合排序要求,则不做任何操作;若次序不对,就交换这两个数的位置。经过这样一遍全表扫描序不对,就交换这两个数的位置。经过这样一遍全表扫描比较后,最大的数放到了表中第比较后,最大的数放到了表中第N个元素的位置上。在第个元素的位置上。在第一遍扫

18、描中进行一遍扫描中进行N-1次比较。用同样的方法再进行第二次次比较。用同样的方法再进行第二次扫描,扫描, 这时只需考虑这时只需考虑N-1个数之间的个数之间的N-2次比较,扫描完毕,次比较,扫描完毕,最大的数放到了表中第最大的数放到了表中第N-1个元素的位置上个元素的位置上 依此类推,依此类推,在进行了在进行了N-1遍的扫描比较后将完成排序。遍的扫描比较后将完成排序。 下面是对有下面是对有7个元素的次序表进行冒泡排序的过程。个元素的次序表进行冒泡排序的过程。 表的初始状态:表的初始状态: 43 36 65 95 81 12 25 第一遍扫描比较之后:第一遍扫描比较之后: 36 43 65 81

19、12 25 95 第二遍扫描比较之后:第二遍扫描比较之后: 36 43 65 12 25 81 95 第三遍扫描比较之后:第三遍扫描比较之后: 36 43 12 25 65 81 95 第四遍扫描比较之后:第四遍扫描比较之后: 36 12 25 43 65 81 95 第五遍扫描比较之后:第五遍扫描比较之后: 12 2536 43 65 81 95 第六遍扫描比较之后:第六遍扫描比较之后: 12 25 36 43 65 81 95 4.4 循环程循环程序设计技术设计技术 冒泡法最大可能的扫描遍数为冒泡法最大可能的扫描遍数为N-1。 但是,但是, 往往有的往往有的数据表在第数据表在第1遍(遍(1

20、N-1)扫描后可能已经成序。为了避)扫描后可能已经成序。为了避免后面不必要的扫描比较,可在程序中引入一个交换标志免后面不必要的扫描比较,可在程序中引入一个交换标志若在某一遍扫描比较中,一次交换也未发生,则表示数据若在某一遍扫描比较中,一次交换也未发生,则表示数据已按序排列,在这遍扫描结束时,就停止程序循环,结束已按序排列,在这遍扫描结束时,就停止程序循环,结束排序过程。排序过程。 4.4 循环程循环程序设计技术设计技术程序如下:程序如下: DATA SEGMENT ARRAY DW d1, d2, d3, . , dn COUNT EQU(-ARRAY)2 ; 数据个数数据个数 FLAG DB

21、 -1 ; 交换标志,交换标志, 初值为初值为-1 DATA ENDS STACK SEGMENT PARA STACK STACK DB 1024 DUP(?)(?) STACK ENDS CODE SEGMENT SORT: MOV AX, DATA MOV DS, AX MOV BX, COUNT LP1: CMP FLAG, 0 ; 数组已有序?数组已有序? JE EXIT ; 是,是, 排序结束排序结束 DEC BX ; 否,否, 置本遍扫描比较次数置本遍扫描比较次数 MOV CX, BX MOV SI, 0 ; 置数组的偏移地址置数组的偏移地址 MOV FLAG, 0 ; 预置交换

22、标志为预置交换标志为0 4.4 循环程循环程序设计技术设计技术 LP2: MOV AX, ARRAYSI ; 取一个数据取一个数据AX CMP AX, ARRAYSI2 ;与下一个数比较;与下一个数比较 JLE NEXT ; 后一个数大,后一个数大, 转转NEXT XCHG AX, ARRAYSI+2; 逆序,逆序, 交换两个数交换两个数 MOV ARRAYSI, AX MOV FLAG, -1 ; 置交换标志为置交换标志为-1 NEXT: ADD SI, 2 ; 修改地址指针修改地址指针 4.4 循环程循环程序设计技术设计技术 LOOP LP2 ; 循环进行两两数据的比较循环进行两两数据的比

23、较 JMP LP1 ; 内循环结束,内循环结束, 继续下一轮排序继续下一轮排序EXIT: MOV AH, 4CH ; 排序完成,排序完成, 返回返回DOS INT 21H CODE ENDS END SORT4.4 循环程循环程序设计技术设计技术4.4 循环程序设计技术循环程序设计技术例例4 45 5 在缓冲区在缓冲区DATABUFDATABUF中保存有一组无符号数据(中保存有一组无符号数据(8 8位),其数据个数存放在位),其数据个数存放在DATABUFDATABUF的第的第1 1、2 2个字节中,要个字节中,要求编写程序将数据按递增顺序排列。求编写程序将数据按递增顺序排列。解解:这里采用双

24、重循环实现数据的排序,这可使程序变:这里采用双重循环实现数据的排序,这可使程序变得简单。要对得简单。要对N N个数据进行从小到大排序时,可以采用个数据进行从小到大排序时,可以采用“冒泡法冒泡法”:从后往前,每两个数据进行比较,当前者:从后往前,每两个数据进行比较,当前者大于后者时,交换两者的次序;否则不变,这样,经过大于后者时,交换两者的次序;否则不变,这样,经过N-1N-1次比较,可以将最小值交换到第一个单元(最轻的气次比较,可以将最小值交换到第一个单元(最轻的气泡最先冒出水面)。接着对后泡最先冒出水面)。接着对后N-1N-1个数据,重复上述过程,个数据,重复上述过程,使次小值交换到第二个单

25、元;依此类推,共进行使次小值交换到第二个单元;依此类推,共进行N-1N-1次比次比较过程,可以完成数据的排序操作。较过程,可以完成数据的排序操作。 4.4 循环程序设计技术循环程序设计技术由于每次比较操作都在相邻两个单元进行,因此只需要一由于每次比较操作都在相邻两个单元进行,因此只需要一个指针。汇编语言程序如下:个指针。汇编语言程序如下: N=100N=100;设有;设有100100个数据个数据STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100H DUP(?) DW 100H DUP(?)TOP LABEL WORDTOP LAB

26、EL WORDSTACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTDATABUF DW NDATABUF DW N DB N DUP( DB N DUP(?) )DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK 4.4 循环程序设计技术循环程序设计技术 START:START: MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX

27、MOV ES,AX MOV ES,AX MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX LEA SP,TOP LEA SP,TOP ;为了能够进行排序,;为了能够进行排序,DATABUF DATABUF 中必须已经保存数据,中必须已经保存数据, ;因此我们产生一组随机数据;因此我们产生一组随机数据 MOV CXMOV CX,DATABUFDATABUF LEA SI LEA SI,DATABUF+2DATABUF+2 MOV BL MOV BL,2323 MOV AL MOV AL,11 11 4.4 循环程序设计技术循环程序设计技术LP:LP: M

28、OV SI,ALMOV SI,AL INC SI INC SI ADD AL,BL ADD AL,BL LOOP LP LOOP LP; ; 下面给出数据排序程序下面给出数据排序程序 MOV CX,DATABUFMOV CX,DATABUF DEC CX DEC CX ;外循环次数;外循环次数 LEA SI,DATABUFLEA SI,DATABUF2 2;SISI指向数据区首地址指向数据区首地址 ADD SI,CXADD SI,CX;SISI指向数据区末地址指向数据区末地址LP1:LP1:;外循环开始;外循环开始 PUSH CXPUSH CX PUSH SI PUSH SI4.4 循环程序设

29、计技术循环程序设计技术 LP2: LP2: ;内循环开始,其循环次数恰好;内循环开始,其循环次数恰好 ;与外循环的;与外循环的CXCX值一致值一致 MOV AL,SIMOV AL,SI CMP AL,SI-1 CMP AL,SI-1 JAE NOXCHG JAE NOXCHG XCHG AL,SI-1 XCHG AL,SI-1;交换操作;交换操作 MOV SI,ALMOV SI,ALNOXCHG:NOXCHG: DEC SI DEC SI LOOP LP2 LOOP LP2 POP SI POP SI POP CX POP CX LOOP LP1 LOOP LP1;数据排序结束;数据排序结束4

30、.4 循环程序设计技术循环程序设计技术 MOV AH,4CH ;MOV AH,4CH ;返回返回DOSDOS INT 21H INT 21HCODE ENDSCODE ENDS END START END START如果要求将数据从大到小排序,则只需要将交换条件指令如果要求将数据从大到小排序,则只需要将交换条件指令“JAE NOXCHG”JAE NOXCHG”改成改成“JBE NOXCHG”JBE NOXCHG”;如果要排序的数据为;如果要排序的数据为有符号数,则只需要将交换条件指令有符号数,则只需要将交换条件指令“JAE NOXCHG”JAE NOXCHG”改成改成“JGE NOXCHG”J

31、GE NOXCHG”。例例4 46 6 有一组数据有一组数据(16(16位二进制数位二进制数) )存放在缓冲区存放在缓冲区BUFBUF中中, , 数据个数保存在数据个数保存在BUFBUF的前两个字节中。要求编写程序实现在的前两个字节中。要求编写程序实现在缓冲区中查找某一数据(缓冲区中查找某一数据(1616位),如果缓冲区中没有该数据,位),如果缓冲区中没有该数据,则将它插入到缓冲区的最后;如果缓冲区中有多个被查找的则将它插入到缓冲区的最后;如果缓冲区中有多个被查找的数据,则只保留第一个,将其余的删除。数据,则只保留第一个,将其余的删除。4.4 循环程序设计技术循环程序设计技术解解:在缓冲区:在

32、缓冲区BUFBUF中搜索指定的数据,当没有找到该数据时,中搜索指定的数据,当没有找到该数据时,在最后插入该数据;当找到该数据时,则进入搜索多余的重在最后插入该数据;当找到该数据时,则进入搜索多余的重复数据,每次找到该数据就删除它(即将缓冲区的剩余数据复数据,每次找到该数据就删除它(即将缓冲区的剩余数据向前移动一个字)。当然还应该更新缓冲区的长度单元。向前移动一个字)。当然还应该更新缓冲区的长度单元。 要删除数据时,可以采用要删除数据时,可以采用例例4.44.4的方法,开辟另一个的方法,开辟另一个存储区域,并且删除后还需存储区域,并且删除后还需要将数据传送回原来的存储要将数据传送回原来的存储区域

33、。区域。 数据存储区域源指针(SI)目的指针(DI)图4.3 指针使用4.4 循环程序设计技术循环程序设计技术 我们还可以巧妙的利用指针,在同一个区域中实现删除我们还可以巧妙的利用指针,在同一个区域中实现删除功能。在例功能。在例4.44.4的方法中,让目的操作数指针的方法中,让目的操作数指针DIDI也指向源操也指向源操作数区域,如图作数区域,如图4.34.3所示,这样,每次的写操作可以写回到所示,这样,每次的写操作可以写回到原来的存储区域,一开始原来的存储区域,一开始SISI与与DIDI指针指向同一个地址,当指针指向同一个地址,当找到需要删除的单元时,由于只有读操作,没有写操作,找到需要删除的

34、单元时,由于只有读操作,没有写操作,使使DIDI指针落后于指针落后于SISI,从而完成将后续单元的内容向前移动,从而完成将后续单元的内容向前移动的操作。的操作。汇编语言程序如下:汇编语言程序如下:STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100H DUP(?) DW 100H DUP(?)TOP LABEL WORDTOP LABEL WORDSTACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTBUF DW 20BUF DW 20; 设缓冲区原有设缓冲区原有2020个字个字4.4 循环程序设计

35、技术循环程序设计技术DW 1000H,0025H,6730H,6758H,7344H,2023H,0025H,6745H, DW 1000H,0025H,6730H,6758H,7344H,2023H,0025H,6745H, 10A7H,0B612H10A7H,0B612HDW 56AAH,15ACH,5789H,56AAH,6666H,7777H,56AAH,8888H,DW 56AAH,15ACH,5789H,56AAH,6666H,7777H,56AAH,8888H,9999H,1111H9999H,1111H DW 10 DUP(?) DW 10 DUP(?);为可能的插入操作留出空

36、间;为可能的插入操作留出空间NEW DW 56AAHNEW DW 56AAH;指定的数据为(;指定的数据为(NEWNEW)56AAH56AAHDATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:START: MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX MOV ES,AX MOV ES,AX 4.4 循环程序设计技术循环程序设计技术 MOV AX,ST

37、ACKMOV AX,STACK MOV SS,AX MOV SS,AX LEA SP,TOP LEA SP,TOP;搜索指定的数据;搜索指定的数据 MOV CX,BUFMOV CX,BUF LEA SI,BUF+2 LEA SI,BUF+2 MOV AX,NEW MOV AX,NEWL1:L1: CMP AX,SI CMP AX,SI JZ L2 JZ L2 INC SI INC SI INC SI INC SI LOOP L1 LOOP L1;没有找到,则插入数据;没有找到,则插入数据4.4 循环程序设计技术循环程序设计技术 MOV SI,AX MOV SI,AXINC BUFINC BUF

38、JMP OKJMP OK;结束;结束L2: L2: ;找到第一个数据,在剩余部分搜索并进行删;找到第一个数据,在剩余部分搜索并进行删除操作除操作DEC CXDEC CXINC SIINC SIINC SIINC SIMOV DI,SIMOV DI,SI;DIDI与与SISI指向剩余区域的首地址指向剩余区域的首地址L3:L3:MOV BX,SIMOV BX,SI;读数据;读数据INC SIINC SIINC SIINC SICMP AX,BXCMP AX,BX;比较;比较JZ L4JZ L4 4.4 循环程序设计技术循环程序设计技术MOV DI,BXMOV DI,BX;写数据;写数据INC DI

39、INC DIINC DIINC DIJMP L5JMP L5L4:L4:DEC BUFDEC BUF ;更新长度计数器;更新长度计数器L5:L5:LOOP L3LOOP L3OK:OK: MOV AH,4CH MOV AH,4CH ;返回;返回DOSDOS INT 21H INT 21H CODE ENDSCODE ENDS END START END START4.4 循环程序设计技术循环程序设计技术例例4 47 7 在缓冲区在缓冲区DAT1DAT1和和DAT2DAT2中,存放着两组递增有序的中,存放着两组递增有序的8 8位二进制无符号数,其中前两个字节保存数组的长度,要求位二进制无符号数,

40、其中前两个字节保存数组的长度,要求编程实现将它们合并成一组递增有序的数组编程实现将它们合并成一组递增有序的数组DATDAT,DATDAT的前两的前两个字节用于保存新数组的长度。个字节用于保存新数组的长度。解解:这里要用到:这里要用到3 3个指针,对于将数据写入数组个指针,对于将数据写入数组DATDAT的指针首的指针首选使用选使用DIDI,从,从DAT1DAT1和和DAT2DAT2读数据的两个指针可分别采用读数据的两个指针可分别采用SISI和和BXBX,并结合使用字符串指令,可以简化程序的设计。,并结合使用字符串指令,可以简化程序的设计。 在程序设计中,将由在程序设计中,将由BXBX指示的缓冲区

41、指示的缓冲区DAT2DAT2中的内容读入中的内容读入ALAL,这样,当需要将,这样,当需要将DAT1DAT1的内容传送到的内容传送到DATDAT时,可直接采用时,可直接采用MOVSBMOVSB指令;当需要将指令;当需要将DAT2DAT2的内容传送到的内容传送到DATDAT时,可直接采用时,可直接采用STOSBSTOSB指令。指令。汇编语言程序如下:汇编语言程序如下:4.4 循环程序设计技术循环程序设计技术STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100H DUP(?) DW 100H DUP(?)TOP LABEL WORDTO

42、P LABEL WORDSTACK ENDSSTACK ENDSDATA SEGMENTDATA SEGMENTDAT1 DW 10DAT1 DW 10;设;设DAT1DAT1中有中有1010个数据个数据 DB 10H,25H,67H,68H,73H,83H,95H,0A8H,0C2H,0E6HDB 10H,25H,67H,68H,73H,83H,95H,0A8H,0C2H,0E6HDAT2 DW 13DAT2 DW 13;设;设DAT2DAT2中有中有1313个数据个数据 DB DB 05,12H,26H,45H,58H,65H,67H,70H,76H,88H,92H,0CDH,0DEH05

43、,12H,26H,45H,58H,65H,67H,70H,76H,88H,92H,0CDH,0DEHDATDAT DW ? DW ? DB 200 DUP(?) DB 200 DUP(?) 4.4 循环程序设计技术循环程序设计技术DATA ENDSDATA ENDSCODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:START: MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX MOV ES

44、,AX MOV ES,AX MOV AX,STACK MOV AX,STACK MOV SS,AX MOV SS,AX LEA SP,TOP LEA SP,TOP MOV CX,DAT1 MOV CX,DAT1;CXCX表示表示DAT1DAT1的数据个数的数据个数 MOV DX,DAT2MOV DX,DAT2;DXDX表示表示DAT2DAT2的数据个数的数据个数 MOV DAT,CXMOV DAT,CX;先计算出;先计算出DATDAT的数据个数的数据个数4.4 循环程序设计技术循环程序设计技术ADD DAT,DXADD DAT,DXLEA SI,DAT1+2LEA SI,DAT1+2;SISI

45、指向指向DAT1DAT1的数据区的数据区LEA BX,DAT2+2LEA BX,DAT2+2;BXBX指向指向DAT2DAT2的数据区的数据区LEA DI,DAT+2LEA DI,DAT+2;DIDI指向指向DATDAT的数据区的数据区CLDCLDL1:L1:MOV AL,BXMOV AL,BXINC BXINC BXL2:L2:CMP AL,SICMP AL,SIJB L3JB L3MOVSBMOVSB;DAT1DAT1区中的一个数据传送到区中的一个数据传送到DATDAT区区DEC CXDEC CXJZ L4JZ L4JMP L2JMP L24.4 循环程序设计技术循环程序设计技术L3:L3

46、:STOSBSTOSB;DAT2DAT2区中的一个数据传送到区中的一个数据传送到DATDAT区区DEC DXDEC DXJZ L5JZ L5JMP L1JMP L1L4:L4:MOV SI,BXMOV SI,BXDEC SIDEC SIMOV CX,DXMOV CX,DXL5:L5:REP MOVSBREP MOVSB;将;将DAT1DAT1或或DAT2DAT2中剩余部分全部中剩余部分全部 传送到传送到DATDAT区区 MOV AH,4CH MOV AH,4CH ;返回;返回DOSDOS INT 21H INT 21H 4.4 循环程序设计技术循环程序设计技术CODE ENDSCODE END

47、S END START END START例例4 48 8 已知缓冲区已知缓冲区BUFABUFA内有内有2020个互不相等的整数(其序个互不相等的整数(其序号从号从0 0到到1919),缓冲区),缓冲区BUFBBUFB内有内有3030个互不相等的整数(其序个互不相等的整数(其序号从号从0 0到到2929)。编写程序完成:将既在)。编写程序完成:将既在BUFABUFA中出现又在中出现又在BUFBBUFB中出现的整数(设为中出现的整数(设为x x)存放在缓冲区)存放在缓冲区BUFCBUFC中,并将中,并将x x在在BUFABUFA和和BUFBBUFB中的序号分别存放于缓冲区中的序号分别存放于缓冲区

48、BUFCABUFCA和和BUFCBBUFCB中。中。解:解:这里涉及到这里涉及到5 5个存储区域,最好有个存储区域,最好有5 5个指针,但个指针,但BUFCBUFC、BUFCABUFCA和和BUFCBBUFCB为同步操作,即当找到为同步操作,即当找到x x时,需要同时对时,需要同时对BUFCBUFC、BUFCABUFCA和和BUFCBBUFCB进行操作,而且每个区域都写入一个字节,进行操作,而且每个区域都写入一个字节,因此它们可以采用同一个指针,寻址方式为寄存器相对寻因此它们可以采用同一个指针,寻址方式为寄存器相对寻址,即设址,即设ALAL为找到的值,为找到的值,DLDL、BLBL为序号,则其

49、操作为:为序号,则其操作为:4.4 循环程序设计技术循环程序设计技术MOV BUFCDI,ALMOV BUFCDI,ALMOV BUFCADI,DLMOV BUFCADI,DLMOV BUFCBDI,BLMOV BUFCBDI,BL 对序号的处理也应仔细设计,采用寄存器相对寻址时,对序号的处理也应仔细设计,采用寄存器相对寻址时,例如例如 MOV ALMOV AL,BUFASIBUFASI,其中,其中SISI即为序号。汇编语言程序即为序号。汇编语言程序如下:如下:STACK SEGMENT STACK STACKSTACK SEGMENT STACK STACK DW 100H DUP(?) DW 100H DUP(?)TOP LABEL WOR

温馨提示

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

评论

0/150

提交评论