匯編語言循環程序設計_第1頁
匯編語言循環程序設計_第2頁
匯編語言循環程序設計_第3頁
匯編語言循環程序設計_第4頁
匯編語言循環程序設計_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、5.6.3 循環程序設計1.1.循環程序的組成循環程序的組成一個循環程序通常由四部分構成:一個循環程序通常由四部分構成: 初始化部分初始化部分建立循環初始值。如初始化地址指針,計數器,建立循環初始值。如初始化地址指針,計數器,其他循環參數的起始值等。其他循環參數的起始值等。 工作部分工作部分它是循環程序的這主要部分它是循環程序的這主要部分, ,是為完成某種特定功是為完成某種特定功能而設計的程序段。能而設計的程序段。 修改部分修改部分為保證正確的循環而修改某些參數。如修改計數為保證正確的循環而修改某些參數。如修改計數器的值、操作數地址等。器的值、操作數地址等。 控制部分控制部分判斷循環結束條件是

2、否成立。這是循環程序設計判斷循環結束條件是否成立。這是循環程序設計的關鍵。通常判斷循環是否結束的辦法有兩種:的關鍵。通常判斷循環是否結束的辦法有兩種: 用計數控制循環:循環是否已進行預定次數,用計數控制循環:循環是否已進行預定次數,它適用于已知循環次數的循環程序設計;它適用于已知循環次數的循環程序設計; 用條件控制循環:循環終止條件是否已成立,用條件控制循環:循環終止條件是否已成立,它適用于未知循環次數的循環程序設計。它適用于未知循環次數的循環程序設計。2.循環控制方法循環控制方法 用計數控制循環用計數控制循環例例3 在在xx單元開始的連續單元中存放有單元開始的連續單元中存放有10個無符個無符

3、號數,從中找出中最大者送號數,從中找出中最大者送yy單元。單元。根據題意,我們把第一個數先送入根據題意,我們把第一個數先送入al寄存器中,寄存器中,然后將然后將al中的數與后面的中的數與后面的9個數逐個進行比較。如果個數逐個進行比較。如果al中的數較小,則兩數交換;如果中的數較小,則兩數交換;如果al中的數大,則不交換。中的數大,則不交換。在比較過程中,在比較過程中,al中始終保持較大的數,這樣,比較中始終保持較大的數,這樣,比較9次后,則最大的數在次后,則最大的數在al中,最后把中,最后把al中的數(最大者)中的數(最大者)存入存入yy單元。單元。由此可畫出程序的流程圖由此可畫出程序的流程圖

4、:從一批數中求最大者流程圖 開始 alxx,bxxx的有效地址,cx9 bxbx+1 al bx? al,bx中的數交換 cxcx-1 cx=0? yyal 結束 yynn程序編寫如下程序編寫如下:data segmentxxdb 49,38,65,12,97,13,55,27,28,85yydb ?data endscodesegmentassume cs:code, ds:datastart:mov ax, datamov ds, axlea bx, xxmov al, bxmov cx, 9loop1:inc bx cmp al, bxjae loop2xchg al, bxloop2:

5、dec cxjnz loop1mov yy, almov ah, 4chint 21hcodeendsend start(2)用條件控制循環用條件控制循環有些情況無法確定循環次數,但是循環何時結束,有些情況無法確定循環次數,但是循環何時結束,可用某種條件來確定。這時,編制程序主要是尋找控制可用某種條件來確定。這時,編制程序主要是尋找控制條件及對控制條件的檢測。條件及對控制條件的檢測。例例5 從自然數從自然數1開始累加,直到累加和大于開始累加,直到累加和大于1000為止,統計被累加的自然數的個數,并把統計的個數送為止,統計被累加的自然數的個數,并把統計的個數送入入n單元,把累加和送入單元,把累加

6、和送入sum單元。單元。根據題意,被累加的自然數的個數事先是未知的,根據題意,被累加的自然數的個數事先是未知的,也就是說,循環的次數是未知的,因此不能用計數器方也就是說,循環的次數是未知的,因此不能用計數器方法控制循環。但題目中給定一個重要條件,即累加和大法控制循環。但題目中給定一個重要條件,即累加和大于于1000則停止累加,因此,可以根據這一條件控制循環。則停止累加,因此,可以根據這一條件控制循環。我們用我們用cx寄存器統計自然數的個數,用寄存器統計自然數的個數,用ax寄存器存放寄存器存放累加和,用累加和,用bx寄存器存放每次取得的自然數。寄存器存放每次取得的自然數。程序的流程圖如下所示。程

7、序的流程圖如下所示。 開始 初始化 ax0, cx0, bx0 bxbx+1 axax+bx, cxcx+1 ax1000? ncx, sumax 結束 yn 程序編寫如下:程序編寫如下: datas segment n dw ? sum dw ? datas ends stack segment para stack stack dw dup(?) stack ends codes segment main proc far assume cx:codes, ds:datas, ss:stack start:push ds mov ax, 0 push ax mov ax, datasmov

8、 ds, axmov cx, 0 mov ax, 0 mov bx, 0 loopt:inc bx add ax, bx inc cx cmp ax, 1000 jle loopt mov n, cx mov sum, ax ret main endp codes ends end start3.多重循環程序設計多重循環程序設計 多重循環又稱循環嵌套多重循環又稱循環嵌套,即循環套循環。有些問題即循環套循環。有些問題比較復雜比較復雜,單重循環難以解決單重循環難以解決,必須使用多重循環。在使必須使用多重循環。在使用多重循環時用多重循環時,必須注意以下幾點:必須注意以下幾點: 內循環必須完整地包含在

9、外循環內內循環必須完整地包含在外循環內,內外循環不內外循環不能相互交叉。能相互交叉。 內循環既可以嵌套在外循環中內循環既可以嵌套在外循環中,也可以幾個內循也可以幾個內循環并列存在。可以從內循環中直接跳到外循環,但不能環并列存在。可以從內循環中直接跳到外循環,但不能從外循環直接跳進內循環中。從外循環直接跳進內循環中。 防止出現防止出現“死循環死循環”。無論是外循環。無論是外循環,還是內循還是內循環,千萬不要使循環返回到初始部分環,千萬不要使循環返回到初始部分, 這一點應當特別這一點應當特別注意。注意。 每次通過外循環再次進入內循環時,初始條件每次通過外循環再次進入內循環時,初始條件必須重新設置。

10、必須重新設置。例例6利用逐次求大數的方法對內存單元利用逐次求大數的方法對內存單元array開始的一字節為單位的無符號數進行從大到小排序。開始的一字節為單位的無符號數進行從大到小排序。根據題意,排序方法為:根據題意,排序方法為:編制程序如下:編制程序如下:49 38 65 12 97 13 55 27 78 8549496565979738384949656578788585 78 65 55 49 38 27 13 1212arrayal datasegmentarraydb 49,38,65,12,97,13,55,27,28,85 dataends codesegmentassume cs

11、:code, ds:data start:mov ax, datamov ds, axmov dx, 9 lea bx, array loopo: mov al, bxmov si, bx+1mov cx, dx loopi:cmp al, sijae nextxchg al, si next:inc siloop loopimov bx, alinc bxdec dxjnz loopomov ah, 4chint 21h codeendsend start5.6.4 子程序設計子程序又稱為過程,它相當于高級語言的過程或函子程序又稱為過程,它相當于高級語言的過程或函數,是一個獨立的程序段,能完

12、成某些確定的功能,并數,是一個獨立的程序段,能完成某些確定的功能,并能別其它程序調用。當一個子程序不被調用能別其它程序調用。當一個子程序不被調用,且該子程序且該子程序完成確定的功能后完成確定的功能后,便返回調用程序處。便返回調用程序處。1.過程的定義和調用過程的定義和調用過程的定義采用過程定義偽指令,其格式為:過程的定義采用過程定義偽指令,其格式為:過程名過程名 proc 類型類型ret 過程名過程名endp過程的調用采用指令語句過程的調用采用指令語句call,其格式為其格式為:call 過程名過程名 段內調用段內調用cseg segmentcall subtmov ah,4chint 21h

13、 subt proc nearret subt endpcseg ends 段間調用段間調用xseg segment yseg segmentcall subt1 call subt1mov ah,4ch yseg endsint 21h subt1 proc farret subt1 endpxseg segment2.寄存器內容的保護和恢復通常主程序和過程的設計是分開的,因而他們所使用的寄存器往往會發生沖突。為避免沖突,應在進入過程時,將該過程所用到的寄存器內容保護起來,稱為保護現場。而從過程返回主程序前,再將這些寄存器的內容恢復,稱為恢復現場。保護現場和恢復現場通常分別用堆棧壓入指令和彈

14、出指令來實現。例如:subprproc farpush axpush bxpush cxpush dxpush dxpush cxpush bxpush axretsubprendppush axpush bxpush cxpush dxcall subppush dxpush cxpush bxpush ax3.主程序和構成見的參數傳遞主程序和構成見的參數傳遞主程序調用過程時,必須先將過程所需要的初始主程序調用過程時,必須先將過程所需要的初始數據設置好,這些初始數據稱為過程的入口參數。過數據設置好,這些初始數據稱為過程的入口參數。過程執行完畢返回主程序時也必須將過程運行所得的結程執行完畢返回

15、主程序時也必須將過程運行所得的結果送給主程序,這些回送的結果稱為過程的出口參數。果送給主程序,這些回送的結果稱為過程的出口參數。過程入口參數的送入和出口參數的送出稱為主程序和過程入口參數的送入和出口參數的送出稱為主程序和過程間的參數傳遞,也稱過程通信。過程通信通常有過程間的參數傳遞,也稱過程通信。過程通信通常有四種方法。四種方法。 通過寄存器傳遞參數通過寄存器傳遞參數 通過變量傳遞參數通過變量傳遞參數 通過地址表傳遞參數通過地址表傳遞參數 通過堆棧傳遞參數通過堆棧傳遞參數4.子程序的嵌套與遞歸調用一個子程序調用另一個子程序叫子程序嵌套,如下圖所示:callcallcallretretret主程

16、序子程序1子程序2子程序n由于調用子程序時,斷點地址保存在堆棧中,因此只由于調用子程序時,斷點地址保存在堆棧中,因此只要有足夠的堆棧空間,嵌套的層次(也稱深度)是不要有足夠的堆棧空間,嵌套的層次(也稱深度)是不受限制的。受限制的。若一個子程序調用該子程序自身,則稱為遞歸若一個子程序調用該子程序自身,則稱為遞歸調用。遞歸調用是子程序嵌套的特例。調用。遞歸調用是子程序嵌套的特例。5. 子程序調用和偽指令使用的例子子程序調用和偽指令使用的例子例例7 ax寄存器中存放著寄存器中存放著4位十六進制數,是編位十六進制數,是編寫程序將這寫程序將這4位十六進制數分別轉換為相應的位十六進制數分別轉換為相應的as

17、cii碼,碼,并依次存放到并依次存放到result數組的數組的4個字節中去,要求分別個字節中去,要求分別用子程序和偽指令的方法實現。用子程序和偽指令的方法實現。 用子程序方法編程:data segment hexdata dw 4d7eh result db 4 dup(?)data endscode segmentassume cs:code;ds:data start:mov ax, datamov ds, axmov cx, 4lea si, hexdatalea di, resultmov bx, sinext:mov ax, bxand al, 0fhcall hexascmov d

18、i, alinc dipush cxmov cx, 4shr bx, clpop cxloop nextlea si, result+3mov cx, 4stdloop1:lodsbmov dl, almov ah, 02hint 21hloop loop1mov dl, hmov ah, 02hint 21hmov ah, 4chint 21h;十六進制轉換成十六進制轉換成ascii碼子程序碼子程序 hexasc proc cmp al, 0ahjb plus30add al, 07h plus30: add al, 30hret hexascendp codeendsendstart 用偽指令方法編程:用偽指令方法編程:data segment hexdata dw 4d7eh result db 4 dup(?)data endscode segmentassume cs:code;ds:data start: mov ax, datamov ds, ax hexasc macrocmp al, 0ahjb plus30add al, 07h plus

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論