程序設(shè)計的其他方法和技術(shù).ppt_第1頁
程序設(shè)計的其他方法和技術(shù).ppt_第2頁
程序設(shè)計的其他方法和技術(shù).ppt_第3頁
程序設(shè)計的其他方法和技術(shù).ppt_第4頁
程序設(shè)計的其他方法和技術(shù).ppt_第5頁
已閱讀5頁,還剩79頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1 字符串操作2 宏功能程序設(shè)計3 模塊化程序設(shè)計 5 1 2串操作指令 1 MOVS MoveString 串傳送語法格式 MOVSBMOVSWMOVSOPD OPS功能描述 MOVS B W 將DS SI所指源串的1個元素 字節(jié) 字 復(fù)制到ES DI所指的內(nèi)存單元 然后 SI和DI增加或減少1 2 若DF 0 則增加 否則減少 對標志位的影響 無 2 CMPS CompareStrings 串比較語法格式 CMPSOPD OPSCMPSBCMPSW功能描述 CMPS B W 將DS SI所指源串的1個元素 字節(jié) 字 與ES DI所指目的串的1個元素 字節(jié) 字 進行比較 根據(jù)比較結(jié)果設(shè)置標志位 然后 SI和DI增加或減少1 2 若DF 0 則增加 否則減少 對標志位的影響 同CMP 5 1 2串操作指令 3 SCAS ScanString 串掃描語法格式 SCASOPDSCASBSCASW功能描述 SCAS B W 將AL AX與ES DI所指目的串的1個字節(jié) 字進行比較 根據(jù)比較結(jié)果設(shè)置標志位 然后 DI增加或減少1 2 若DF 0 則增加 否則減少 5 1 2串操作指令 4 LODS LoadString 串裝入語法格式 LODSOPSLODSBLODSW功能描述 LODS B W 將DS SI所指源串的1個元素 字節(jié) 字 復(fù)制到AL AX 然后 SI增加或減少1 2 4 若DF 0 則增加 否則減少 對標志位的影響 無 5 1 2串操作指令 5 STOS StoreString 串存儲語法格式 STOSOPDSTOSBSTOSW功能描述 STOS B W 將AL AX的值復(fù)制到ES DI所指的內(nèi)存單元 然后 DI增加或減少1 2 若DF 0 則增加 否則減少 對標志位的影響 無 5 1 2串操作指令 6 重復(fù)前綴REP 當CX0時 重復(fù)執(zhí)行后面的串指令 每執(zhí)行1次 CX CX 1 只能用在MOVS LODS或STOS B W 之前REPZ REPE 當CX0且ZF 1時 重復(fù)執(zhí)行后面的串指令 每執(zhí)行1次 CX CX 1 只能用在CMPS B W D 或SCAS B W 之前REPNZ REPNE 當CX0且ZF 0時 重復(fù)執(zhí)行后面的串指令 每執(zhí)行1次 CX CX 1 只能用在CMPS B W D 或SCAS B W 之前說明 若CX初值為0 則不執(zhí)行任何操作 而且標志位不變 5 1 2串操作指令 1 串指令的共性源串 地址由DS SI表示 目的串 地址由ES DI表示 自動修改地址 每次數(shù)據(jù)操作后 SI和DI自動遞增或遞減 取決于操作的數(shù)據(jù)類型 字節(jié) 字 以及DF的值 若DF 0 則SI和DI自動增加1 2 否則 減1 2 可以使用CLD或STD指令設(shè)置DF 計數(shù)器 使用重復(fù)前綴時 由CX表示數(shù)據(jù)個數(shù) 每重復(fù)1次操作 CX減1 5 1 1串操作指令簡介 總結(jié) 2 串指令的用途串指令主要用于處理連續(xù)的內(nèi)存單元 與重復(fù)前綴配合使用更有效 例如 MOVS用于將一個內(nèi)存塊的數(shù)據(jù)復(fù)制到另一塊 CMPS用于比較兩個內(nèi)存區(qū)的數(shù)據(jù) SCAS可以在一個內(nèi)存區(qū)中掃描與給定值首次匹配或不匹配的元素 STOS能將一個內(nèi)存區(qū)的所有單元初始化為給定值 LODS一般不用重復(fù)前綴 5 1 1串操作指令簡介 總結(jié) 5 1字符串操作 實例 例1將以STR1為首址的字節(jié)存儲區(qū)中存放的字符串傳送到以STR2為首址的字節(jié)存儲區(qū) DATASEGMENTSTR1DBABCDEFGHIGKLL COUNT STR1STR2DBCOUNTDUP 0 DATAENDSSTACKSEGMENTSTACKDB100DUP 0 STACKENDSCODESEGMENTASSUMECS CODE DS DATA ES DATA SS STACK BEGIN MOVAX DATAMOVDS AXMOVES AXLEASI STR1LEADI STR2MOVCX COUNTCLDREPMOVSBMOVAH 4CHINT21HCODEENDSENDBEGIN 5 1字符串操作 實例 例2從鍵盤輸入一字符串至STR1為首址的字節(jié)緩沖區(qū) 試比較該串與字節(jié)字符串STR2是否相等 若相等 那么0 BX 否則 0FFFFH BX 5 1字符串操作 實例 例3在字符串STR中搜索子串 AM 出現(xiàn)的次數(shù)送入BX P REPNESCASBJEAJMPOUT1A CMPBYTEPTR DI M JNEBINCBXB CMPCX 0JNEPOUTA 5 1字符串操作 實例 例5在TAB命令存儲區(qū)中存放著若干條命令 其中每條命令的前一個字節(jié)存放著命令串的長度加1 后面一個字存放著該命令處理子程序的入口地址 設(shè)計一命令解釋程序 其功能為 檢查用戶輸入的命令 如果在TAB存儲區(qū)能查到該命令 則轉(zhuǎn)入相應(yīng)的命令處理子程序執(zhí)行 如果查不到 則給出錯誤提示后再輸入 如果用戶未輸入命令 則退出本程序的執(zhí)行 TAB DB4 DIR DWDIRDB7 RENAME DWRENAMEDB4 DEL DWDELDB5 COPY DWCOPY 5 2宏功能程序設(shè)計 8086宏匯編語言提供的宏功能主要包括 宏指令的定義與調(diào)用 重復(fù)匯編和條件匯編等 宏指令允許用戶為重復(fù)的語句序列定義一個名字 然后在程序中用這個名字代替這個語句序列 并允許傳遞多個參數(shù) 參數(shù)傳遞方式比子程序簡單 宏指令的使用步驟 1 宏定義 MACRO ENDM 2 宏調(diào)用 3 宏擴展 5 2 1宏定義 格式 宏指令名MACRO 形參表 宏體ENDMMACRO 宏定義的開始 宏指令名 宏定義為宏指令序列規(guī)定的名稱 形參 個數(shù)不限 但字符個數(shù)不得超過132個 形參間用逗號隔開 宏體 宏指令代替的程序段 由一系列機器指令語句和偽指令語句組成 ENDM 表示宏定義的結(jié)束 與MACRO成對出現(xiàn) 5 2 1宏定義 注意事項 宏指令一定要先定義后調(diào)用 因此 宏定義一定要放在它的第一次調(diào)用之前 宏指令名可以與偽指令 機器指令的助記符同名且具有比機器指令 偽指令更高的優(yōu)先級 當它們同名時 宏匯編程序?qū)⑺鼈円宦商幚沓上鄳?yīng)的宏擴展 5 2 1宏定義 例 某程序中要經(jīng)常輸出緩沖區(qū)中的字符串 通過反復(fù)進行9號DOS功能調(diào)用完成 LEADX BUF1MOVAH 9INT21H LEADX BUF2MOVAH 9INT21H WRITEMACROALEADX AMOVAH 9INT21H 可定義為宏 5 2 2宏調(diào)用 格式 宏指令號 實參表 注意 實參要與宏定義中的形參按位置關(guān)系一一對應(yīng) 如果實參的個數(shù)多于形參個數(shù) 多余的實參被忽略 如果實參少于形參 則缺少的實參被處理為空白 例如 對前面的宏定義可按下面的形式調(diào)用 WRITEBUF1 WRITEBUF2 5 2 3宏定義與宏調(diào)用中的參數(shù) 一 帶間隔符的實參在宏調(diào)用中 有時實參是一串帶間隔符 如空格 逗號等 的字符串 為了防止混淆 應(yīng)該用尖括號將它們括起來 尖括號中的內(nèi)容為一個實參 例如對堆棧段的宏定義 STACKMMACROASTACKSEGMENTSTACKDBASTACKENDSENDM 5 2 3宏定義與宏調(diào)用中的參數(shù) 一 帶間隔符的實參在當前程序中 需要建立一個500字節(jié) 初值均為0的堆棧段 宏調(diào)用為 相應(yīng)的宏擴展為 STACKM 500DUP 0 STACKSEGMENT STACK DB500DUP 0 STACKENDS 5 2 3宏定義與宏調(diào)用中的參數(shù) 二 數(shù)字參數(shù)在某些情況下 需要以實參符號的值而不是符號本身來替換形參 這種參數(shù)的替換稱數(shù)字參數(shù)的替換 特殊宏操作符 將其后的表達式轉(zhuǎn)換成它所代表的數(shù)值 并將此數(shù)值的ASCII碼字符嵌入到宏擴展中 例如 DATA1MACROA B C DDWA B CDBDDUP 0 ENDM 5 2 3宏定義與宏調(diào)用中的參數(shù) 二 數(shù)字參數(shù)如果宏調(diào)用為 DW12 5 30DB15DUP 0 DWX 2 5 X YDBY 5DUP 0 X 10Y 20DATA1 X 2 5 X Y Y 5DATA1X 2 5 X Y Y 5 則相應(yīng)的宏擴展為 5 2 3宏定義與宏調(diào)用中的參數(shù) 三 宏參數(shù)的連接在宏定義中 有些形參夾在字符串中 為了將這種形參標識出來 需在這樣的形參前面加符號 如果形參后面還跟有字符串 則還應(yīng)在形參后面加符號 例如 SHIFTMACROA B CMOVCL AS BC CLENDM 5 2 3宏定義與宏調(diào)用中的參數(shù) 三 宏參數(shù)的連接如果宏調(diào)用為 MOVCL 4SALAX CLMOVCL 2SARBH CL SHIFT4 AL AXSHIFT2 AR BH 則相應(yīng)的宏擴展為 5 2 3宏定義與宏調(diào)用中的參數(shù) 四 宏體中的變量與標號在宏定義中 常常需要定義一些變量與標號 當這些宏定義在同一程序中多次調(diào)用并擴展后 會出現(xiàn)變量或標號重復(fù)定義的錯誤 例如 SUMMACROA BMOVCX AMOVBX BMOVAX 0NEXT ADDAX BXADDBX 2LOOPNEXTENDM 5 2 3宏定義與宏調(diào)用中的參數(shù) 四 宏體中的變量與標號如果宏調(diào)用為 MOVCX 50MOVBX 1MOVAX 0NEXT ADDAX BXADDBX 2LOOPNEXT SUM50 1SUM20 10 則相應(yīng)的宏擴展為 MOVCX 20MOVBX 10MOVAX 0NEXT ADDAX BXADDBX 2LOOPNEXT 5 2 3宏定義與宏調(diào)用中的參數(shù) 四 宏體中的變量與標號為避免宏擴展后出現(xiàn)變量或標號重復(fù)錯誤 8086宏匯編語言了偽指令LOCAL來解決這一問題 語句格式 LOCAL形式參數(shù) 形式參數(shù) 功能 在宏擴展時 匯編程序自動為其后的形參生成特殊符號 0000 FFFF 并用這些特殊符號來取代宏體中的形參 注意 LOCAL語句只能作為宏體的第一條語句 5 2 3宏定義與宏調(diào)用中的參數(shù) 四 宏體中的變量與標號對于前面求若干個奇數(shù) 偶數(shù) 各的宏定義 可以改寫為如下形式 SUMMACROA BLOCALNEXTMOVCX AMOVBX BMOVAX 0NEXT ADDAX BXADDBX 2LOOPNEXTENDM MOVCX 50MOVBX 1MOVAX 0 0000 ADDAX BXADDBX 2LOOPNEXT MOVCX 20MOVBX 10MOVAX 0 0001 ADDAX BXADDBX 2LOOPNEXT 5 2 6宏庫的使用 一 宏庫的定義對于經(jīng)常使用的宏定義 可將它們集中在一起 供隨時調(diào)用 例如建立宏庫MACRO LIB READMACROALEADX AMOVAH 10INT21HENDMWRITEMACROALEADX AMOVAH 9INT21HENDM 5 2 6宏庫的使用 二 宏庫的使用當程序中需要調(diào)用時 首先將宏庫加入自己的源文件 然后按宏庫中各宏定義的規(guī)定調(diào)用 語句格式 INCLUDE文本文件名功能 將指定的文本文件從本行起加入?yún)R編 直到該文本的最后一行匯編完后 再繼續(xù)匯編INCLUDE后面的語句 5 2 6宏庫的使用 二 宏庫的使用示例 從鍵盤輸入一串字符到BUF緩沖區(qū) 將其中的小寫字母轉(zhuǎn)換成大寫字母 其余字符不變 后仍在顯示器上輸出 實現(xiàn)方案 利用MACRO LIB中的宏定義READ OUT1 CRLF實現(xiàn)字符串的輸入 顯示一個字符 輸出回車換行 READMACROALEADX AMOVAH 10INT21HENDMCRLFMACROMOVAH 2MOVDL 0AHINT21HMOVDL 0DHINT21HENDMOUTCHMACROAMOVDL AMOVAH 2INT21HENDM STACKMMACROASTACKSEGMENTSTACKDBASTACKENDSENDM 文件MACRO LIB中的宏定義 INCLUDEMACRO LIBDATASEGMENTBUFDB79DB0DB80DUP 0 DATAENDSSTACKMCODESEGMENTASSUMEDS DATA SS STACK CS CODESTART MOVAX DATAMOVDS AXREADBUFLEASI BUF 2MOVCL BUF 1MOVCH 0 CLDCRLFY1 LODSBCMPAL a JBY2CMPAL z JAY2SUBAL 20HY2 OUTCHALLOOPY1CRLFMOVAH 4CHINT21HCODEENDSENDSTART 利用宏定義實現(xiàn)題目要求的功能 5 2 7宏指令與子程序的比較 處理時間不同 宏指令在匯編期間由宏匯編程序處理 子程序調(diào)用是在目標程序執(zhí)行期間由CPU直接執(zhí)行 處理方式不同 宏指令必須先定義 后調(diào)用 宏調(diào)用是用宏體置換宏指令名 實參置換形參 匯編結(jié)束 宏定義也隨之消失 子程序調(diào)用不發(fā)生代碼和參數(shù)的置換 目標程序的長度不同 宏指令導(dǎo)致目標程序長 占用空間大 而子程序無論調(diào)用多少次 子程序的目標代碼僅出現(xiàn)一次 因此目標程序短 占用存儲空間小 5 2 7宏指令與子程序的比較 執(zhí)行速度不同 調(diào)用子程序需要使用堆棧保護和恢復(fù)現(xiàn)場 需要專門的指令傳遞參數(shù) 因此執(zhí)行速度慢 宏指令不存在這些問題 因此執(zhí)行速度快 參數(shù)傳遞方式不同 宏調(diào)用可實現(xiàn)參數(shù)的置換 參數(shù)的形式不受限制 簡單 方便 靈活 不容易出錯 而子程序的參數(shù)一般為地址或操作數(shù) 傳遞方式由用戶編程時具體安排 參數(shù)較多時容易出錯 5 3模塊化程序設(shè)計 對大型的復(fù)雜問題 如果將整個程序放在一個模塊中實現(xiàn)會存在以下問題 無法進行多人合作共同完成任務(wù) 影響編程的效率和質(zhì)量 難以保證程序的可靠性 程序調(diào)試困難 調(diào)試過程中需要多次匯編 源程序越長 匯編的速度越慢 浪費時間 5 3模塊化程序設(shè)計 正確地解決大型 復(fù)雜問題的方法 采用自頂向下 逐步求精的模塊化和結(jié)構(gòu)化的設(shè)計方法 將一個任務(wù)按其需要實現(xiàn)的主要功能分解為若干相對獨立的模塊 并確定好各模塊之間的調(diào)用關(guān)系和參數(shù)傳遞方式 對其中的公共部分還可以抽出來作為獨立的公用子程序模塊供大家調(diào)用 然后將這些模塊分配給各個開發(fā)人員 分別編寫 調(diào)試 最后再將它們的目標模塊連接裝配成一個完整的系統(tǒng) 5 3模塊化程序設(shè)計 模塊劃分與設(shè)計的參考規(guī)則 如果一個程序段被多個模塊公用 則它應(yīng)是一個獨立的模塊 如果若干個程序段處理的數(shù)據(jù)是公用的 則這些程序應(yīng)放在一個模塊中 若兩個程序段的租用率差別很大 則應(yīng)分屬于兩個模塊 模塊的規(guī)模要適當 既不能過大 也不能過小 5 3模塊化程序設(shè)計 模塊劃分與設(shè)計的參考規(guī)則 應(yīng)力求使模塊具有通用性 各模塊應(yīng)在功能 邏輯上相互獨立 避免用轉(zhuǎn)移語句在模塊間轉(zhuǎn)移 各模塊間的接口應(yīng)該簡單 要盡量減少公共符號的個數(shù) 盡量不共用數(shù)據(jù)存儲單元 每個模塊的結(jié)構(gòu)應(yīng)盡量設(shè)計成單入口 單出口的形式 5 3模塊化程序設(shè)計 匯編語言程序設(shè)計中使模塊化程序設(shè)計成為可能的關(guān)鍵 可重定位技術(shù)和連接程序 LINK 連接程序?qū)⒍鄠€目標模塊連接在一起時 必須要有以下兩方面的信息 各模塊間的通信方式 一個模塊訪問其它模塊中定義的標號 包括過程名 變量或常量 各段之間的組合方式 每個模塊都可能包含多個段 將多個模塊連接在一起時 這些段以什么方式進行組合 這些信息是在編程時 使用偽指令通過宏匯編程序產(chǎn)生的目標文件提供給連接程序 5 3 1組合方式 段定義偽指令的完整格式 段名SEGMENT 定位方式 組合方式 類別 段名ENDS功能 定義一個段 其定位方式 組合方式 類別 為賦給段的屬性用方括號括起來表示可以省略 若不省略 各項的順序不能錯 且用空格分隔 類別 的引號不能省 5 3 1組合方式一 定位方式 從匯編語言的角度來看 8086 8088物理地址的構(gòu)成 PA 所在段的段寄存器 左移四位 EA當EA 0時 物理地址的最低四位總是0 即段首地址能被16整除 實際上 連接程序允許段首地址從任何字節(jié)開始 或者從某一字開始 或從某一頁開始 并由用戶自由選擇 這就是定位方式的選擇 定位方式 是對該段的起始地址所提出的要求 即告訴連接程序 在將各段裝配到一起時 前一段放完后 后面的段從什么樣的起始邊界開始存放 5 3 1組合方式一 定位方式 定位方式有四種選擇 PARA 從能被16整除的地址開始 即段首PA最低4位為0 WORD 從偶數(shù)地址開始 即段首PA最低1位為0 BYTE 可以從任何物理地址開始存放 PAGE 從能被256整除的地址開始 即段首PA最低8位為0 其中PARA為系統(tǒng)隱含的定位方式 5 3 1組合方式一 定位方式 例 已知程序中的DATA1段和DATA2段的定義如下 如果這兩個段分別為當前數(shù)據(jù)段和附加數(shù)據(jù)段 試分析不同的定位方式下連接程序?qū)λ鼈冞吔绲奶幚矸椒?DATA1SEGMENTADB55HDUP 0FFH DATA1ENDSDATA2SEGMENTDB64HDUP 0 DATA2ENDS 5 3 1組合方式二 類別 段的 類別 是用單引號括起來的字符串 可以是任何合法的名稱 連接程序在進行處理時 將把 類別 相同的所有段 不一定同名 存放在連續(xù)的存儲區(qū)中 先出現(xiàn)的在前 后出現(xiàn)的在后 但仍然是不同的段 且每段都有自己的起始地址 5 3 1組合方式二 類別 例 ASEGMENT DATA BSEGMENT CODE CSEGMENT TO DSEGMENT DATA ESEGMENT TO ASEGMENT DATA DSEGMENT DATA BSEGMENT CODE CSEGMENT TO ESEGMENT TO 連接后 復(fù)習(xí) 同名段如何處理 問題 同名不同類別段如何處理 5 3 1組合方式二 類別 驗證1 同名段 DATA1SEGMENTDB DATA1 DATA1ENDSDATA1SEGMENTDB DATA2 DATA1ENDSCODESEGMENTASSUMECS CODE DS DATA1START MOVAX DATA1CODEENDSENDSTART 5 3 1組合方式二 類別 驗證2 不同名同類別段 DATA1SEGMENT D1 DB DATA1 DATA1ENDSDATA2SEGMENT D1 DB DATA2 DATA2ENDSCODESEGMENTASSUMECS CODE DS DATA1START MOVAX DATA1CODEENDSENDSTART 5 3 1組合方式二 類別 驗證3 同名段不同類別段 DATA1SEGMENT D1 DB DATA1 DATA1ENDSDATA1SEGMENT D2 DB DATA2 DATA1ENDSCODESEGMENTASSUMECS CODE DS DATA1START MOVAX DATA1CODEENDSENDSTART 5 3 1組合方式三 組合方式 8086只允許同時訪問4個段 為簡便起見 前面學(xué)習(xí)時采用的方式 將相同性質(zhì)的段 如全部代碼段 全部數(shù)據(jù)段 組合在一起成為一個代碼段 一個數(shù)據(jù)段 限制 組合起來的各段總長度必須小于64K 為了解決這一問題 連接程序還提供了其它組合方式 由段定義中的 組合方式 屬性指定 包括不選擇 PUBLIC COMMON AT表達式 STACK和MEMORY 5 3 1組合方式三 組合方式

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論