第04章匯編語言程序設(shè)計(1)_第1頁
第04章匯編語言程序設(shè)計(1)_第2頁
第04章匯編語言程序設(shè)計(1)_第3頁
第04章匯編語言程序設(shè)計(1)_第4頁
第04章匯編語言程序設(shè)計(1)_第5頁
已閱讀5頁,還剩39頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第四章第四章 匯編語言程序設(shè)計匯編語言程序設(shè)計概述概述l匯編語言匯編語言l用指令助記符、符號地址、用指令助記符、符號地址、標(biāo)號等編寫的程序。標(biāo)號等編寫的程序。l為機(jī)器語言的符號表示為機(jī)器語言的符號表示 l匯編語言的特點(diǎn)匯編語言的特點(diǎn)l高級語言高級語言可移植性好可移植性好程序易編程序易編/ /易讀易讀/ /易學(xué)易學(xué)應(yīng)用:科學(xué)計算、信息應(yīng)用:科學(xué)計算、信息管理等管理等l匯編語言匯編語言面向機(jī)器面向機(jī)器/ /硬件硬件程序代碼效率高程序代碼效率高執(zhí)行速度快執(zhí)行速度快, ,占內(nèi)存少占內(nèi)存少應(yīng)用:實時控制、儀器應(yīng)用:實時控制、儀器儀表、系統(tǒng)軟件等儀表、系統(tǒng)軟件等匯編語言源程序匯編語言源程序(.ASM)(.

2、ASM)匯編匯編(MASM)(MASM)目標(biāo)程序目標(biāo)程序(.OBJ)(.OBJ)鏈接鏈接(LINK)(LINK)可執(zhí)行程序可執(zhí)行程序(.EXE)(.EXE)例:在屏幕上顯示例:在屏幕上顯示“This is a sample program.”DATA SEGMENT ;數(shù)據(jù)段數(shù)據(jù)段DA1 DB This is a sample program.,0DH,0AH,$DATA ENDSSTACK SEGMENT ;堆棧段堆棧段ST1 DB 100 DUP(?)STACK ENDSCODE SEGMENT ;代碼段代碼段MAIN PROC FAR ;過程定義過程定義ASSUME CS:CODE,DS

3、:DATA,SS:STACK ;段分配段分配 ORG 1000H START: MOV AX,STACK MOV SS,AX ;SS堆棧段段地址堆棧段段地址 PUSH DS ;返回返回DOS所需的段地址所需的段地址 MOV AX,0 ; 偏移地址偏移地址 PUSH AX MOV AX,DATA MOV DS,AX ;DS數(shù)據(jù)段段地址數(shù)據(jù)段段地址 MOV AH,9 ;設(shè)置設(shè)置DOS 9號功能調(diào)用,顯號功能調(diào)用,顯示字符串示字符串 MOV DX,OFFSET DA1 ;DS:DX 串首地址,串首地址,$為為結(jié)束符結(jié)束符 INT 21H ;DOS功能調(diào)用功能調(diào)用 RETMAIN ENDP ;過程結(jié)束

4、過程結(jié)束CODE ENDS ;代碼段結(jié)束代碼段結(jié)束 END START 回車回車換行換行結(jié)束符結(jié)束符l分段結(jié)構(gòu)分段結(jié)構(gòu) 段名段名 SEGMENTSEGMENT 段名段名 ENDSENDSlMAIN為一過程為一過程 由由DOSDOS調(diào)用,調(diào)用,RETRET返回返回DOSDOSl兩種語句兩種語句 指令語句指令語句 :匯編后產(chǎn)生目標(biāo)代碼:匯編后產(chǎn)生目標(biāo)代碼 偽指令語句:不產(chǎn)生目標(biāo)代碼,僅提供匯編信息偽指令語句:不產(chǎn)生目標(biāo)代碼,僅提供匯編信息程序結(jié)構(gòu):程序結(jié)構(gòu):4.1 匯編語言的語句格式匯編語言的語句格式一、指令性語句:一、指令性語句:可執(zhí)行語句,有對應(yīng)的機(jī)器碼可執(zhí)行語句,有對應(yīng)的機(jī)器碼 格式:標(biāo)號:

5、助記符標(biāo)號:助記符 操作數(shù)操作數(shù)1 1,操作數(shù),操作數(shù)2 2;注釋;注釋二、指示性語句二、指示性語句:偽指令,無機(jī)器碼偽指令,無機(jī)器碼 格式:名字名字 指示符指示符 操作數(shù)操作數(shù)1 1,操作數(shù),操作數(shù)2 2;注釋;注釋三、數(shù)據(jù)項三、數(shù)據(jù)項: 操作數(shù):常量、變量、標(biāo)號操作數(shù):常量、變量、標(biāo)號l常量常量:01101101B,38,5AH,0FEH,ABl變量與標(biāo)號變量與標(biāo)號:有有3 3個屬性:個屬性:段值:變量段值:變量/ /標(biāo)號所在段的段地址標(biāo)號所在段的段地址偏移地址:偏移地址:1.1.類型:變量類型:變量/ /標(biāo)號:標(biāo)號:BYTE,WORD,DWORD/NEAR,FARBYTE,WORD,DW

6、ORD/NEAR,FAR符號地址,由字母打頭的字母數(shù)字串組成符號地址,由字母打頭的字母數(shù)字串組成變量名、段名、過程名、符號名等變量名、段名、過程名、符號名等4.2 MASM中的運(yùn)算符及表達(dá)式中的運(yùn)算符及表達(dá)式一、算術(shù)運(yùn)算符:一、算術(shù)運(yùn)算符:,MOD,SHL,SHR例:例:DA EQU 300 MOV AX,DA80 MOV BX,DA MOD 100 MOV CX,DA/100 MOV DH,01100100B SHR 2二、邏輯運(yùn)算符:二、邏輯運(yùn)算符:AND,OR,XOR,NOT例:例:MOV AL,NOT 0FFH MOV BL,8CH AND 73H MOV AH,8CH OR 73H

7、MOV CH,8CH XOR 73H三、關(guān)系運(yùn)算符:三、關(guān)系運(yùn)算符:EQ、NE、LT、LE、GT、GE例:例:MOV AX,10H GT 16 ADD BL,6 EQ 0110B四、數(shù)值返回運(yùn)算符:四、數(shù)值返回運(yùn)算符:OFFSET,SEG,TYPE,LENGH,SIZE例:例:MOV BX,OFFSET DA1 MOV AX,SEG M1 MOV DS,AXnTYPE返回值:返回值: 變量:變量:DB/DW/DD/DQ:1248 標(biāo)號:標(biāo)號:NEAR/FAR:12例:例:A1 DB 20H,30H A2 DW 0438H A3 DD ? 返回值返回值 L1:MOV AH,TYPE A1 ; 1

8、 MOV BH,TYPE A2 ; 2 ADD AL,TYPE A3 ; 4 MOV BL,TYPE L1 ; 0FFHnLENGTH:使用使用DUPDUP時時, ,返回其單元數(shù)返回其單元數(shù); ;其它情況返回其它情況返回1 1例:例:M1 DW 100 DUP(?)(?) M2 DW 1,2,3 MOV CX,LENGTH M1 MOV BL,LENGTH M2 MOV CX,SIZE M1 MOV BL,SIZE M2 ;SIZELENGTHTYPE五、修改屬性運(yùn)算符:五、修改屬性運(yùn)算符:PTR,THIS,HIGH,LOW,SHORT例:例:MOV AX,ES:BX N1 DB 15H,36

9、H N2 DW 1122H,3344H MOV AX,WORD PTR N1 JMP SHORT L2 K1 EQU 1234H MOV AH,HIGH K14.2 偽指令語句偽指令語句一、數(shù)據(jù)定義語句:一、數(shù)據(jù)定義語句:DB,DW,DD,DUP( )例:例:DA1 DB 10H,52H DA2 DW 1122H,34H FIRST DB HELLOSECOND DW OK M1 DB ? M2 DW 0D55H,?,? ONE DB 3 DUP(0) TWO DW 10 DUP(?)二、表達(dá)式賦值語句:二、表達(dá)式賦值語句:EQU例:例:COUNT EQU 100 DATA EQU COUNT

10、+2 B1 EQU OFFSET A1 C1 EQU ADDTHREE DB 4DUP(1,2DUP(20H)三、段定義語句三、段定義語句段定義語句段定義語句格式:段名格式:段名 SEGMENT 定義類型定義類型 組合類型組合類型 類別類別 段名段名 ENDS(1)定位類型:)定位類型:表示該段的起始邊界要求表示該段的起始邊界要求 有有PAGE/PARA/WORD/BYTEPAGE/PARA/WORD/BYTE四種四種, ,分別以頁分別以頁/ /節(jié)節(jié)/ /字字/ /字節(jié)為邊界。字節(jié)為邊界。(2)組合類型:)組合類型:告訴鏈接程序告訴鏈接程序, ,本段與其它段的組合關(guān)系本段與其它段的組合關(guān)系 共

11、共6 6種:種:nNONENONE: 本段與其它同名段不進(jìn)行連接本段與其它同名段不進(jìn)行連接, ,各段獨(dú)立(缺省值)各段獨(dú)立(缺省值)nPUBLICPUBLIC:該段與其它同名段相鄰地連在一起:該段與其它同名段相鄰地連在一起, ,組成一個邏輯段組成一個邏輯段nCOMMONCOMMON:鏈接程序為本段與其它同名段指定相同的段基址:鏈接程序為本段與其它同名段指定相同的段基址, ,采用覆蓋采用覆蓋 方式存放方式存放, ,連接長度為各段中最大長度。連接長度為各段中最大長度。nATAT表達(dá)式:鏈接程序把本段裝在表達(dá)式的值所指定的段地址上表達(dá)式:鏈接程序把本段裝在表達(dá)式的值所指定的段地址上nSTACKSTA

12、CK:指定該段的堆棧段:指定該段的堆棧段, ,在堆棧段中不可省略在堆棧段中不可省略, ,多個模塊只需設(shè)多個模塊只需設(shè) 置一個堆棧段置一個堆棧段, ,采用覆蓋方式組合。采用覆蓋方式組合。nMEMORYMEMORY:將本段定位在被連接的其它同名段上:將本段定位在被連接的其它同名段上, ,其它同名段按其它同名段按 COMMONCOMMON方式處理。方式處理。(3)類別類別:使所有類別相同的段組成一個段組使所有類別相同的段組成一個段組 典型類別:典型類別:STACKSTACK、CODECODE、DATADATA。nASSUME 段分配語句段分配語句 告訴匯編程序各段與段寄存器的關(guān)系告訴匯編程序各段與段

13、寄存器的關(guān)系, ,保證生成正確的目標(biāo)程序保證生成正確的目標(biāo)程序. . CS:指向代碼段指向代碼段 自動將段基址自動將段基址CSCSDS: 數(shù)據(jù)段數(shù)據(jù)段SS: 堆棧段堆棧段 不能自動裝入段基址不能自動裝入段基址, ,需初始化時裝入需初始化時裝入ES: 附加段附加段四、過程定義語句四、過程定義語句過程:過程:與子程序一樣,用與子程序一樣,用CALLCALL指令調(diào)用。指令調(diào)用。格式:過程名格式:過程名 PROC NEAR 或或 FAR RET 過程名過程名 ENDP五、開始與結(jié)束語句五、開始與結(jié)束語句 NAME 模塊名模塊名 TITLE 標(biāo)題標(biāo)題 ;指定每頁打印的標(biāo)題指定每頁打印的標(biāo)題 ORG 表達(dá)

14、式表達(dá)式 ;指定下面語句的起始偏移地址指定下面語句的起始偏移地址 END 標(biāo)號;標(biāo)號;匯編到此結(jié)束匯編到此結(jié)束不是必需的不是必需的主程序模塊中第一條可執(zhí)主程序模塊中第一條可執(zhí)行語句的標(biāo)號,可省略行語句的標(biāo)號,可省略lDOS不僅提供了許多命令讓用戶直接使用,還提供了一不僅提供了許多命令讓用戶直接使用,還提供了一批子程序供用戶直接調(diào)用,實現(xiàn)設(shè)備管理、文件管理、批子程序供用戶直接調(diào)用,實現(xiàn)設(shè)備管理、文件管理、目錄管理等。(見附錄目錄管理等。(見附錄F)lDOS規(guī)定用中斷指令規(guī)定用中斷指令I(lǐng)NT 21H進(jìn)入各功能調(diào)用總?cè)肟?,進(jìn)入各功能調(diào)用總?cè)肟冢贋槊總€功能調(diào)用規(guī)定一個功能號,以便進(jìn)入相應(yīng)子程再為每個

15、功能調(diào)用規(guī)定一個功能號,以便進(jìn)入相應(yīng)子程序入口。序入口。lDOS功能調(diào)用的步驟:功能調(diào)用的步驟:l系統(tǒng)功能號系統(tǒng)功能號AHAHl調(diào)用參數(shù)調(diào)用參數(shù)指定寄存器指定寄存器lINT 21HINT 21H按規(guī)定取的按規(guī)定取的出口參數(shù)出口參數(shù)入口參數(shù):或在寄存器中入口參數(shù):或在寄存器中 或無參數(shù)或無參數(shù)返回參數(shù):或在寄存器中返回參數(shù):或在寄存器中 或直接顯示等或直接顯示等一、鍵盤功能調(diào)用一、鍵盤功能調(diào)用n1號功能調(diào)用:號功能調(diào)用:從鍵盤輸入單字符并顯示從鍵盤輸入單字符并顯示MOV AH,1 INT 21H;執(zhí)行上述指令;執(zhí)行上述指令, ,系統(tǒng)將掃描鍵盤系統(tǒng)將掃描鍵盤, ,一旦有鍵按下一旦有鍵按下, ,就將

16、鍵值就將鍵值(ASCII)(ASCII)讀入讀入, ,先檢查是否為先檢查是否為Ctrl-Break,Ctrl-Break,若是若是, ,則退出則退出; ;否則否則, ,將鍵值將鍵值 AL,AL,同時將字同時將字符顯示在屏幕上。符顯示在屏幕上。例:交互式程序:例:交互式程序:KEY:MOV AH,1 CMP AL,3 INT 21H JE THREE CMP AL,1 JMP KEY JE ONE ONE: CMP AL,2 TWO: JE TWO THREE: n0BH號功能調(diào)用:號功能調(diào)用:檢查是否有鍵按下檢查是否有鍵按下 LOOP: MOV AH,0BH INT 21H INC AL JN

17、Z LOOP CALL SOUNDAL=FFH, 有有AL=00H, 無無 DATA SEGMENT BUFF DB 100 ; ; 緩沖區(qū)第一字節(jié)存放字符串最大長度緩沖區(qū)第一字節(jié)存放字符串最大長度 DB ? ; ; 第二字節(jié)待存放實際輸入的字符個數(shù)第二字節(jié)待存放實際輸入的字符個數(shù) DB 100 DUP(?) ; ;從第三字節(jié)開始存放從鍵盤接收的字符從第三字節(jié)開始存放從鍵盤接收的字符 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: PUSH DS SUB AX, AX PUSH AX MOV AX, DATA MOV DS, AX M

18、OV DX, OFFSET BUF MOV AH, 0AH INT 21H MOV BX, DX MOV CL, BX+1 ; ;輸入字符個數(shù)輸入字符個數(shù)CLCL ADD DX, 2 ; ;指向第一個字符指向第一個字符 DS:DX為緩為緩沖區(qū)首地址沖區(qū)首地址例例: : 開辟一個緩沖區(qū)開辟一個緩沖區(qū), , 接收鍵盤輸入的字符串接收鍵盤輸入的字符串, , 將輸入字符個數(shù)將輸入字符個數(shù)CL,CL,并將指針指向第一個字符。并將指針指向第一個字符。n 0AH號功能調(diào)用:號功能調(diào)用:從鍵盤接收字符串存入內(nèi)存指定緩沖區(qū)從鍵盤接收字符串存入內(nèi)存指定緩沖區(qū)l其它鍵盤功能調(diào)用:其它鍵盤功能調(diào)用: 06H號:號:直

19、接鍵盤輸入直接鍵盤輸入/ /輸出字符輸出字符, ,不檢查不檢查Ctrl-BreakCtrl-Break 08H號:號:鍵盤輸入一個字符鍵盤輸入一個字符, ,無回顯無回顯 07H號:號:直接鍵盤輸入直接鍵盤輸入/ /輸出字符輸出字符, ,無回顯無回顯, ,不檢查不檢查Ctrl-BreakCtrl-Break 0CH號:號:清鍵盤緩沖區(qū)清鍵盤緩沖區(qū), ,調(diào)用鍵盤輸入功能調(diào)用鍵盤輸入功能二、顯示功能調(diào)用二、顯示功能調(diào)用n2號功能調(diào)用:號功能調(diào)用: 將單字符送屏幕顯示將單字符送屏幕顯示 入口:字符入口:字符DLDLMOV DL, * *MOV AH, 2INT 21H ;在光標(biāo)位置顯示在光標(biāo)位置顯示

20、*n9號功能調(diào)用:號功能調(diào)用: 顯示字符串顯示字符串 入口:字符串首址入口:字符串首址DS:DXDS:DX $ $作結(jié)束符作結(jié)束符DATA SEGMENT CR EQU 0DH ;回車回車 LF EQU 0AH ;換行換行MES DB HOW DO YOU DO?,CR,LF,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN: MOV AX,DATAMOV DS,AXMOV DX,OFFSETOFFSET MESMOV AH,9INT 21HMOV AH,4CHINT 21HCODE ENDSEND MAIN例:在屏幕上顯示:例:在屏幕上顯示:

21、 HOW DO YOU DOHOW DO YOU DO?PUSH DSSUB AX, AXPUSH AX RET三、打印功能調(diào)用三、打印功能調(diào)用n5號功能調(diào)用:號功能調(diào)用:將將DL中字符中字符打印機(jī)打印機(jī)換頁換頁回車回車換行換行例:例:TEXT DB 0CH,Good morning!,0DH,0AH,$MOV BX,0MOV AH,5NEXT:MOV DL,TEXTBXCMP DL,$JE STOPINT 21HINC BXJMP NEXTSTOP: 四、設(shè)置日期與時間四、設(shè)置日期與時間n2BH功能調(diào)用:功能調(diào)用:設(shè)置日期設(shè)置日期 入口:入口:CX/DH/DL: CX/DH/DL: 年年/

22、/月月/ /日日 出口:出口:AL=0/0FFH:AL=0/0FFH:有效有效/ /無效無效n2AH功能調(diào)用:功能調(diào)用:取得日期取得日期 入口:無入口:無 出口:出口:CX/DH/DLCX/DH/DL:年:年/ /月月/ /日日n2DH功能調(diào)用:功能調(diào)用:設(shè)置時間設(shè)置時間入口:入口:CH/CL/DH/DL:CH/CL/DH/DL:時時/ /分分/ /秒秒/ /秒秒% %出口:出口:AL=0/0FFH:AL=0/0FFH:有效有效/ /無效無效n2CH功能調(diào)用:功能調(diào)用:取得時間取得時間入口:無入口:無出口:出口:CH/CL/DH/DL:CH/CL/DH/DL:時時/ /分分/ /秒秒/ /秒秒

23、% %n3號功能調(diào)用:號功能調(diào)用:異步通訊輸入異步通訊輸入 出口:出口:AL=AL=輸入數(shù)據(jù)輸入數(shù)據(jù)n4號功能調(diào)用:號功能調(diào)用:異步通訊輸出異步通訊輸出 入口:入口:DL=DL=輸出數(shù)據(jù)輸出數(shù)據(jù)COM1: 2400Bd/8COM1: 2400Bd/8位位/1/1位停止位位停止位 無校驗無校驗/ /無聯(lián)絡(luò)無聯(lián)絡(luò)五、異步通訊五、異步通訊BIOSBIOS中斷調(diào)用中斷調(diào)用 方法與方法與DOSDOS功能調(diào)用類似功能調(diào)用類似, ,自學(xué)。自學(xué)。4.5 程序設(shè)計方法程序設(shè)計方法n高質(zhì)量程序的特點(diǎn)高質(zhì)量程序的特點(diǎn)程序結(jié)構(gòu)模塊化程序結(jié)構(gòu)模塊化運(yùn)行速度快運(yùn)行速度快占內(nèi)存空間少占內(nèi)存空間少n程序的基本結(jié)構(gòu)程序的基本結(jié)

24、構(gòu)順序結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)子程序結(jié)構(gòu)n 匯編語言源程序設(shè)計步驟匯編語言源程序設(shè)計步驟 分析問題:建模分析問題:建模, ,確定算法確定算法 繪制流程圖:由粗到細(xì)繪制流程圖:由粗到細(xì) 資源分配資源分配 編寫程序編寫程序 檢查調(diào)試檢查調(diào)試 運(yùn)行分析運(yùn)行分析一、順序結(jié)構(gòu)一、順序結(jié)構(gòu)DATA SEGMENT TAB DB 0,1,4,9,16,25,36,49,64,81 BUF DB Please input one number (09):,0DH,0AH,$DATA ENDSSTACK SEGMENT STACK STACK DB 50 DUP(?) ; 定義定義

25、50字節(jié)的堆棧區(qū)字節(jié)的堆棧區(qū) TOP LABLE WORD ; 棧底別名為棧底別名為TOP, 類型為字類型為字STACK ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE, DS:DATA, SS:STACK例例1.1.查表程序查表程序 內(nèi)存中內(nèi)存中TABTAB開始存放開始存放0909的平方值,通過人機(jī)對話,查的平方值,通過人機(jī)對話,查給定數(shù)給定數(shù)X X的平方值,存入的平方值,存入ALAL中。中。START:MOV AX,DATA MOV DS,AX ;段初始化段初始化 MOV AX,STACK MOV SS,AX MOV SP,OFFSET TOP ;

26、棧指針棧指針 MOV BX,OFFSET TAB ;表頭表頭NEXT:MOV DX,OFFSET BUF MOV AH, 9 ;9號功能調(diào)用號功能調(diào)用 INT 21H ;提示輸入一個數(shù)提示輸入一個數(shù) MOV AH,1 ;1號功能調(diào)用號功能調(diào)用 INT 21H ;掃描鍵盤掃描鍵盤,鍵值鍵值A(chǔ)L MOV AH,0 AND AL,0FH ;形成偏移量形成偏移量AXADD BX,AX ;查表查表MOV AL,BX ;存結(jié)果存結(jié)果RET MAIN ENDPCODE ENDS END STARTTAB00010409162536496481TAB+1+2+3+4+5+6+7+8+9二、分支結(jié)構(gòu)二、分支結(jié)構(gòu)

27、DATA SEGMENT BUF DB N DB 01H,38H,47H,60H,76H NUM DB 3 DUP(?);存結(jié)果存結(jié)果DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE, DS:DATASTART: PUSH DSSUB AX , AXPUSH AXMOV AX , DATAMOV DS , AX例例2.2.統(tǒng)計統(tǒng)計BUFBUF為首址的字符串中數(shù)字為首址的字符串中數(shù)字, ,字母及其它符號的個數(shù)。字母及其它符號的個數(shù)。數(shù)字?jǐn)?shù)字: 09, ASCII:30H39H字母字母: AZ,ASCII:41H5AHMOV CH,N ;CH串個數(shù)串

28、個數(shù)MOV BX,1MOV DX,0 ;數(shù)字?jǐn)?shù)字,字母個數(shù)字母個數(shù)LP:MOV AH,BUFBX ;取字符取字符CMP AH,30HJL NEXT ;9,轉(zhuǎn)轉(zhuǎn)INC DH ;數(shù)字個數(shù)數(shù)字個數(shù)+1JMP NEXTABC:CMP AH,41HJL NEXT ;Z,轉(zhuǎn)轉(zhuǎn)INC DL ;字母個數(shù)字母個數(shù)+1NEXT:INC BX ;地址地址+1DEC CH ;個數(shù)個數(shù)-1JNE LPMOV BUFBX,DHMOV BUFBX+1,DLMOV AH,NSUB AH,DHSUB AH,DLMOV BUFBX+2,AHRETMAIN ENDPCODE ENDSEND STARTMOV AH,1INT 21H

29、 ;1號功能調(diào)用,鍵值號功能調(diào)用,鍵值 ALCMP AL,0JE P0CMP AL,1JE P1 CMP AL,7JE P7 方法簡單,但速度慢方法簡單,但速度慢例例3. 3. 查詢法實現(xiàn)多分支查詢法實現(xiàn)多分支有有8 8個加工子程序,入口地址分別為:個加工子程序,入口地址分別為:P0,P1,P2,P0,P1,P2,P7P7。根據(jù)鍵盤輸入命令根據(jù)鍵盤輸入命令, ,依次轉(zhuǎn)向依次轉(zhuǎn)向8 8個子程序。個子程序。DATA SEGMENT BASE DW P0,P1,P2,P3,P4,P5,P6,P7DATA ENDS MOV AH,1INT 21H ; AL鍵值鍵值A(chǔ)ND AL,0FHMOV BX,OF

30、FSET BASE ;BX表首址表首址MOV AH,0ADD AL,AL ;形成偏移量形成偏移量ADD BX,AX ;表地址表地址JMP WORD PTRBX ;轉(zhuǎn)入口地址轉(zhuǎn)入口地址 P0LP0HP1LP1HP2LP2HP3LP3HP7LP7HBASE+2+4+6+14偏移量偏移量例例4.4.跳轉(zhuǎn)表實現(xiàn)多分支之一:根據(jù)表內(nèi)地址分支跳轉(zhuǎn)表實現(xiàn)多分支之一:根據(jù)表內(nèi)地址分支 元素在表中的地址元素在表中的地址, ,即即: :表地址表首址偏移量表地址表首址偏移量DATA SEGMENTBASE DB E9,P0L,P0H,E9,P1L,P1H,DATA ENDSMOV AH,1INT 21H AND A

31、L,0FHMOV BL,ALADD AL,ALADD AL,BL ;偏移量偏移量=鍵值鍵值*3 MOV AH,0MOV BX,OFFSET BASE ;表首址表首址ADD BX,AX ;表地址表地址JMP BX ;跳入表內(nèi)跳入表內(nèi),執(zhí)行轉(zhuǎn)移指令執(zhí)行轉(zhuǎn)移指令E9P0LP0HE9P1LP1HE9P2LP2HE9P7LP7HBASE+3+6+21 JMP P0JMP P1JMP P2JMP P7也可根據(jù)關(guān)鍵字跳轉(zhuǎn)表實現(xiàn)分支也可根據(jù)關(guān)鍵字跳轉(zhuǎn)表實現(xiàn)分支例例5.5.利用跳轉(zhuǎn)表實現(xiàn)多分支之二:根據(jù)表內(nèi)指令分支利用跳轉(zhuǎn)表實現(xiàn)多分支之二:根據(jù)表內(nèi)指令分支三、循環(huán)結(jié)構(gòu)程序三、循環(huán)結(jié)構(gòu)程序兩種結(jié)構(gòu):兩種結(jié)構(gòu):初始

32、化循環(huán)體修改參數(shù)控制條件出口 初始化循環(huán)體控制條件修改參數(shù)出口先執(zhí)行,后判斷先判斷,后執(zhí)行YYNN至少執(zhí)行一次循環(huán)體至少執(zhí)行一次循環(huán)體用于次數(shù)固定的程序用于次數(shù)固定的程序可能一次也不執(zhí)行循環(huán)體可能一次也不執(zhí)行循環(huán)體用于次數(shù)不固定的程序用于次數(shù)不固定的程序例例6. 十六進(jìn)制數(shù)十六進(jìn)制數(shù)ASCII將將BX中的中的16進(jìn)制數(shù)轉(zhuǎn)換為進(jìn)制數(shù)轉(zhuǎn)換為ASCII,存放到存放到BUF開始的單元中開始的單元中,并顯示出來。并顯示出來。 MOV SI,OFFSET BUF MOV CH,4NEXT:MOV CL,4 ROL BX,CL ;最高最高4位移右邊位移右邊 MOV AL,BL AND AL,0FH ADD

33、AL,30H CMP AL,3AH JL STORE ;09,轉(zhuǎn)轉(zhuǎn) ADD AL,7 ;AF,+7 STORE:MOV SI,ALMOV AH,2MOV DL,ALINT 21HINC SIDEC CHJNZ NEXTHLT先循環(huán)先循環(huán),后判斷后判斷 MOV CL,0 L1: AND AX,AX ; JZ STOP SAL AX,1 JNC L1 INC CL L2: JMP L1 STOP: HLT 例例7. AX7. AX寄存器中有一個寄存器中有一個1616位二進(jìn)制數(shù)位二進(jìn)制數(shù), ,統(tǒng)計其中統(tǒng)計其中1 1的個數(shù)的個數(shù), ,并存入并存入CLCL中。中。重置重置PSW先判斷先判斷,后循環(huán)后循環(huán)

34、例例8. 8. 邏輯尺控制循環(huán)邏輯尺控制循環(huán) 某采樣系統(tǒng)某采樣系統(tǒng): :第第1,2,5,7,101,2,5,7,10次,按公式次,按公式FUN1=X+5FUN1=X+5計算計算 第第3,4,6,8,9 3,4,6,8,9 次,按公式次,按公式FUN2=X-3FUN2=X-3計算計算DATA SEGMENT LOGRUL EQU 0011010110000000B COUNT EQU 10 BUF DB 20 DUP(?) ;采樣數(shù)據(jù)采樣數(shù)據(jù) BLOCK DB 20 DUP(?) ;存處理后的數(shù)據(jù)存處理后的數(shù)據(jù)DATA ENDS MOV DX,LOGRULMOV CX,COUNT MOV SI,

35、OFFSET BUF MOV DI,OFFSET BLOCKNEXT:MOV AX,WORD PTRSI ROL DX,1 JC FUN2 FUN1: ADD AX,5 JMP NEXT1 FUN2:SUB AX,3NEXT1:MOV DI,AX INC SI INC SI INC DI INC DI LOOP NEXT 編程思路編程思路:從第一個數(shù)開始從第一個數(shù)開始, ,順序比較相鄰兩數(shù)順序比較相鄰兩數(shù), ,若順序不對若順序不對, ,則交換位置則交換位置, ,第一遍比較第一遍比較N-1N-1次次, ,最大數(shù)沉到數(shù)尾最大數(shù)沉到數(shù)尾; ;第二遍只需比第二遍只需比較較N-2N-2次次; ;共進(jìn)行共

36、進(jìn)行N-1N-1遍即可完成排序。(遍即可完成排序。(冒泡法冒泡法) 若設(shè)置交換標(biāo)志若設(shè)置交換標(biāo)志, ,可加快進(jìn)程。(書中第二種方法)可加快進(jìn)程。(書中第二種方法)STARTSTART:MOV DI,OFFSETOFFSET BUF MOV CX,DI DEC CX ;內(nèi)循環(huán)次數(shù)內(nèi)循環(huán)次數(shù)=N-1L1:MOV DX,CX ;DX=外循環(huán)次數(shù)外循環(huán)次數(shù) MOV BH,0 ;交換標(biāo)志交換標(biāo)志L2:ADD DI,2 ;指向下一個字指向下一個字 MOV AX,DI CMP AX,DI+2 ;相鄰兩數(shù)比較相鄰兩數(shù)比較 JBE CONTI CONTI ;XiXi+1,不交換不交換 XCHG AX,DI+2

37、;XiXi+1,交換交換 MOV DI,AX MOV BH,1 ;交換標(biāo)志置交換標(biāo)志置1CONTICONTI:LOOP L2 CMP BH,0 JE STOPSTOP ;未發(fā)生交換未發(fā)生交換,結(jié)束結(jié)束 MOV CX,DX MOV DI,OFFSETOFFSET BUF LOOP L1 ;CX-1,DX-1STOPSTOP: RET 例例9. 9. 多重循環(huán):給多重循環(huán):給BUFBUF開始的字?jǐn)?shù)組按從小到大的順序排列。開始的字?jǐn)?shù)組按從小到大的順序排列。四、子程序結(jié)構(gòu)四、子程序結(jié)構(gòu) 子程序子程序(過程過程)調(diào)用應(yīng)處理好三個問題:調(diào)用應(yīng)處理好三個問題:n保護(hù)斷點(diǎn):保護(hù)斷點(diǎn):CS,IPCS,IP入棧及

38、出棧(入棧及出棧(CPUCPU自動完成)自動完成)n保護(hù)現(xiàn)場:保護(hù)現(xiàn)場:子程序中用到的寄存器子程序中用到的寄存器/ /存儲單元需保護(hù)存儲單元需保護(hù)n參數(shù)傳遞:參數(shù)傳遞: 寄存器傳遞寄存器傳遞: : 速度快速度快, ,參數(shù)少參數(shù)少 存儲器傳遞存儲器傳遞 堆棧傳遞堆棧傳遞可傳遞較多參數(shù)可傳遞較多參數(shù)例例10. 完整形式的子程序完整形式的子程序; ;名稱:名稱:BCD2BINBCD2BIN; ;功能:將一個字節(jié)功能:將一個字節(jié)BCDBCD碼碼; ; 轉(zhuǎn)換成二進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù); ;使用寄存器使用寄存器:CX:CX; ;入口參數(shù):入口參數(shù): ALAL存放兩位存放兩位BCDBCD碼碼; ;出口參數(shù):出

39、口參數(shù): ALAL存放二進(jìn)制數(shù)存放二進(jìn)制數(shù); ;調(diào)用其它子程序:無調(diào)用其它子程序:無BCD2BIN PROC FARPUSH CXMOV CH,ALAND CH,0FHMOV CL,4SHR AL,CL MOV CL,10 MUL CL ADD AL,CH POP CX RETBCD2BIN ENDP通過寄存器傳遞參數(shù)通過寄存器傳遞參數(shù)DATA SEGMENTARY1 DW 100 DUP(?) ; 定義數(shù)組定義數(shù)組1 1SUM1 DW ? ; 和和ARY2 DW 100 DUP(?) ; 定義數(shù)組定義數(shù)組2 2SUM2 DW ? ; 和和DATA ENDS 例例11.11.數(shù)據(jù)段定義兩個數(shù)組

40、數(shù)據(jù)段定義兩個數(shù)組, ,分別求兩數(shù)組元素之和分別求兩數(shù)組元素之和( (不計溢出不計溢出) )。MAIN PROC FAR ;主程序主程序START: LEA SI,ARY1 MOV CX,LENGTH ARY1 CALL SUM LEA SI,ARY2 MOV CX,LENGTH ARY2 CALL SUM RET MAIN ENDPSUM PROC NEAR;求和子程序求和子程序 XOR AX,AX L1: ADD AX,WORD PTRSI INC SI INC SI LOOP L1 MOV WORD PTRSI,AX RETSUM ENDP 通過存儲單元傳遞參數(shù)通過存儲單元傳遞參數(shù)例例1

41、2. 12. 分別求兩個十進(jìn)制數(shù)組之和分別求兩個十進(jìn)制數(shù)組之和DATA SEGMENTDATA SEGMENTARY1 DB 20 DUP(?)ARY1 DB 20 DUP(?)SUM1 DW ?SUM1 DW ?ARY2 DB 100 DUP(?)ARY2 DB 100 DUP(?)SUM2 DW ?SUM2 DW ?DATA ENDSDATA ENDS MAIN PROC FAR ;MAIN PROC FAR ;主程序主程序START:START: MOV AX,OFFSET ARY1; MOV AX,OFFSET ARY1;數(shù)組數(shù)組1 1首址首址 PUSH AXPUSH AX MOV A

42、X,SIZE ARY1 ; MOV AX,SIZE ARY1 ;數(shù)組數(shù)組1 1個數(shù)個數(shù) PUSH AXPUSH AX CALL FAR PTR PADD ; CALL FAR PTR PADD ;調(diào)子程序調(diào)子程序MOV AX,OFFSET ARY2MOV AX,OFFSET ARY2PUSH AXPUSH AXMOV AX,SIZE ARY2MOV AX,SIZE ARY2PUSH AXPUSH AXCALL FAR PTR PADDCALL FAR PTR PADDRETRET PCODE SEGMENT ; PCODE SEGMENT ;子程序子程序 ASSUMEASSUME CSCS:P

43、CODEPCODE,DSDS:DATA,DATA,與主程序不與主程序不在一個段在一個段堆棧傳遞參數(shù)堆棧傳遞參數(shù)PADD PROC FARPUSH BX ;保護(hù)現(xiàn)場保護(hù)現(xiàn)場PUSH CXPUSH BPMOV BP,SPPUSHFMOV CX,BP+10 ;數(shù)組長度數(shù)組長度MOV BX,BP+12 ;數(shù)組首址數(shù)組首址MOV AX,0NEXT:ADD AL,BXDAAMOV DL,ALMOV AL,0ADC AL,AH ; AL 0+CF+AHDAAMOV AH,AL ; AH 高位累加和高位累加和MOV AL,DLINC BXLOOP NEXTMOV BX,AXPOPFPOP BPPOP CXPOP BXRET 4;PADD ENDP彈出斷點(diǎn)后彈出斷點(diǎn)后,再彈出再彈出4個子節(jié)個子節(jié),使使SIZE,ARY作廢作廢,恢復(fù)恢復(fù)SPPSWBPCXBXIPCSSIZEARY

溫馨提示

  • 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

提交評論