版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
匯編語言程序設計第四章4.0概述4.1匯編語言程序格式4.2MASM中的表達式4.3
偽指令語句4.4程序設計方法4.5DOS系統(tǒng)功能調用4.4程序設計方法一、匯編語言源程序設計基本步驟
1、明確任務,確定算法。
2、畫流程圖。
3、分配存儲空間及工作單元分析需要定義的段、變量、變量類型、長度;規(guī)劃各寄存器的使用等
4、編寫源程序(.ASM)、匯編(.OBJ)、連接(.EXE)。
5、程序調試。主要采用DEBUG來調試。開始執(zhí)行框判斷二、基本程序結構順序結構分支結構循環(huán)結構子程序結構DATASEGMENT………DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX……………
MOVAH,4CHINT21HCODEENDS
ENDSTART……………順序結構分支結構循環(huán)結構子程序結構順序結構順序結構分支結構循環(huán)結構子程序結構兩個分支YN三個分支YYNN順序結構分支結構循環(huán)結構子程序結構循環(huán)初始設置循環(huán)體循環(huán)條件判斷?YNYN循環(huán)初始設置循環(huán)體循環(huán)條件判斷?順序結構分支結構循環(huán)結構子程序結構codeSEGMENT…begin:…CALL
sub1…
CALLsub2
…MOVAH,4CHINT21Hsub1PROC…RETsub1ENDPsub2PROC…RETsub2ENDPcodeENDSENDbegin1、順序結構例1:已知當前數(shù)據段中有一個十進制數(shù)字0~9的七段代碼表,其數(shù)值依次為40H、79H、24H、30H、19H、12H、02H、78H、00H、18H。要求用XLAT指令將十進制數(shù)57轉換成相應的七段代碼值,存到BX寄存器中,編寫完整的匯編源程序。分析:先求5的七段代碼值,再求數(shù)字7的;需定義數(shù)據段、七段代碼表:TAB,字節(jié)變量;關鍵指令XLAT,表偏移地址放BX,原數(shù)字放入AL;三、程序舉例源程序清單:DATASEGMENTTABDB40H,79H,24H,30HDB19H,12H,02H,78HDB00H,18HDATAENDSCODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
(轉右)
MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART
MOVBX,OFFSETTAB
MOVAL,5XLATMOVAH,ALMOVAL,7XLATMOVBX,AX2、分支結構程序根據不同條件選擇不同處理方法三、程序舉例例2:求內存中數(shù)X的絕對值,并送回原處2.根據以上分析畫出流程框圖3.根據流程圖確定所用寄存器,并編寫源程序;需定義數(shù)據段、變量X、使用寄存器AL1.分析:XX-0X0X<0|X|=
程序框圖及清單:開始從內存取數(shù)X0?
對X求負并回送結束YN
DATASEGMENT
XDB?
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;MOVDS,AX將數(shù)據段段地址送入DSMOVAL,[X]CMPAL,00H
;與0比較JGERETURNNEGAL
;求負MOV[X],AL
;回送結果RETURN:MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART
;結束源程序3、循環(huán)結構兩種形式:1)“先執(zhí)行,后判斷”:進入循環(huán)后至少要執(zhí)行一次循環(huán)體,再判斷循環(huán)是否結束。---用于循環(huán)次數(shù)固定的程序(簡單)(掌握)2)“先判斷,后執(zhí)行”:進入循環(huán)后,先判斷循環(huán)結束條件,再決定是否執(zhí)行循環(huán)體,可能循環(huán)體一次也不執(zhí)行。
---用于循環(huán)次數(shù)不確定的程序三、程序舉例(a)“先執(zhí)行,后判斷”結構(b)“先判斷,后執(zhí)行”結構初始化部分入口循環(huán)體修改參數(shù)出口循環(huán)條件?YN初始化部分入口循環(huán)體修改參數(shù)出口YN循環(huán)條件?兩種循環(huán)結構都包括四部分:1)初始化---設置計數(shù)值、地址指針2)循環(huán)體---循環(huán)部分的核心:循環(huán)的全部執(zhí)行指令3)修改參數(shù)---改地址指針,為下次循環(huán)做準備4)循環(huán)控制---修改計數(shù)值,進行判斷(LOOP)例3:將附加段起始地址為DA1的100個字節(jié)的存儲區(qū)內容清0。DATASEGMENTDA1DB100DUP(?)DATAENDSCODESEGMENT
ASSUMECS:CODE,ES:DATASTART:MOVAX,DATAMOVES,AX
(轉右邊)
MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART讀程序:分析程序執(zhí)行過程、功能及特點
MOVAL,00HMOVCX,0064HLEABX,DA1;初始化LP:MOVES:[BX],AL;循環(huán)體INCBX;修改參數(shù)
LOOPLP;循環(huán)控制
例4:編程在一串給定個數(shù)的數(shù)據區(qū)BUFF中尋找最小數(shù),結果存放至MIN單元中!(循環(huán)+分支結構)
DATASEGMENTBUFFDB42H,56,34,-5,-9,-78CONTEQU$-BUFFMINDB00H
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(轉下頁)
MOVAH,4CH
INT21HCODEENDSENDSTART
LEABX,BUFFMOVCX,CONTMOVAL,[BX];初始化LP:CMPAL,[BX];循環(huán)體
JLENEXTMOVAL,[BX]NEXT:INCBX;修改參數(shù)LOOPLP;循環(huán)控制
MOVMIN,AL作業(yè)補充在BLOCK開始有一個字節(jié)型數(shù)組,共有15個元素,利用匯編語言編寫完整的程序,計算這個數(shù)組中奇數(shù)的個數(shù),并將結果存入內存SUM單元。
例5:數(shù)據段從BUFF開始有一字數(shù)組,存放N個有符號數(shù)據,編程將數(shù)據按從小到大排序!(雙重循環(huán))
DATASEGMENTBUFFDW
42H,56,34,-5,-9,-78NEQU($-BUFF)/2
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(轉下頁)
MOVAH,4CH
INT21HCODEENDSENDSTART
MOVCX,N-1LPW:MOVBX,00HMOVDX,CX;初始化LPN:MOVAX,BUFF[BX];循環(huán)體CMPAX,BUFF[BX+2]
JLENEXTXCHGAX,BUFF[BX+2]MOVBUFF[BX],AXNEXT:ADDBX,2;修改參數(shù)DECDX;循環(huán)控制JNZLPNLOOPLPW
;循環(huán)控制(轉右邊)思考:1、若為無符號數(shù)?2、若要求原數(shù)據不變?4、子程序結構子程序:能完成特定功能而又經常用到的程序段,編寫成獨立的模塊,供其它程序調用,稱為子程序或過程。子程序結構的定義:使用過程定義語句PROC…ENDP。子程序屬性:調用程序和過程在同一代碼段中,則用NEAR屬性;調用程序和過程不在同一代碼段,使用FAR屬性。三、程序舉例過程調用和返回調用指令:CALL過程名返回指令:RET子程序說明:⑴功能描述:名稱,功能⑵子程序中用到的寄存器和存儲單元⑶子程序的入口參數(shù),出口參數(shù)⑷調用其它子程序的名稱子程序結構段內調用格式codeSEGMENT…begin:…CALL
sub1…
CALLsub2
…MOVAH,4CHINT21Hsub1PROC…RETsub1ENDPsub2PROC…RETsub2ENDPcodeENDSENDbegin子程序結構段間調用格式(自學)codeSEGMENT…begin:…CALL
FARPTRsub1…MOVAH,4CHINT21HcodeENDScode1SEGMENT…sub1PROCFAR…RETsub1ENDPcode1ENDSENDbegin子程序設計注意以下三點:⑴保護調用程序的斷點:由CALL指令本身完成。⑵保護某些寄存器內容(非入口/出口參數(shù)):在子程序開頭,用一組PUSH指令,保護寄存器原來的內容;在子程序結尾,用一組POP指令,將寄存器原來的內容恢復。⑶主程序和子程序間的參數(shù)傳遞。入口參數(shù):子程序所需的初始數(shù)據。(調用時)
出口參數(shù):子程序運行所得結果。(返回時)參數(shù)傳遞常用的方法:①用寄存器傳遞參數(shù):參數(shù)較少,速度較快。②用存儲器傳遞參數(shù):參數(shù)較多;
調用前,將參數(shù)存入內存,將參數(shù)首地址送入某一寄存器(BX、SI、DI、BP)。進入過程后可采用寄存器間接尋址方式從內存中取出。③用堆棧傳遞參數(shù):參數(shù)較多,多用在子程序嵌套與遞歸調用中。例6:數(shù)據段定義兩個字型數(shù)組,編程序實現(xiàn)數(shù)組分別求和(不計溢出),要求用子程序實現(xiàn)求和。解:通過存儲器來傳遞參數(shù)。子程序說明如下:子程序名:SUB_SUM功能:求一數(shù)組之和所用REG:AX入口參數(shù):數(shù)組地址指針SI、
數(shù)組長度存于CX出口參數(shù):結果在AX中讀程序:分析程序執(zhí)行過程、功能及特點DATA SEGMENTARY1 DW100DUP(?) ;定義數(shù)組1SUM1DW?ARY2 DW100DUP(?) ;定義數(shù)組2SUM2 DW?DATAENDSCODE SEGMENT
ASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOVDS,AX(轉下頁)LEASI,ARY1;數(shù)組1首地址,入口參數(shù)MOVCX,LENGTHARY1;數(shù)組1長度,入口參數(shù)CALLSUB_SUM
;調用求和子程序MOVSUM1,AX;數(shù)組1之和送SUM1LEA SI,ARY2;數(shù)組2首地址,入口參數(shù)MOVCX,LENGTHARY2;數(shù)組2長度,入口參數(shù)CALLSUB_SUM
;調用求和子程序MOVSUM2,AX;數(shù)組2之和送SUM2MOVAH,4CHINT21H(轉下頁)SUB_SUMPROC NEAR
;子程序
XORAX,AX;AX清0L1:ADDAX,WORDPTR[SI];加數(shù)組元素
INCSIINCSILOOPL1
RET
;子程序返回SUB_SUMENDP
CODE ENDSEND START4.5DOS系統(tǒng)功能調用一、DOS中斷和BIOS中斷
DOS操作系統(tǒng)或ROMBIOS程序提供的一組子程序,用“INTN”指令調用。DOS中斷:DOS操作系統(tǒng)提供,位于系統(tǒng)磁盤,主要用于I/O設備管理、目錄及文件管理。BIOS中斷:ROM提供,位于內存,主要用于系統(tǒng)加電自檢、引導裝入初始化程序等。二、DOS中斷(占用類型號即N為:20H~3FH)DOS專用中斷:INT22H,INT23H,INT24H
不能直接調用DOS可調用中斷:
INT20H,INT21H,INT25H等一定條件下調用最常用的:INT21H
稱為:DOS系統(tǒng)功能調用
21H為子程序的總入口,進入后可調用各種功能。詳見“附錄F,P508”表4.6DOS常用的軟件中斷命令CF=0成功CF=1出錯CF=0成功CF=1出錯相應出口號無出口參數(shù)DS:DX=程序長度駐留退出INT27HAL=驅動器號CX=寫入扇區(qū)數(shù)DX=起始邏輯區(qū)號DS:BX=內存緩沖區(qū)地址寫磁盤INT26HAL=驅動器號CX=讀入扇區(qū)數(shù)DX=起始邏輯區(qū)號DS:BX=內存緩沖區(qū)地址讀磁盤INT25H出錯退出INT24HCtrl-Break處理INT23H結束退出INT22HAH=功能號,相應入口號系統(tǒng)功能調用INT21H無程序正常退出INT20H入口參數(shù)功能軟中斷命令程序前綴ProgramSegmentPrefix256個字節(jié)安排三、DOS系統(tǒng)功能調用的步驟及實例步驟:
1.設置入口參數(shù)
2.將功能號放入AH寄存器
3.使用指令INT21H轉入子程序入口
4.獲得出口參數(shù),分析結果一般:2、3步必須有;1、4視情況而定DOS系統(tǒng)功能調用實例
以DOS鍵盤功能調用、DOS顯示功能調用為例
1、單字符輸入(1號功能)
2、字符串輸入(0A號功能)
3、單字符顯示(2號功能)
4、字符串顯示(9號功能)1、單字符輸入(1號功能)功能:從鍵盤輸入一個字符到AL中,并回顯入口參數(shù):無出口參數(shù):AL=ASCII碼例:程序段
………MOVAH,01HINT21H………等待鍵入字符;若鍵‘A’,則屏幕上顯示‘A’;且AL=41H2、字符串輸入(0A號功能)功能:多個字符輸入到緩沖區(qū)入口參數(shù):DS:DX=輸入緩沖區(qū)首地址出口參數(shù):DS:DX=輸入字符串所在緩沖區(qū)地址緩沖區(qū)定義格式:第1字節(jié):設定允許輸入字符的最大個數(shù)第2字節(jié):預留,系統(tǒng)最后自動填入實際輸入的字符數(shù)第3字節(jié):開始存放輸入的字符,至‘回車’鍵結束例:從鍵盤輸入字符串至緩沖區(qū)BUFF………BUFFDB32DB?DB32DUP(00)………
MOVAX,SEGBUFFMOVDS,AXLEADX,BUFFMOVAH,0AHINT21H………執(zhí)行結果分析:若鍵入WELCOME<Enter>則:屏幕每鍵入一個字符,光標右移一次;最后顯示:WELCOME字符串內存情況如右圖:……BUFF207‘W’‘E’‘L’‘C’‘O’‘M’‘E’0D3、單字符顯示(2號功能)功能:在屏幕上顯示一個字符入口參數(shù):DL=ASCII碼出口參數(shù):無例:在屏幕上顯示字符A………MOVDL,‘A’MOVAH,2HINT21H………4、字符串顯示(9號功能)功能:多個字符輸出到屏幕顯示入口參數(shù):DS:DX=輸出字符緩沖區(qū)首地址出口參數(shù):無注意:字符串以‘$’結束例:在屏幕上顯示一串字符‘Howdoyoudo?’
DATASEGMENTBUFFDB‘Howdoyoudo?’,‘$’DATAENDSCODESEGMENT ASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AX
LEADX,BUFFMOVAH,9INT21H ……思考:若該字符串定義在附加段,應如何修改程序?5、返回DOS操作系統(tǒng)
……
MOVAH,4CHINT21H……4.4.5綜合舉例
1.代碼轉換例4.67
將十六位二進制數(shù)轉換成4位壓縮型BCD碼算法:將AX中的二進制數(shù)先后除以1000、100和10,每次除法所得的商,即是BCD碼的千位、百位和十位數(shù),余數(shù)是個位數(shù)。;子程序名:B2TOBCD;輸入參數(shù):AX=十六位二進制數(shù);輸出參數(shù):CF=0,則AX=4位壓縮型BCD碼。CF=1,則要轉換的數(shù)大于9999,AX不變。;使用寄存器:CX:存放除數(shù),DX:存放中間結果B2TOBCDPROCFARCMPAX,9999JBETRANS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第5單元 走向近代(高頻選擇題50題)(原卷版)
- 八年級下冊期末考試模擬卷01(答案及解析)
- 2024年婚姻年度總結
- 《家庭裝修銷售》課件
- 班級動態(tài)管理與調整策略計劃
- 話務員旅游服務行業(yè)客服
- 深度探索莎翁人性
- 大學生產實習報告四篇
- 安全防范工程師的職責和任務描述
- 銷售提成方案范文集錦7篇
- 鐵路工程-軌道工程施工工藝及方案
- 福建省福州市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細及行政區(qū)劃代碼
- 《高中語文文言斷句》一等獎優(yōu)秀課件
- 上海市中小學生學籍信息管理系統(tǒng)
- (完整版)自動感應門施工方案
- [QC成果]提高剪力墻施工質量一次合格率
- 8站小車呼叫的plc控制
- _ 基本粒子與宏觀物體內在聯(lián)系
- 象棋比賽積分編排表
- 小學贛美版六年級美術上冊第二十課向往和平課件(16張)ppt課件
- DPP4抑制劑比較篇PPT課件
評論
0/150
提交評論