




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
匯編語言程序設(shè)計第四章4.0概述4.1匯編語言程序格式4.2MASM中的表達(dá)式4.3
偽指令語句4.4程序設(shè)計方法4.5DOS系統(tǒng)功能調(diào)用4.4程序設(shè)計方法一、匯編語言源程序設(shè)計基本步驟
1、明確任務(wù),確定算法。
2、畫流程圖。
3、分配存儲空間及工作單元分析需要定義的段、變量、變量類型、長度;規(guī)劃各寄存器的使用等
4、編寫源程序(.ASM)、匯編(.OBJ)、連接(.EXE)。
5、程序調(diào)試。主要采用DEBUG來調(diào)試。開始執(zhí)行框判斷二、基本程序結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)DATASEGMENT………DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX……………
MOVAH,4CHINT21HCODEENDS
ENDSTART……………順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)順序結(jié)構(gòu)順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)兩個分支YN三個分支YYNN順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?YNYN循環(huán)初始設(shè)置循環(huán)體循環(huán)條件判斷?順序結(jié)構(gòu)分支結(jié)構(gòu)循環(huán)結(jié)構(gòu)子程序結(jié)構(gòu)codeSEGMENT…begin:CALL
sub1
CALLsub2
CALLsub3MOVAH,4CHINT21Hsub1PROC…RETsub1ENDPsub2PROC…RETsub2ENDPsub3PROC…RETsub3ENDPcodeENDSENDbegin1、順序結(jié)構(gòu)例1:已知當(dāng)前數(shù)據(jù)段中有一個十進(jìn)制數(shù)字0~9的七段代碼表,其數(shù)值依次為40H、79H、24H、30H、19H、12H、02H、78H、00H、18H。要求用XLAT指令將十進(jìn)制數(shù)57轉(zhuǎn)換成相應(yīng)的七段代碼值,存到BX寄存器中,編寫完整的匯編源程序。分析:先求5的七段代碼值,再求數(shù)字7的;需定義數(shù)據(jù)段、七段代碼表:TAB,字節(jié)變量;關(guān)鍵指令XLAT,表偏移地址放BX,原數(shù)字放入AL;三、程序舉例源程序清單:DATASEGMENTTABDB40H,79H,24H,30HDB19H,12H,02H,78HDB00H,18HDATAENDSCODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX
(轉(zhuǎn)右)
MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART
MOVBX,OFFSETTAB
MOVAL,5XLATMOVAH,ALMOVAL,7XLATMOVBX,AX2、分支結(jié)構(gòu)程序根據(jù)不同條件選擇不同處理方法三、程序舉例例2:求內(nèi)存中數(shù)X的絕對值,并送回原處2.根據(jù)以上分析畫出流程框圖3.根據(jù)流程圖確定所用寄存器,并編寫源程序;需定義數(shù)據(jù)段、變量X、使用寄存器AL1.分析:XX-0X0X<0|X|=
程序框圖及清單:開始從內(nèi)存取數(shù)X0?
對X求負(fù)并回送結(jié)束YN
DATASEGMENT
XDB?
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;MOVDS,AX將數(shù)據(jù)段段地址送入DSMOVAL,[X]CMPAL,00H
;與0比較JGERETURNNEGAL
;求負(fù)MOV[X],AL
;回送結(jié)果RETURN:MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART
;結(jié)束源程序3、循環(huán)結(jié)構(gòu)兩種形式:1)“先執(zhí)行,后判斷”:進(jìn)入循環(huán)后至少要執(zhí)行一次循環(huán)體,再判斷循環(huán)是否結(jié)束。---用于循環(huán)次數(shù)固定的程序(掌握)2)“先判斷,后執(zhí)行”:進(jìn)入循環(huán)后,先判斷循環(huán)結(jié)束條件,再決定是否執(zhí)行循環(huán)體,可能循環(huán)體一次也不執(zhí)行。
---用于循環(huán)次數(shù)不確定的程序三、程序舉例(a)“先執(zhí)行,后判斷”結(jié)構(gòu)(b)“先判斷,后執(zhí)行”結(jié)構(gòu)循環(huán)控制初始化部分入口循環(huán)體修改參數(shù)出口初始化部分入口循環(huán)控制循環(huán)體修改參數(shù)出口兩種循環(huán)結(jié)構(gòu)都包括四部分:1)初始化---設(shè)置計數(shù)值、地址指針2)循環(huán)體---循環(huán)部分的核心:循環(huán)的全部執(zhí)行指令3)修改參數(shù)---改地址指針,為下次循環(huán)做準(zhǔn)備4)循環(huán)控制---修改計數(shù)值,進(jìn)行判斷(LOOP)例3:將附加段起始地址為DA1的100個字節(jié)的存儲區(qū)內(nèi)容清0。DATASEGMENTDA1DB100DUP(?)DATAENDSCODESEGMENT
ASSUMECS:CODE,ES:DATASTART:MOVAX,DATAMOVES,AX
(轉(zhuǎn)右邊)
MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART
MOVAL,00HMOVCX,0064HLEABX,DA1;初始化LP:MOVES:[BX],AL;循環(huán)體INCBX;修改參數(shù)
LOOPLP;循環(huán)控制
例4:統(tǒng)計一字符串BUF(長度小于256)中的大寫字母、數(shù)字及其他字符的個數(shù),分別存入LETTR、DIGIT和OTHER單元。(循環(huán)+分支結(jié)構(gòu))
DATASEGMENTBUFDB‘123SAFASFLXCvfv@%¥&%’COUNTEQU$-BUFLETTERDB0DIGITDB0OTHERDB0
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(轉(zhuǎn)下頁)
MOVAH,4CH
INT21HCODEENDSENDSTART
MOVCX,COUNT
MOVBX,00HMOVDX,0;初始化LP:MOVAL,BUF[BX];循環(huán)體CMPAL,30H
JLNEXTCMPAL,39H
JGABC
INCDHJMPNEXTABC:CMPAL,41H
JLNEXTCMPAL,5AH(轉(zhuǎn)右邊)
JGNEXT
INCDLNEXT:INCBXLOOPLPMOVLETTER,DLMOVDIGIT,DHMOVAL,COUNTSUBAL,LETTERSUBAL,DIGITMOVOTHER,AL
例5:編程在一串給定個數(shù)的數(shù)據(jù)區(qū)BUFF中尋找最小數(shù),結(jié)果存放至MIN單元中!(循環(huán)+分支結(jié)構(gòu))
DATASEGMENTBUFFDB42H,56,34,-5,-9,-78……COUNTEQU$-BUFFMINDB00H
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(轉(zhuǎn)下頁)
MOVAH,4CH
INT21HCODEENDSENDSTART
LEABX,BUFFMOVCX,COUNT-1MOVAL,[BX];初始化LP:CMPAL,[BX+1];循環(huán)體
JLENEXTMOVAL,[BX+1]NEXT:INCBX;修改參數(shù)LOOPLP;循環(huán)控制
MOVMIN,AL
例6:數(shù)據(jù)段從BUFF開始有一字?jǐn)?shù)組,存放N個有符號數(shù)據(jù),編程將數(shù)據(jù)按從小到大排序!(雙重循環(huán))
DATASEGMENTBUFFDW
42H,56,34,-5,-9,-78……NEQU($-BUFF)/2
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(轉(zhuǎn)下頁)
MOVAH,4CH
INT21HCODEENDSENDSTART
MOVCX,N-1LPW:MOVBX,0MOVDX,CX;初始化LPN:MOVAX,BUFF[BX];循環(huán)體CMPAX,BUFF[BX+2]
JLENEXTXCHGAX,BUFF[BX+2]MOVBUFF[BX],AXNEXT:ADD
BX,2
;修改參數(shù)DECDX;循環(huán)控制JNZLPNLOOPLPW;循環(huán)控制(轉(zhuǎn)右邊)思考:1、若為無符號數(shù)?2、若要求原數(shù)據(jù)不變?3、優(yōu)化算法?4、將排好序的數(shù)送到附加段的COPY單元?4、子程序結(jié)構(gòu)子程序:將多次使用的程序語句寫成一個相對獨(dú)立的程序段,稱為子程序或過程。子程序結(jié)構(gòu)的定義:使用過程定義語句PROC…ENDP。子程序?qū)傩裕赫{(diào)用程序和過程在同一代碼段中,則用NEAR屬性;調(diào)用程序和過程不在同一代碼段,使用FAR屬性。三、程序舉例過程調(diào)用和返回調(diào)用指令:CALL過程名返回指令:RET子程序說明:⑴功能描述:名稱,功能⑵子程序中用到的寄存器和存儲單元⑶子程序的入口參數(shù),出口參數(shù)⑷調(diào)用其它子程序的名稱子程序結(jié)構(gòu)段內(nèi)調(diào)用格式codeSEGMENT…begin:CALL
sub1
CALLsub2
CALLsub3MOVAH,4CHINT21Hsub1PROC…RETsub1ENDPsub2PROC…RETsub2ENDPsub3PROC…RETsub3ENDPcodeENDSENDbegin子程序結(jié)構(gòu)段間調(diào)用格式codeSEGMENT…begin:CALL
FARPTRsub1…MOVAH,4CHINT21HcodeENDScode1SEGMENT…sub1PROCFAR…RETsub1ENDPcode1ENDSENDbegin過程設(shè)計注意以下三點(diǎn):⑴保護(hù)調(diào)用程序的斷點(diǎn):由CALL指令本身完成。⑵保護(hù)某些寄存器內(nèi)容:在子程序開頭,用一組PUSH指令,保護(hù)寄存器原來的內(nèi)容;在子程序結(jié)尾,用一組POP指令,將寄存器原來的內(nèi)容恢復(fù)。⑶主程序和過程(子程序)間的參數(shù)傳遞。入口參數(shù):過程所需的初始數(shù)據(jù)。(調(diào)用時)
出口參數(shù):過程運(yùn)行所得結(jié)果。(返回時)參數(shù)傳遞常用的方法:①用寄存器傳遞參數(shù):參數(shù)較少,速度較快。②用存儲器傳遞參數(shù):參數(shù)較多;
調(diào)用前,將參數(shù)存入內(nèi)存,將參數(shù)首地址送入某一寄存器(BX、SI、DI、BP)。進(jìn)入過程后可采用寄存器間接尋址方式從內(nèi)存中取出。③用堆棧傳遞參數(shù):參數(shù)較多,多用在子程序嵌套與遞歸調(diào)用中。分析說明:通過存儲器來傳遞參數(shù)子程序名:SUB_MIN功能:找最小數(shù)所用REG:AL,用于暫存中間結(jié)果入口參數(shù):數(shù)據(jù)區(qū)地址指針BX、
數(shù)據(jù)個數(shù)放入CX出口參數(shù):最小值存入存儲單元MIN
例5:用子程序結(jié)構(gòu)實(shí)現(xiàn)例4的要求:編子程序找數(shù)據(jù)區(qū)BUFF中的最小數(shù),結(jié)果存放至MIN單元中!轉(zhuǎn)下頁
DATASEGMENTBUFFDB42H,56,34,-5,-9,-78……COUNTEQU$-BUFFMINDB00H
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX
MOVAX,STACK MOVSS,AX MOVSP,TOPSTACKSEGMENTSTACK‘STACK’SADW100DUP(?)TOPEQULENGTHSASTACKENDS
MOVAH,4CH
INT21H
LEABX,BUFFMOVCX,COUNTCALLSUB_MIN
CODEENDSENDSTARTSUB_MINPROCNEAR
PUSHAX;保護(hù)現(xiàn)場MOVAL,[BX]LP:CMPAL,[BX]
JLENEXTMOVAL,[BX]NEXT:INCBXLOOPLP
MOVMIN,AL
POPAX;恢復(fù)現(xiàn)場
RET;返回SUB_MINENDP接右邊通過存儲器來傳遞參數(shù)例6:數(shù)據(jù)段定義兩個字型數(shù)組,編程序?qū)崿F(xiàn)數(shù)組分別求和(不計溢出),要求用子程序?qū)崿F(xiàn)求和。解:通過存儲器來傳遞參數(shù)。子程序說明如下:子程序名:SUB_SUM功能:求一組數(shù)之和所用REG:AX入口參數(shù):數(shù)組地址指針SI、
數(shù)組長度存于CX出口參數(shù):結(jié)果直接存入各數(shù)組之后的字單元DATA SEGMENTARY1 DW100DUP(?) ;定義數(shù)組1SUM1DW?ARY2 DW100DUP(?) ;定義數(shù)組2SUM2 DW?DATAENDSSTACKSEGMENTSTACK‘STACK’SADW100DUP(?)TOPEQULENGTHSASTACKENDSCODE SEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOPLEASI,ARY1;數(shù)組1首地址,入口參數(shù)MOVCX,LENGTHARY1;數(shù)組1長度,入口參數(shù)CALLSUB_SUM
;調(diào)用求和子程序LEA SI,ARY2;數(shù)組2首地址,入口參數(shù)MOVCX,LENGTHARY2;數(shù)組2長度,入口參數(shù)CALLSUB_SUM
;調(diào)用求和子程序MOVAH,4CHINT21H(轉(zhuǎn)下頁)SUB_SUMPROC NEAR
;子程序
PUSHAX
XORAX,AX;AX清0L1:ADDAX,WORDPTR[SI];加數(shù)組元素
INCSIINCSILOOPL1MOVWORDPTR[SI],AX;數(shù)組和送入SUM
POPAX
RET
;子程序返回SUB_SUMENDP
CODE ENDSEND START4.5DOS系統(tǒng)功能調(diào)用一、DOS中斷和BIOS中斷
DOS操作系統(tǒng)或ROMBIOS程序提供的一組子程序,用“INTN”指令調(diào)用。DOS中斷:DOS操作系統(tǒng)提供,位于系統(tǒng)磁盤,主要用于I/O設(shè)備管理、目錄及文件管理。BIOS中斷:ROM提供,位于內(nèi)存,主要用于系統(tǒng)加電自檢、引導(dǎo)裝入初始化程序等。二、DOS中斷(占用類型號即N為:20H~3FH)DOS專用中斷:INT22H,INT23H,INT24H
不能直接調(diào)用DOS可調(diào)用中斷:
INT20H,INT21H,INT25H等一定條件下調(diào)用最常用的:INT21H
稱為:DOS系統(tǒng)功能調(diào)用
21H為子程序的總?cè)肟?,進(jìn)入后可調(diào)用各種功能。詳見“附錄F,P516”三、DOS系統(tǒng)功能調(diào)用的步驟及實(shí)例步驟:
1.設(shè)置入口參數(shù)
2.將功能號放入AH寄存器
3.使用指令I(lǐng)NT21H轉(zhuǎn)入子程序入口
4.獲得出口參數(shù),分析結(jié)果一般:2、3步必須有;1、4視情況而定DOS系統(tǒng)功能調(diào)用實(shí)例
以DOS鍵盤功能調(diào)用、DOS顯示功能調(diào)用為例
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è)定允許輸入字符的最大個數(shù)第2字節(jié):預(yù)留,系統(tǒng)最后自動填入實(shí)際
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 使用大棚安全協(xié)議書
- 煤礦醫(yī)療協(xié)議書范本
- 農(nóng)戶分家協(xié)議書格式
- 解除擔(dān)保協(xié)議書范文
- 售后噴漆外包協(xié)議書
- 門面轉(zhuǎn)讓合并協(xié)議書
- 土建大寶協(xié)議書范本
- 金地房屋認(rèn)購協(xié)議書
- 婚姻遺產(chǎn)分配協(xié)議書
- 收購債權(quán)協(xié)議書模板
- 消防更換設(shè)備方案范本
- 2024年環(huán)境影響評估試題及答案
- 【初中歷史】2024-2025學(xué)年部編版七年級下學(xué)期歷史中考復(fù)習(xí)提綱
- 《電力建設(shè)工程施工安全管理導(dǎo)則》(nbt10096-2018)
- 全過程工程咨詢投標(biāo)方案(技術(shù)方案)
- 湖南省2025屆高三九校聯(lián)盟第二次聯(lián)考?xì)v史試卷(含答案解析)
- 家具全屋定制的成本核算示例-成本實(shí)操
- 在線預(yù)訂平臺在旅行社人力資源管理中的應(yīng)用研究-深度研究
- 旅拍店合伙人協(xié)議書范本
- 七年級地理歐洲西部
- Seminar_帶SPL的安全集成
評論
0/150
提交評論