版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、匯編語言程序設(shè)計,_07_高級過程與字符串和數(shù)組 大連理工大學(xué)軟件學(xué)院_朱明 2009年5月31日_ V1.1,提問與回顧,第六章內(nèi)容中我們介紹了移位、乘法和除法指令,擴展加減法指令,以及高級過程的定義和調(diào)用的內(nèi)容 ROL指令在進(jìn)行向左移位的過程中,最低位用什么數(shù)據(jù)填充?最高位被移出至何處? IMUL有符號數(shù)乘法指令有哪三種基本格式? IDIV進(jìn)行有符號數(shù)除法運算時需要使用CBW、CWQ和CDQ指令進(jìn)行何種操作? ADC指令在進(jìn)行加法運算時,考慮哪三個因素相加? LOCAL定義的局部變量保存在何處?為了訪問這些變量或訪問其中傳遞的參數(shù),通常需要用到那些寄存器? INVOKE指令與CALL指令在
2、功能上有何不同?,匯編語言程序設(shè)計 - 朱明,2,提問與回顧,ESP與EBP,1 過程調(diào)用的堆棧參數(shù)傳遞:將參數(shù)壓入到堆棧中 2 過程調(diào)用與堆棧:將返回地址壓入到堆棧中 3 過程中讀取參數(shù)時使用EBP寄存器尋址,匯編語言程序設(shè)計 - 朱明,3,ESP值減4,返回后地址壓入到堆棧中 這是一般過程調(diào)用的第一個階段,返回后地址,傳遞的參數(shù),返回后地址,ESP值減4,將傳遞的參數(shù)壓入到堆棧中 這是堆棧傳遞參數(shù)的過程調(diào)用的第一個階段,傳遞的參數(shù),傳遞的參數(shù),Section 1,EBP,ESP值再減4 為使用EBP進(jìn)行尋址,先將其保護(hù)到堆棧中,返回后地址,傳遞的參數(shù),EBP,傳遞的參數(shù),ESP與EBP,4
3、 過程中獲取堆棧傳遞來的參數(shù),通過EBP 5 過程運行結(jié)束前,需要恢復(fù)原來的ESP的值,匯編語言程序設(shè)計 - 朱明,4,Section 1,EBP,使用EBP進(jìn)行間接尋址前還應(yīng)當(dāng)獲取正確的位置 正確的位置就是當(dāng)前ESP的位置,即令EBP=ESP,返回后地址,傳遞的參數(shù),在使用堆棧傳遞參數(shù)的過程中,只能使用EBP尋址 如要訪問傳遞來的參數(shù),則對應(yīng)的位置為EBP+8 但是程序運行過程中定義變量則會改變ESP的值,EBP,程序結(jié)束之前,應(yīng)當(dāng)恢復(fù)原有ESP的值 相當(dāng)于釋放局部變量占用的堆棧空間 此外需要特別注意的是還要清理堆棧,返回后地址,傳遞的參數(shù),局部變量等,EBP,返回后地址,PROTO偽指令,
4、INVOKE偽指令用來調(diào)用帶有參數(shù)傳遞的子過程 PROC偽指令可以用來調(diào)用帶有參數(shù)傳遞的子過程 PROTO偽指令用來為已經(jīng)存在的過程創(chuàng)建原型 有點像是高級語言函數(shù)?,匯編語言程序設(shè)計 - 朱明,5,MyProg PROTO,INVOKE MyProg,MyProg PROC MyProg ENDP,標(biāo)準(zhǔn)使用順序,INVOKE MyProg,MyProg PROC MyProg ENDP,先實現(xiàn)后使用,過程原型,過程調(diào)用,過程實現(xiàn),過程實現(xiàn),過程調(diào)用,Section 2,多模塊過程*,整數(shù)求和的過程化設(shè)序設(shè)計方法 按照功能將程序劃分為各個過程 主過程、取得用戶輸入、計算和、輸出計算結(jié)果 多模塊過
5、程程序 多模塊過程指使用MASM的高級過程偽指令I(lǐng)NVOKE、PROTO和帶有參數(shù)擴展的PROC創(chuàng)建的過程 多模塊程序相對于CALL的直接調(diào)用,其優(yōu)點在于檢查INVOKE位指令傳遞的參數(shù)和PROC偽指令聲明的參數(shù) 一個好的多模塊過程程序應(yīng)該具有一定的文件結(jié)構(gòu) XXX.inc包含文件 XXX_main.asm主過程文件 _YYY.asm,_ZZZ.asm模塊文件,匯編語言程序設(shè)計 - 朱明,6,Section 2,多模塊過程*,整數(shù)求和問題的多模塊過程結(jié)構(gòu) 位于C:irvineexamplesch08ModSum32_adva ncedModSum文件夾下,多個文件 sum.inc包含文件:子過
6、程的原型聲明 子過程模塊:_prompt.asm、_arraysum.asm、_display.asm對應(yīng)原型聲明內(nèi)容,匯編語言程序設(shè)計 - 朱明,7,INCLUDEirvine32.inc PromptForIntegerPROC, ptrPrompt: BYTE,;提示輸入字符串 ptrArray: PTR DWORD,;指向數(shù)組 ArraySize: DWORD;數(shù)組大小 ArraySumPROTO, DisplaySumPROTO ,Section 2,多模塊過程*,_display.asm文件的部分內(nèi)容 主過程模塊:Sum_main.asm,包含啟動過程main以及對于外部每個過程的
7、調(diào)用,該文件使用了INCLUDE偽指令從sum.inc文件中復(fù)制過程的原型聲明,匯編語言程序設(shè)計 - 朱明,8,INCLUDESum.inc .code ;- DisplaySumPROC, ptrPrompt: PTR BYTE,;輸出提示字符串 theSum: DWORD;運算結(jié)果 ;- pusheax pushedx movedx, WriteString .,Section 2,多模塊過程*,Sum_main模塊文件的部分內(nèi)容 使用INVOKE、PROTO和PROC的方法能夠從應(yīng)用上隱藏大量的細(xì)節(jié)問題 以上是高級過程章節(jié)的內(nèi)容,匯編語言程序設(shè)計 - 朱明,9,Section 2,INC
8、LUDESum.inc .code mainPROC callClrscr INVOKE PromptForIntegers, ADDR prompt1, ADDR prompt2, ADDR array, Count INVOKE ,Section 3,字符串處理,基本的字符串操作指令 MOVSB、MOVSW和MOVSD:移動字符串?dāng)?shù)據(jù)指令,將由ESI尋址的內(nèi)存地址處的數(shù)據(jù)復(fù)制到EDI尋址的內(nèi)存地址處 CMPSB、CMPSW和CMPSD:比較字符串,比較由ESI和EDI尋址的兩個內(nèi)存地址處的值 SCASB、SCASW和SCASD:掃描字符串,比較累加器與EDI尋址的內(nèi)存地址處的內(nèi)容 STOS
9、B、STOSW和STOSD:存儲字符串?dāng)?shù)據(jù),存儲累加值的內(nèi)容至EDI尋址的內(nèi)存地址處 LODSB、LODSW和LODSD:字符串裝入累加器,加載ESI尋址的內(nèi)存地址處的數(shù)據(jù)至累加器,匯編語言程序設(shè)計 - 朱明,10,Section 3,字符串處理,MOVSB、MOVSW和MOVSD B:BYTE、W:WORD、D:DWORD 三條指令會自動修改ESI和EDI的值 自動設(shè)置增加還是減小的數(shù)值的多少 連續(xù)的字符串移動指令使用方法 設(shè)置ESI和EDI的方向:增加或者減少 CLD:清除方向標(biāo)值位,也就是正向,ESI和EDI增加 STD:設(shè)置方向標(biāo)值位,也就是反向,ESI和EDI減小 設(shè)置ECX寄存器內(nèi)
10、容為要復(fù)制的字符串的數(shù)量 設(shè)置源字符串偏移ESI和目的字符串偏移EDI兩個寄存器 使用重復(fù)前綴指令rep設(shè)置重復(fù)執(zhí)行的指令(三條指令之一) rep的使用類似于loop,會按照ECX的值重復(fù)執(zhí)行指令,匯編語言程序設(shè)計 - 朱明,11,Section 3,字符串處理,MOVSB、MOVSW和MOVSD 從source復(fù)制20個整數(shù)到target中,在復(fù)制完數(shù)據(jù)之后,ESI和EDI指向每個數(shù)組的最后一個位置 rep僅重復(fù)執(zhí)行其后的指令,即程序中MOVSD指令 MOVSD設(shè)置每次ESI和EDI都加4,匯編語言程序設(shè)計 - 朱明,12,.data sourceDWORD 20 DUP(0FFFFFFFF
11、h) targetDWORD 20 DUP(?) .code cld;設(shè)置正向增加 movecx, LENGTHOF source;設(shè)置REP的計數(shù)器 movesi, OFFSET source;設(shè)置ESI指向源 movedi, OFFSET target;設(shè)置EDI指向目的 repmovsd;復(fù)制雙字DWORD,字符串處理,CMPSB、CMPSW和CMPSD 三條指令隱含操作為用左邊操作數(shù)減去右邊操作數(shù),進(jìn)而用戶可以用無符號數(shù)跳轉(zhuǎn)指令進(jìn)行跳轉(zhuǎn) 當(dāng)需要進(jìn)行多個雙字時,仍需要設(shè)置方向,并初始化ECX寄存器的值,使用REP重復(fù)指令,匯編語言程序設(shè)計 - 朱明,13,Section 3,.data
12、sourceDWORD 1234h targetDWORD 5678h .code movesi, OFFSET source;設(shè)置ESI指向源 movedi, OFFSET target;設(shè)置EDI指向目的 cmpsd;進(jìn)行比較 jaL1;sourcetarget jmpL2;sourcetarget,字符串處理,SCASB、SCASW和SCASD 分別將AL、AX或EAX中的值同EDI尋址的目標(biāo)內(nèi)存中的字節(jié)、字或者雙字比較 特別適用于在長字符串或數(shù)組中查找匹配 除REP循環(huán)之外,可以使用REPNE,該指令的循環(huán)終止條件為ECX=0或者找到了匹配的內(nèi)容,匯編語言程序設(shè)計 - 朱明,14,.c
13、ode movedi, OFFSET source;設(shè)置EDI指向字符串 moval, F;要查找的字母 movecx, LENGTHOF source;設(shè)置EDI指向目的 cld;方向正向增加 repnescasb;不相等則重復(fù) jnzquit;沒有找到 decedi;找到了,EDI回退,Section 3,字符串處理,STOSB、STOSW和STOSD 分別將AL、AX或EAX中的值存儲到EDI尋址的目標(biāo)內(nèi)存單元中 特別適用于用填充字符串或者數(shù)組 LODSB、LODSW和LODSD 從ESI尋址的內(nèi)存單元中將對應(yīng)尺寸的內(nèi)容復(fù)制到AL、AX或EAX寄存器中 IRVINE函數(shù)庫提供的一些字符串
14、操作過程,匯編語言程序設(shè)計 - 朱明,15,;字符串復(fù)制過程 str_copy PROTO, source: PTR BYTE, target: PTR BYTE,;刪除字符串中指定字符 str_trim PROTO, pString: PTR BYTE, char: BYTE,Section 3,二維數(shù)組,一維數(shù)組的存儲方式? 二維數(shù)組的存儲方式? 二維數(shù)組常用行優(yōu)先的存儲方式-一維排列,匯編語言程序設(shè)計 - 朱明,16,Section 4,tableBYTE 10h, 20h, 30h, 40h, 50h,10h,20h,30h,40h,小地址,大地址,tableBYTE 10h, 20h
15、, 30h, 40h, 50h BYTE 60h, 70h, 80h, 90h, 0A0h,10h,20h,30h,40h,小地址,大地址,50h,60h,70h,80h,90h,A0h,二維數(shù)組,訪問二維數(shù)組的兩個參數(shù):行號和列號 IA-32中更適合數(shù)組訪問所需的兩種尋址方式 基址變址操作數(shù)尋址 相對基址變址操作數(shù)尋址 基址變址操作數(shù),匯編語言程序設(shè)計 - 朱明,17,base + index,ebx + esi edi + ecx ebp + esi .,tableWORD 1000h, 2000h, 3000h movebx, OFFSET table movesi, 2 movax,
16、ebx + esi movedi, OFFSET table movecx, 4 movax, edi + ecx,Section 4,二維數(shù)組,通過基址變址操作數(shù)尋址 二維數(shù)組的通常定義方法($與定義符號,當(dāng)前地址) Rowsize為數(shù)組中每行的元素占用的字節(jié)數(shù) 行列都是從數(shù)字0開始編號的,匯編語言程序設(shè)計 - 朱明,18,tableBYTE 10h, 20h, 30h, 40h, 50h Rowsize = ($ - table) BYTE 60h, 70h, 80h, 90h, 0A0h BYTE 0B0h, 0C0h, 0D0h,0E0h,0F0h,Section 4,row_inde
17、x = 1;行1 colume_index = 2;列2 movebx, OFFSET table addebx, Rowsize * row_index movesi, column_index moval, ebx + esi,二維數(shù)組,通過基址變址操作數(shù)尋址 比例因子在二維數(shù)組訪問中的作用(變址偏移倍數(shù)) Rowsize為數(shù)組中每行的元素占用的字節(jié)數(shù) 比例因子必須和元素尺寸一致,匯編語言程序設(shè)計 - 朱明,19,tableWORD 10h, 20h, 30h, 40h, 50h Rowsize = ($ - table) WORD 60h, 70h, 80h, 90h, 0A0h WOR
18、D 0B0h, 0C0h, 0D0h,0E0h,0F0h,Section 4,row_index = 1;行1 colume_index = 2;列2 movebx, OFFSET table addebx, Rowsize * row_index movesi, column_index movax, ebx + esi*TYPE table,二維數(shù)組,通過相對基址變址操作數(shù)尋址 其中的displacement(偏移)可以使變量的名字或者常量表達(dá)式,匯編語言程序設(shè)計 - 朱明,20,base + index + displacement displacementbase + index,ta
19、bleDWORD 10h, 20h, 30h, 40h, 50h Rowsize = ($ - table) DWORD 60h, 70h, 80h, 90h, 0A0h DWORD 0B0h, 0C0h, 0D0h,0E0h,0F0h,Section 4,movebx, Rowsize movesi, 2 moveax, tableebx + esi * TYPE table,二維數(shù)組,課堂練習(xí) 假設(shè)一個二維雙字?jǐn)?shù)組有三個邏輯行和四個邏輯列,如果使用ESI作為行指針,那么應(yīng)該給ESI加上什么值才能從當(dāng)前行移動到下一行? 通常采用什么方法能夠獲得數(shù)組每行元素占用的空間? 假設(shè)一個二維雙字?jǐn)?shù)組有
20、三個邏輯行和四個邏輯列,分別使用ESI和EDI寄存器來尋址第二行第三列的值的表達(dá)式 默認(rèn)存儲的任何數(shù)組的的行和列都是從0開始的 在尋址的過程中應(yīng)當(dāng)考慮每行元素占用的空間 在尋址的過程中應(yīng)當(dāng)考慮當(dāng)前行前面的元素占用的空間,匯編語言程序設(shè)計 - 朱明,21,Section 4,數(shù)組的排序與查找,冒泡排序算法 內(nèi)層循環(huán)比較元素的大小 外層循環(huán)比較元素的數(shù)目,匯編語言程序設(shè)計 - 朱明,22,冒泡排序第一次處理 時間復(fù)雜度為O(n2),Section 4,數(shù)組的排序與查找,冒泡排序算法的偽代碼 CX1代表外層循環(huán)計數(shù),CX2代表內(nèi)存循環(huán)計數(shù),匯編語言程序設(shè)計 - 朱明,23,cx1 = N 1 whi
21、le (cx 1) esi = addr(array); cx2 = cx1; while (cx2 0) if (arrayesi arrayesi+4) exchange(arrayesi, arrayesi+4) add esi, 4 dec cx2 dec cx1 ,Section 4,數(shù)組的排序與查找,冒泡排序算法的匯編代碼,匯編語言程序設(shè)計 - 朱明,24,movecx, count dececx;N=N-1 L1: pushecx;保存外層循環(huán)計數(shù)器ECX movesi, pArray;指向第一個元素 L2: moveax, esi;獲取該處元素的值 cmpesi+4, eax;
22、與下一個元素作比較 jgL3;如果下一個元素大則忽略 xchgeax, esi+4;當(dāng)前元素大,交換位置 movesi, eax L3: addesi, 4;下一個位置 loopL2;內(nèi)部循環(huán) popecx;恢復(fù)外層循環(huán)計數(shù)器ECX loopL1;外層循環(huán) ret,Section 4,數(shù)組的排序與查找,二分法的數(shù)組查找 二分法的數(shù)組必須是已經(jīng)按照升序或者降序排列好 查找范圍名為從first和last的下標(biāo)表示,若firstlast則退出 計算first和last標(biāo)示的數(shù)組的中點 把要搜索的值SearchValue與中點處的值比較 如果值相等則返回,表明在數(shù)組中發(fā)現(xiàn)了匹配項 如果SearchVa
23、lue大于中點處的值,則把first重新設(shè)置為中點之后的下一個位置 如果SearchValue小于中點處的值,則把last重新設(shè)置為中點之后的下一個位置 開始一次新的比較 二分法的時間復(fù)雜度O(log n),匯編語言程序設(shè)計 - 朱明,25,Section 4,數(shù)組的排序與查找,通過C/C+實現(xiàn)二分法,匯編語言程序設(shè)計 - 朱明,26,int BinSearch( int value, const int SearchVal, int count ) int first = 0; int last = count 1; while( first SearchVal) last = mid -1
24、; else return mid; return -1; ,Section 4,Section 4,課程作業(yè),基于冒泡排序與二分法查找的課程作業(yè) 本次作業(yè)占總成績的45%(45分) 作業(yè)基本要求 需要完成課程報告 報告包含:程序設(shè)計要求;程序運行環(huán)境;程序需要使用的外部過程;程序運行流程圖;程序代碼;程序運行測試時的屏幕截圖,共計以上6項 完成課程的代碼 將代碼附帶在課程報告中 作業(yè)的提交方式 打印版的課程報告,A4紙單面打印,報告中明確標(biāo)明姓名、學(xué)號和班級以及電子郵件 同時需要提交電子版,發(fā)送到,匯編語言程序設(shè)計 - 朱明,27,課程作業(yè),基于冒泡排序與二分法的課程作業(yè) 程序設(shè)計要求 按照之前介紹的課程說明與環(huán)境設(shè)置方法,通過IA-32匯編語言和MASM課程環(huán)境完成程序設(shè)計和調(diào)試 按照順序依次執(zhí)行以下的步驟 設(shè)計一個數(shù)組,至少有10個元素,使用隨機整數(shù)填充數(shù)組 顯示出排序前的數(shù)組的內(nèi)容 使用冒泡排序算法對數(shù)組進(jìn)行排序 顯示出排序后的數(shù)組的內(nèi)容 要求用戶輸入一個整數(shù) 使用二分法從數(shù)組中查找用戶輸入的整數(shù) 顯示二分法查找的結(jié)果(未找到或者在排序后
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年河南輕工職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試模擬試題有答案解析
- 2026年河北勞動關(guān)系職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測試參考題庫帶答案解析
- 神經(jīng)外科微創(chuàng)手術(shù)技術(shù)
- 財險合規(guī)培訓(xùn)課件
- 胡蜂螫傷規(guī)范化診治專家共識總結(jié)2026
- 生物材料在組織工程中的應(yīng)用前景
- 護(hù)理護(hù)理護(hù)理信息化建設(shè)與護(hù)理管理
- 醫(yī)療護(hù)理專業(yè)禮儀與形象
- 2026年常州工程職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)筆試參考題庫帶答案解析
- 心臟重癥護(hù)理流程優(yōu)化
- 工地上電工安全培訓(xùn)課件
- 現(xiàn)場應(yīng)急處置方案
- 2025年1月新疆普通高中學(xué)業(yè)水平考試物理試卷
- 2026年上半年新疆中小學(xué)教師資格考試(筆試)備考題庫(真題匯編)
- 2025-2026學(xué)年度第一學(xué)期期末測試三年級語文試卷
- 爐渣資源化處理技術(shù)方案
- 騎馬戶外免責(zé)協(xié)議書
- 2025年吐魯番地區(qū)托克遜縣輔警招聘考試題庫附答案解析
- 賣香腸訂貨合同范本
- 統(tǒng)編版(2025)八年級上冊歷史期末復(fù)習(xí)各課重點考點提綱
- 物業(yè)公司安全生產(chǎn)管理體系
評論
0/150
提交評論