過程定義偽指令PR.ppt_第1頁
過程定義偽指令PR.ppt_第2頁
過程定義偽指令PR.ppt_第3頁
過程定義偽指令PR.ppt_第4頁
過程定義偽指令PR.ppt_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1,4.2.4 過程定義偽指令PROC、ENDP,過程就是子程序。一個過程可以被其它程序所調(diào)用(用CALL指令),過程的最后一條指令一般是返回指令(RET)。 過程定義偽指令的格式為 PROC 類型 RET ENDP 注意:PROC和ENDP必須成對出現(xiàn)。,2,過程的類型有兩種: NEAR(默認(rèn)類型)表示段內(nèi)調(diào)用 FAR表示段間調(diào)用 調(diào)用一個過程的格式為: CALL ,3,4.2.5 宏定義偽指令,如果需要多次使用同一個程序段,可以將這個程序段定義為一個”宏指令”,然后在需要時,可簡單地用宏指令名來代替這個程序段。,指令的格式為: MACRO 形參表 ENDM,4,例:兩個數(shù)之和的宏定義和宏調(diào)用。 宏定義為: DADD MACRO X,Y,Z MOV AX,X ADD AX,Y MOV Z,AX ENDM,X、Y、Z是形式參數(shù)。調(diào)用宏DADD時可寫為: DADD DATA1,DATA2,SUM DATA1,DATA2,SUM是實際參數(shù),由它們替換定義中的X、Y、Z。,5,宏調(diào)用與過程(子程序)調(diào)用都是一次定義,多次調(diào)用。它們之間的差別是: 執(zhí)行形式:宏命令偽指令由宏匯編程序在匯編過理中進(jìn)行處理,而CALL、RET則是由CPU執(zhí)行的指令。 匯編結(jié)果:宏命令偽指令匯編后被展開。 執(zhí)行速度:宏命令執(zhí)行速度較快(因無調(diào)用轉(zhuǎn)移) 占用內(nèi)存:宏指令簡化了源程序,但不能簡化目標(biāo)程序,并不節(jié)省內(nèi)存單元。使用過程可以節(jié)省代碼占用的內(nèi)存空間。,6,宏展開:匯編程序會把宏調(diào)用按宏定義展開。 例如:宏定義為: Display MACRO string LEA DX,string MOV AH,9 INT 21H ENDM 程序中宏調(diào)用: DISPLAY ERROR_MESSAGE DISPLAY EXIT_MESSAGE 匯編后的結(jié)果:(帶有+號的指令為宏展開后的結(jié)果) + LEA DX,ERROR_MESSAGE + MOV AH,9 + INT 21H + LEA DX,EXIT_MESSAGE + MOV AH,9 + INT 21H ,7,4.2.6 匯編結(jié)束偽指令END,匯編語言源程序的最后,要加匯編結(jié)束偽指令END,以使匯編程序結(jié)束匯編。 格式: END 表達(dá)式 END后跟的表達(dá)式通常就是程序第一條指令的標(biāo)號,指示程序的啟動地址(要執(zhí)行的第一條指令的地址)。,8,匯編語言的一個實例: EXAM.ASM,9,4.3 DOS系統(tǒng)功能調(diào)用介紹,系統(tǒng)功能調(diào)用由OS提供的一組實現(xiàn)特殊功能的子程序供程序員在程序中調(diào)用,以減輕編程工作量。 系統(tǒng)功能調(diào)用有兩種,一種稱為DOS功能調(diào)用,另一種稱為BIOS功能調(diào)用。 用戶程序在調(diào)用這些系統(tǒng)服務(wù)程序時,不是用CALL命令,而是采用軟中斷指令I(lǐng)NT n來實現(xiàn)。 在DOS系統(tǒng)中,功能調(diào)用都是用軟中斷指令I(lǐng)NT 21H來實現(xiàn)的。,10,INT 2lH功能大致可以分為四個方面: 設(shè)備管理、目錄管理、文件管理和其它。 參見P411頁附錄C.3,D0S系統(tǒng)功能調(diào)用的使用方法如下: AH功能號; 設(shè)置該功能所要求的其他入口參數(shù); 執(zhí)行INT 21H指令; 分析出口參數(shù)。 以下介紹INT 21H的幾個最常用的功能。,11,關(guān)于數(shù)據(jù)輸入和輸出我們這里只討論鍵盤輸入和顯示輸出,調(diào)用系統(tǒng)功能需要提供入口參數(shù)及所調(diào)用的功能號,調(diào)用結(jié)束返回結(jié)果。,1. DOS鍵盤功能調(diào)用,(1) 從鍵盤輸入一個字符(功能號=1) MOV AH,1 INT 21H ,12,例:程序中有時需要用戶對提示做出應(yīng)答。 GET_KEY: MOV AH,1 ;等待鍵入字符 INT 21H ;結(jié)果在AL中 CMP AL,Y ;是Y? JZ YES ;是,轉(zhuǎn)YES CMP AL,N ;是N? JZ NO ;是,轉(zhuǎn)NO JMP GET_KEY ;否則繼續(xù)等待輸入 YES: NO: ,13,(2) 輸入字符串(功能號=0AH) 此功能調(diào)用從鍵盤輸入一串字符并把它存入用戶指定的緩沖區(qū)中。 MOV AH, 0AH LEA DX, INT 21H,(預(yù)留的N1個字節(jié)的存儲單元),0DH,N2,N1,N1: 緩沖區(qū)長度(最大鍵入字符數(shù)) N2: 實際鍵入的字符數(shù)(不包括回車符),用戶定義的輸入字符串的緩沖區(qū)格式,14,若用戶鍵入的字符數(shù)(包括回車)定義的N1,本功能調(diào)用將不再接收新的鍵入,且光標(biāo)不再向右移動。 例:設(shè)在數(shù)據(jù)段定義鍵盤緩沖區(qū)如下: STR1 DB 10,?,10 DUP(?) 調(diào)用DOS功能的0AH號功能的程序段為: LEA DX,STR1 MOV AH,0AH INT 21H 此程序段最多從鍵盤接收10個按鍵(包括回車)。,15,2. DOS顯示功能調(diào)用,(1) 在顯示器上顯示一個字符(功能號=2) MOV AH, 2 MOV DL, INT 21H 例:在顯示器上顯示一個字符A MOV AH, 2 MOV DL, A ;或MOV DL, 41H INT 21H,16,MOV AH, 9 LEA DX, INT 21H 注意:被顯示的字符串必須以$結(jié)束。,(2)顯示字符串(功能號=9),17,例:在屏幕上顯示:HELLO,WORLD! ;在數(shù)據(jù)段定義字符串: DATA SEGMENT STR1 DB HELLO,WORLD!$ DATA ENDS ;在代碼段中進(jìn)行顯示輸出 MOV AH,9 LEA DX,STR1 INT 21H 完整的程序: HELLO.ASM,18,附:BIOS功能調(diào)用,BIOS:基本輸入輸出系統(tǒng),是固化在EPROM中的一組實現(xiàn)基本輸入輸出功能的子程序。 BIOS調(diào)用通過多個軟中斷提供,調(diào)用方法為: MOV AH, INT BIOS中的幾個主要中斷類型如下: INT 10H屏幕顯示 INT 13H磁盤操作 INT 14H串行口操作 INT 16H鍵盤操作 INT 17H打印機(jī)操作 每類中斷由包含許多子功能,調(diào)用時通過功能號指定。 BIOS功能調(diào)用說明見p416附錄D。,19,4.4 匯編語言程序設(shè)計基礎(chǔ),4.4.1 概述 1.程序質(zhì)量(自學(xué)) 2.匯編語言程序設(shè)計的步驟: 1-根據(jù)實際問題抽象出數(shù)學(xué)模型,確定算法 2-畫出程序框圖(流程圖) 3-分配內(nèi)存工作單元和寄存器 4-根據(jù)框圖編寫源程序,存成.ASM文件 5-對源程序匯編,生成.OBJ目標(biāo)文件 6-把.OBJ文件連接成.EXE執(zhí)行文件 7-運行、調(diào)試 3.源程序的基本結(jié)構(gòu):順序、分支、循環(huán)、過程,20,(1)用方框表示工作框,框中用簡明語言標(biāo)明要完成的功能,(2) 用菱形框表示判斷框,框中標(biāo)明比較、判斷和條件,如何繪制程序框圖(流程圖)?,N,Y,?,21,(4)各框之間用直線連起來表示程序走向。,框中標(biāo)明子程序名字(入口參數(shù)等),(3)用 框表示調(diào)用子程序或過程。,流程圖的例子FlowChart.doc,22,匯編語言上機(jī)過程,Y,Y,Y,N,N,N,有錯 ?,有錯 ?,有錯 ?,結(jié)束,匯 編,輸入(修改)源程序,連 接,運 行,查 錯,開始,用EDIT,NOTEPAD等任何文本編輯器。源程序存為.ASM文件,用MASM宏匯編程序進(jìn)行匯編。 匯編后生成.OBJ目標(biāo)文件。 命令格式:MASM ;,用LINK連接程序進(jìn)行連接。 連接后生成.EXE可執(zhí)行文件。 命令格式:LINK ;,用TD、DEBUG等調(diào)試程序進(jìn)行調(diào)試。 命令格式:TD ,23,標(biāo)號:,條件滿足 ?,處理,4.4.2 順序程序(p175-176,自學(xué)) 4.4.3 分支程序,N,Y,IFTHEN結(jié)構(gòu),程序結(jié)構(gòu): 測試/比較指令 (TEST/CMP) 條件轉(zhuǎn)移指令 (Jx 標(biāo)號) 處理體 標(biāo)號: 其他指令 ,24,程序結(jié)構(gòu): TEST/CMP指令 Jx 標(biāo)號1 處理體P1 JMP 標(biāo)號2 標(biāo)號1: 處理體P2 標(biāo)號2:其他指令 ,條件滿足 ?,處理P1,處理P2,標(biāo)號1:,標(biāo)號2:,條件1,條件2,IFTHENELSE結(jié)構(gòu),25,標(biāo)號1:,條件1成立 ?,P1,N,Y,CASE結(jié)構(gòu),程序結(jié)構(gòu): TEST/CMP指令(測試條件1) Jx 標(biāo)號1 ;不滿足轉(zhuǎn)標(biāo)號1 處理體P1 JMP 標(biāo)號n+1 標(biāo)號1:TEST/CMP指令(測試條件2) Jx 標(biāo)號2 ;不滿足轉(zhuǎn)標(biāo)號2 處理體P2 JMP 標(biāo)號n+1 標(biāo)號2:TEST/CMP指令(測試條件3) Jx 標(biāo)號3 ;不滿足轉(zhuǎn)標(biāo)號3 處理體P3 JMP 標(biāo)號n+1 標(biāo)號3:TEST/CMP指令(測試條件4) 標(biāo)號n+1:(公共出口),條件2成立 ?,條件n成立 ?,Pn+1,標(biāo)號2:,標(biāo)號n:,標(biāo)號n+1:,P2,Pn,N,N,Y,Y,例:P178,例4-14,統(tǒng)計成績。流程圖中虛線框內(nèi),26,4.4.4 循環(huán)程序,1DOUNTIL 結(jié)構(gòu) 先執(zhí)行,再判斷條件。工作部分至少執(zhí)行一次。,初始化,循環(huán)體,循環(huán)控制,繼續(xù)循環(huán)?,Y,N,27,2. DO WHILE 結(jié)構(gòu) 先判斷條件,再執(zhí)行。工作部分有可能一次都不執(zhí)行。,初始化,循環(huán)體,循環(huán)控制,繼續(xù)循環(huán)?,Y,N,28,注意:循環(huán)可以嵌套(多重循環(huán)),但多個循環(huán)體之間不能交叉,控制條件不能混淆。 例:P179例4-15,數(shù)據(jù)從大到小排序。 冒泡法實例:3,7,2,8,68,7,6,3,2。 內(nèi)外兩層循環(huán); 每輪內(nèi)循環(huán)使一個最小的數(shù)沉底,因為最小的數(shù)沉底,下輪內(nèi)循環(huán)就不用再比較最底下的數(shù),所以內(nèi)循環(huán)的循環(huán)次數(shù)每一輪比上一輪要逐次減1; 外循環(huán)用于控制有多少輪內(nèi)循環(huán)。若有n個數(shù)據(jù),則外循環(huán)次數(shù)為n-1。,BSORT.ASM,29,掌握以下幾點: 調(diào)用子程序用CALL指令,返回調(diào)用程序用RET指令。 子程序允許嵌套調(diào)用。 進(jìn)入子程序后首先要保護(hù)主程序的運行狀態(tài)(標(biāo)志位)和使用的寄存器內(nèi)容(稱為保護(hù)現(xiàn)場),退出子程序前要恢復(fù)現(xiàn)場。 調(diào)用前要預(yù)先確定子程序中要使用哪些寄存器,并定義入口參數(shù)和出口參數(shù)。參數(shù)傳遞可利用寄存器、存儲單元或堆棧(要用BP尋址)。,4.4.5 子程序設(shè)計舉例,30,例1: 二進(jìn)制數(shù)(0-F)轉(zhuǎn)換成ASCII(0-F)的子程序。 BIN2ASC PROC ;要轉(zhuǎn)換的數(shù)在AL的低四位 ;轉(zhuǎn)換結(jié)果仍在AL中 CMP AL, 9 JA A2F ADD AL, 30H JMP DONE A2F: ADD AL, 37H DONE: RET BIN2ASC ENDP 調(diào)用方法:(在主程序中) MOV AL, 0CH CALL BIN2ASC (AL中有0CH的ASCII碼43H, C),31,例2. 字符串處理程序設(shè)計 此例取自p182例4-17。 對字符串進(jìn)行操作時,往往需要確定它的長度。通常字符串結(jié)束標(biāo)志以CR或$作標(biāo)志。所以可以用掃描CR或$的方法計算出串長。 在計算串長時,應(yīng)注意串長一般應(yīng)小于255個字節(jié)。 以下是流程圖和源程序。,32,簡化的流程圖:,開始,求串長,串長256?,顯示串長高位,顯示串長低位,結(jié)束,Y,警告: 太長,求串長,當(dāng)前字符是?,搜索CR字符 同時指針增量,返回,N,串長加1,存串長,N,找到?,N,Y,Y,初始化指針/計數(shù)器,33,程序如下: DATA SEGMENT STRING DB This is a string,0DH,$ LENGTH1 DW ? ;串長度存放在這里 CR DB 0DH MESSAGE DB The string is too long!,0DH,0AH,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR BEGIN: MOV AX,DATA MOV ES,AX MOV DS,AX,34,CALL STRLEN ;調(diào)用子程序計算串長 MOV DX,LENGTH1 ;結(jié)果在DX寄存器中 CMP DX,100H JB NEXT1 ;若(DX)100H,轉(zhuǎn) LEA DX,MESSAGE ;若(DX)100H, MOV AH,9 INT 21H ;顯示信息 JMP NEXT2 NEXT1: MOV DH,DL ;串長暫存在DH中 MOV CL,4 SHR DL,CL ;取串長高4位 CMP DL,9,35,JBE LP ;9,轉(zhuǎn) ADD DL,7 ;9,加7 LP: ADD DL,30H ;高4位轉(zhuǎn)換為ASCII碼 MOV AH,6 INT 21H ;顯示這個ASCII碼 MOV DL,DH ;取暫存串長 AND DL,0FH ;取串長低4位 CMP DL,9 JBE LP1 ;9,轉(zhuǎn) ADD DL,7 ;9,加7 LP1: ADD DL,30H ;低4位轉(zhuǎn)換為ASCII碼 MOV AH,6 INT 21H ;顯示該ASCII碼,36,MOV DL,H MOV AH,6 INT 21H ;顯示H NEXT2: MOV AH,4CH INT 21H ;返回DOS MAIN ENDP ;- 主程序結(jié)束 - ; ;-計算串長的子程序 - STRLEN PROC LEA DI,STRING MOV CX,0FFFFH ;(CX)=-1 MOV AL,CR ;(AL)=0DH MOV AH,$ ;(AH)=24H CLD ;DF=0,37

溫馨提示

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

最新文檔

評論

0/150

提交評論