




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小班研討秋游活動方案
- 工信局低碳宣傳活動方案
- 師生國慶活動方案
- 小學留宿活動方案
- 工程采購沙龍活動方案
- 小班精細美術活動方案
- 屋頭串串活動方案
- 市集策劃活動方案
- 巨型籃球活動方案
- 市婦聯讀書會活動方案
- 閔行區2024-2025學年下學期期末考試六年級數學試卷及答案(上海新教材滬教版)
- 借款合同模版
- 義務教育英語課程標準(2022年版)
- 荊州中學2024-2025高二學年下學期6月月考 英語答案
- 2018-2022北京高中合格考生物匯編:基因的表達
- 蛇咬傷的急救處理措施
- 2025至2030年中國硫酸鈣晶須行業市場競爭現狀及投資前景研判報告
- 2025至2030年中國榴蓮行業發展模式分析及投資趨勢預測報告
- 陜西省專業技術人員繼續教育2025公需課《專業技術人員綜合素質拓展》4學時題庫及答案
- 2025至2030中國IT運維管理行業發展趨勢分析與未來投資戰略咨詢研究報告
- 新生兒病區專科理論考試題庫
評論
0/150
提交評論