版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章
匯編語言程序設(shè)計4.1分支程序結(jié)構(gòu)4.2循環(huán)程序結(jié)構(gòu) 4.3子程序結(jié)構(gòu)4.4應(yīng)用程序編程4.5與語言的混合編程4.1分支程序結(jié)構(gòu)改變程序執(zhí)行順序、形成分支、循環(huán)、調(diào)用等程序結(jié)構(gòu)是很常見的程序設(shè)計問題高級語言采用等語句表達(dá)條件,并根據(jù)條件是否成立轉(zhuǎn)向不同的程序分支匯編語言需要首先利用比較、測試、加減運算、邏輯運算等影響狀態(tài)標(biāo)志的指令形成條件然后利用條件轉(zhuǎn)移指令判斷由標(biāo)志表達(dá)的條件,并根據(jù)標(biāo)志狀態(tài)控制程序轉(zhuǎn)移到不同的程序段4.1.1無條件轉(zhuǎn)移指令程序代碼在代碼段:指明代碼段在主存中的段基地址:給出將要執(zhí)行指令的偏移地址程序順序執(zhí)行,處理器自動增量程序控制轉(zhuǎn)移,隨之改變程序轉(zhuǎn)移到另外的代碼段,和都改變控制轉(zhuǎn)移類指令:改變(有些也改變),即改變程序執(zhí)行順序(實現(xiàn)程序控制轉(zhuǎn)移)的指令本章學(xué)習(xí)控制轉(zhuǎn)移類指令1.轉(zhuǎn)移范圍段內(nèi)轉(zhuǎn)移在當(dāng)前代碼段范圍內(nèi)的程序轉(zhuǎn)移不需更改,只要改變(偏移地址)近轉(zhuǎn)移():32位近轉(zhuǎn)移32,16位近轉(zhuǎn)移16短轉(zhuǎn)移():轉(zhuǎn)移范圍在127~-128字節(jié)段間轉(zhuǎn)移從當(dāng)前代碼段跳轉(zhuǎn)到另一個代碼段需要更改(段地址)和(偏移地址)遠(yuǎn)轉(zhuǎn)移():48位遠(yuǎn)轉(zhuǎn)移32,32位遠(yuǎn)轉(zhuǎn)移162.指令尋址方式相對尋址方式提供目標(biāo)地址相對于當(dāng)前指令指針的位移量目標(biāo)地址(轉(zhuǎn)移后的)=當(dāng)前+位移量相對尋址都是段內(nèi)轉(zhuǎn)移,最常用、最靈活直接尋址方式直接提供目標(biāo)地址目標(biāo)地址(轉(zhuǎn)移后的和)=指令操作數(shù)間接尋址方式指示寄存器或存儲單元目標(biāo)地址來自寄存器或存儲單元、間接獲得寄存器間接尋址:用寄存器保存目標(biāo)地址存儲器間接尋址:用存儲單元保存目標(biāo)地址目標(biāo)地址=目的地址=轉(zhuǎn)移地址3.指令無條件轉(zhuǎn)移:程序無條件改變執(zhí)行順序指令相當(dāng)于高級語言的語句
;程序轉(zhuǎn)向標(biāo)號指定的地址 ;段內(nèi)相對尋址,段間直接尋址 3216 ;程序轉(zhuǎn)向寄存器指定的地址 ;寄存器間接尋址 483216 ;程序轉(zhuǎn)向存儲單元指定的地址 ;存儲器間接尋址指令的4種類型1.段內(nèi)轉(zhuǎn)移、相對尋址標(biāo)號指明目標(biāo)地址,指令代碼包含位移量2.段內(nèi)轉(zhuǎn)移、間接尋址通用寄存器或主存單元包含目標(biāo)指令偏移地址3.段間轉(zhuǎn)移、直接尋址標(biāo)號包含目標(biāo)指令的段地址和偏移地址4.段間轉(zhuǎn)移、間接尋址32位段用3字存儲單元包含目標(biāo)地址16位段用雙字存儲單元包含目標(biāo)地址會根據(jù)存儲模式等信息自動識別〔例4-1〕無條件轉(zhuǎn)移程序-1 ;數(shù)據(jù)段00000000 00000000 ? ;代碼段00000000 01 1 ;相對尋址00000002 90
00000003 E9000000011: 2 ;相對近轉(zhuǎn)移00000008 90
00000009 B800000011R2: 3〔例4-1〕無條件轉(zhuǎn)移程序-20000000E E0 ;寄存器間接尋址00000010 90
00000011 B800000022R3: 400000016 A300000000R
0000001B 2500000000R ;存儲器間接尋址00000021 90
4:movebx,offsetnvarjmpnearptr[ebx];數(shù)據(jù)的寄存器間接尋址數(shù)據(jù)的存儲器直接尋址4.1.2條件轉(zhuǎn)移指令根據(jù)指定的條件確定程序是否發(fā)生轉(zhuǎn)移
;條件滿足,發(fā)生轉(zhuǎn)移;否則,順序執(zhí)行下條指令表示目標(biāo)地址,采用段內(nèi)相對尋址32位32處理器:達(dá)到32位的全偏移量16位80x86處理器:-128~+127間的短轉(zhuǎn)移條件轉(zhuǎn)移指令不影響標(biāo)志,但要利用標(biāo)志表示利用標(biāo)志判斷的條件,16種、兩類單個標(biāo)志狀態(tài)作為條件兩數(shù)大小關(guān)系作為條件轉(zhuǎn)移條件:單個標(biāo)志狀態(tài) 1 0 1 0 1 0 1 0 1 0 多個助記符方便記憶轉(zhuǎn)移條件:兩數(shù)大小關(guān)系 1 0 1或1 0且0 ≠
≠或1
且0
1.單個標(biāo)志狀態(tài)作為條件的條件轉(zhuǎn)移指令()和():利用零位標(biāo)志判斷結(jié)果是零(相等)還是非零(不等)和:利用符號標(biāo)志判斷結(jié)果是負(fù)還是正和:利用溢出標(biāo)志判斷結(jié)果是溢出還是沒有溢出()和():利用奇偶標(biāo)志判斷結(jié)果低字節(jié)“1”的個數(shù)是偶數(shù)還是奇數(shù)和:利用進(jìn)位標(biāo)志判斷結(jié)果是有進(jìn)位(為1)還是無進(jìn)位(為0)〔例4-2〕個數(shù)折半程序-1 ,885 ;假設(shè)一個數(shù)據(jù) ,1 ;數(shù)據(jù)右移進(jìn)行折半
;余數(shù)為0,即=0條件成立,轉(zhuǎn)移 ,1 ;否則余數(shù)為1,即=1,進(jìn)行加1操作: ;顯示結(jié)果443運行結(jié)果〔例4-2〕個數(shù)折半程序-2 ,886 ;假設(shè)一個數(shù)據(jù) ,1 ;數(shù)據(jù)右移進(jìn)行折半
;余數(shù)為1,即=1條件成立,轉(zhuǎn)移到分支體,進(jìn)行加1操作
;余數(shù)為0,即=0,不需要處理,轉(zhuǎn)移到顯示!: ,1 ;進(jìn)行加1操作: ;顯示結(jié)果jncgoeven何不合二為一?〔例4-2〕個數(shù)折半程序-3 ,887 ;假設(shè)一個數(shù)據(jù) ,1 ;數(shù)據(jù)右移進(jìn)行折半 ,0 ;余數(shù)==1,進(jìn)行加1操作 ;余數(shù)==0,沒有加1 ;顯示結(jié)果 ,888 ;假設(shè)一個數(shù)據(jù) ,1 ;個數(shù)加1 ,1 ;數(shù)據(jù)右移進(jìn)行折半 ;顯示結(jié)果改進(jìn)算法消除分支〔例4-3〕位測試程序-1 ;數(shù)據(jù)段 '!',0 '!',0 ;代碼段 ,56h ;假設(shè)一個數(shù)據(jù) ,02h ;測試D1位(D1=1,其他位為0) ;D1=0條件成立,轉(zhuǎn)移
;D1=1,顯示準(zhǔn)備好 ;跳轉(zhuǎn)過另一個分支體!: ;顯示沒有準(zhǔn)備好: 〔例4-3〕位測試程序-2 ;數(shù)據(jù)段 '!',0 '!',0 ;代碼段 ,56h ;假設(shè)一個數(shù)據(jù) ,02h ;測試D1位(D1=1,其他位為0) ;D1=1條件成立,轉(zhuǎn)移
;D1=0,顯示沒有準(zhǔn)備好 ;跳轉(zhuǎn)過另一個分支體!: ;顯示準(zhǔn)備好: 〔例4-4〕奇校驗程序 ;鍵盤輸入,=返回值 ;回車換行(用于分隔) ;以二進(jìn)制形式顯示數(shù)據(jù) ;回車換行(用于分隔) ,7 ;最高位置“0”、其他位不變 ;同時標(biāo)志反映“1”的個數(shù)
;個數(shù)為奇數(shù),不需處理,轉(zhuǎn)移 ,80h ;個數(shù)為偶數(shù),最高位置“1”、其他位不變: ;顯示含校驗位的數(shù)據(jù)2.兩數(shù)大小關(guān)系作為條件的條件轉(zhuǎn)移指令無符號數(shù)用高()、低()低于(不高于等于):()不低于(高于等于):()低于等于(不高于):()不低于等于(高于):()有符號數(shù)用大()、?。ǎ┬∮冢ú淮笥诘扔冢海ǎ┎恍∮冢ù笥诘扔冢海ǎ┬∮诘扔冢ú淮笥冢海ǎ┎恍∮诘扔冢ù笥冢海ǎ怖?-5〕數(shù)據(jù)比較程序-1 ;數(shù)據(jù)段1 'a:',02 ':',01 ':',02 ':',03 13,10,':',0 ;代碼段 1 ;提示輸入
;輸入第一個數(shù)據(jù) ;保存到 2 ;提示輸入
;輸入第二個數(shù)據(jù) ;保存到〔例4-5〕數(shù)據(jù)比較程序-2 ;二個數(shù)據(jù)進(jìn)行比較 ;兩數(shù)不相等,轉(zhuǎn)移 1 ;顯示兩數(shù)相等
;顯示相等的數(shù)據(jù) ;轉(zhuǎn)移到結(jié)束: ;較小,不需要交換,轉(zhuǎn)移
;保存較小數(shù),保存較大數(shù)〔例4-5〕數(shù)據(jù)比較程序-3: 2 ;顯示較小數(shù)
;較小數(shù)在中
3 ;顯示較大數(shù)
;較大數(shù)在中
:4.1.3單分支結(jié)構(gòu)只有一個分支的程序類似高級語言的語句結(jié)構(gòu)注意采用正確的條件轉(zhuǎn)移指令當(dāng)條件滿足(成立),發(fā)生轉(zhuǎn)移,跳過分支體條件不滿足,順序向下執(zhí)行分支體條件轉(zhuǎn)移指令與高級語言的語句正好相反語句是條件成立,執(zhí)行分支體〔例4-6〕求絕對值程序 ;代碼段
;輸入一個有符號數(shù),從返回值 ,0 ;比較與0
;條件滿足:≥0,轉(zhuǎn)移
;條件不滿足:<0,為負(fù)數(shù) ;需求補(bǔ)得正值: ;分支結(jié)束,顯示結(jié)果示意圖單分支結(jié)構(gòu)的流程圖返回
〔例4-7〕字母判斷程序
;輸入一個字符,從返回值 ,'A’ ;與大寫字母A比較
;比大寫字母A小,不是大寫字母,轉(zhuǎn)移 ,'Z’ ;與大寫字母Z比較
;比大寫字母Z大,不是大寫字母,轉(zhuǎn)移 ,20h ;轉(zhuǎn)換為小寫 ;回車換行 ;顯示小寫字母:4.1.4雙分支結(jié)構(gòu)雙分支程序結(jié)構(gòu)有兩個分支,條件為真執(zhí)行一個分支;條件為假,執(zhí)行另一個分支相當(dāng)于高級語言的語句順序執(zhí)行的分支體1最后一定要有一條指令跳過分支體2指令必不可少,實現(xiàn)結(jié)束前一個分支回到共同的出口作用雙分支結(jié)構(gòu)有時可以改變?yōu)閱畏种ЫY(jié)構(gòu)事先執(zhí)行其中一個分支(選擇出現(xiàn)概率較高的分支)〔例4-8〕顯示數(shù)據(jù)最高位程序-1 ;數(shù)據(jù)段 0630422h ;假設(shè)一個數(shù)據(jù) ;代碼段
,1 ;最高位移入標(biāo)志
;=1,即最高位為1,轉(zhuǎn)移 ,'0' ;=0,即最高位為0:←'0' ;一定要跳過另一個分支: ,'1' ;←'1': ;顯示示意圖雙分支結(jié)構(gòu)雙分支結(jié)構(gòu)的流程圖返回〔例4-8〕顯示數(shù)據(jù)最高位程序-2
,'0' ;假設(shè)最高位為0:←'0' ,1 ;最高位移入標(biāo)志
;=0,即最高位為0,轉(zhuǎn)移 ,'1' ;=1,即最高位為1,←'1': ;顯示單分支結(jié)構(gòu)〔例4-9〕有符號數(shù)運算溢出程序 ;數(shù)據(jù)段1 1234567890 ;假設(shè)兩個數(shù)據(jù)2 -9999999993 ? '!',0 ;正確信息 '!!',0 ;錯誤信息 ;代碼段 1 2 ;求差 ;有溢出,轉(zhuǎn)移 3 ;無溢出,保存差值 ;顯示正確
: ;顯示錯誤: 4.2循環(huán)程序結(jié)構(gòu)三個部分組成:循環(huán)初始——為開始循環(huán)準(zhǔn)備必要的條件,如循環(huán)次數(shù)、循環(huán)體需要的初始值等;循環(huán)體——重復(fù)執(zhí)行的程序代碼,其中包括對循環(huán)條件的修改等;循環(huán)控制——判斷循環(huán)條件是否成立,決定是否繼續(xù)循環(huán)“先判斷、后循環(huán)”的循環(huán)程序結(jié)構(gòu)對應(yīng)高級語言的語句“先循環(huán)、后判斷”的循環(huán)程序結(jié)構(gòu)對應(yīng)高級語言的語句示意圖循環(huán)程序結(jié)構(gòu)的流程圖返回4.2.1循環(huán)指令
←-1;若≠0,循環(huán)到;否則,順序執(zhí)行
=0,轉(zhuǎn)移;否則順序執(zhí)行目標(biāo)地址采用相對短轉(zhuǎn)移實地址存儲模型使用作為計數(shù)器DECECXJNZlabelCMPECX,0JZlabel〔例4-10〕數(shù)組求和程序
;=數(shù)組元素個數(shù) ;求和初值為0 ;數(shù)組指針為0: [*()] ;求和 ;指向下一個數(shù)組元素
;保存結(jié)果 ;顯示結(jié)果循環(huán)體循環(huán)控制循環(huán)初始4.2.2計數(shù)控制循環(huán)通過次數(shù)控制循環(huán)利用指令屬于計數(shù)控制常見是“先循環(huán)、后判斷”循環(huán)結(jié)構(gòu)計數(shù)可以減量進(jìn)行,即減到0結(jié)束計數(shù)可以增量進(jìn)行,即達(dá)到規(guī)定值結(jié)束循環(huán)程序結(jié)構(gòu)的關(guān)鍵是如何控制循環(huán)〔例4-11〕簡單加密解密程序-1 ;數(shù)據(jù)段 234 =255 1(0) ;定義鍵盤輸入需要的緩沖區(qū)1 ':',02 ':',03 13,10,':',0 ;代碼段 1 ;提示輸入字符串
;設(shè)置入口參數(shù) ;調(diào)用輸入字符串子程序 ;字符個數(shù)保存進(jìn)入堆?!怖?-11〕簡單加密解密程序-2
;=實際輸入的字符個數(shù),作為循環(huán)的次數(shù) ;指向輸入字符 ;=加密關(guān)鍵字: [] ;異或加密
;等同于指令: ;處理下一個字符 2
;顯示密文
〔例4-11〕簡單加密解密程序-3
;從堆棧彈出字符個數(shù),作為循環(huán)的次數(shù) ;指向輸入字符 ;=解密關(guān)鍵字: [] ;異或解密
;處理下一個字符 3
;顯示明文
示意圖簡單加密解密程序運行實例返回4.2.3條件控制循環(huán)根據(jù)條件決定是否進(jìn)行循環(huán)需要使用有條件轉(zhuǎn)移指令實現(xiàn)多見“先判斷、后循環(huán)”結(jié)構(gòu)先行判斷的條件控制循環(huán)程序很像雙分支結(jié)構(gòu)主要分支需要重復(fù)執(zhí)行多次(的目標(biāo)位置是循環(huán)開始)另一個分支用于跳出這個循環(huán)先行循環(huán)的條件控制循環(huán)程序類似單分支結(jié)構(gòu),循環(huán)體就是分支體順序執(zhí)行就跳出循環(huán)〔例4-12〕字符個數(shù)統(tǒng)計程序 ;數(shù)據(jù)段 ‘?’,0 ;以0結(jié)尾的字符串 ;代碼段
;用于記錄字符個數(shù),也用于指向字符的指針: [] ,0 ;用指令“”更好
;個數(shù)加1 ;繼續(xù)循環(huán): ;顯示個數(shù)
〔例4-13〕字符剔除程序-1
;顯示處理前字符串
: [],0 ;外循環(huán),先判斷后循環(huán) ;為0結(jié)束: [],'';是否是空格 ;不是空格繼續(xù)循環(huán) ;是空格,剔除空格分支: ;該分支是循環(huán)程序 ,[] ;前移一個位置 [1]〔例4-13〕字符剔除程序-2 [],0 ;內(nèi)循環(huán),先循環(huán)后判斷 ;內(nèi)循環(huán)結(jié)束處
;再次判斷是否為空格(處理連續(xù)空格): ;繼續(xù)對后續(xù)字符進(jìn)行判斷處理 ;外循環(huán)結(jié)束處: ;顯示處理后字符串
4.3子程序結(jié)構(gòu)經(jīng)常用到的應(yīng)用問題編寫成一個通用子程序大型處理過程分解成能夠解決的模塊使用子程序可以使程序的結(jié)構(gòu)更為清楚程序的維護(hù)更為方便有利于大程序開發(fā)時的多個程序員分工合作子程序()=函數(shù)()=過程()4.3.1子程序指令子程序:與主程序分開的、完成特定功能的一段程序當(dāng)主程序(調(diào)用程序)執(zhí)行調(diào)用指令調(diào)用子程序子程序(被調(diào)用程序)執(zhí)行返回指令返回主程序CALLlabel主程序RET子程序回到指令后的指令處1.子程序調(diào)用指令指令用在主程序中,實現(xiàn)子程序的調(diào)用分成段內(nèi)調(diào)用(近調(diào)用)和段間調(diào)用(遠(yuǎn)調(diào)用)目標(biāo)地址采用相對尋址、直接尋址或間接尋址入棧返回地址:將下條指令的地址壓入堆棧
;調(diào)用標(biāo)號指定的子程序 1632 ;調(diào)用寄存器指定地址的子程序 163248 ;調(diào)用存儲單元指定地址的子程序2.子程序返回指令指令用在子程序結(jié)束,實現(xiàn)返回主程序
;無參數(shù)返回:出棧返回地址 i16 ;有參數(shù)返回:出棧返回地址 ←+i16會根據(jù)存儲模型等信息確定子程序的遠(yuǎn)近調(diào)用,并相應(yīng)產(chǎn)生返回指令3.過程定義偽指令利用過程定義偽指令獲得子程序信息 過程名 …… ;過程體 過程名 ;過程名為符合語法的標(biāo)識符后面可加參數(shù):或簡化段定義源程序格式中,通常不需指定〔例4-14〕子程序調(diào)用程序-1 ;代碼段,主程序00000000 B800000001 ,100000005 00000005 ,50000000A E800000016 ;子程序調(diào)用0000000F B900000003 1: ,300000014 000000042: ,400000019 E800000000E
〔例4-14〕子程序調(diào)用程序-2 ;子程序 ;過程定義,過程名為
,[4] ;=下條指令(標(biāo)號1)偏移地址 2 ;=標(biāo)號2的偏移地址 ,2 ;彈出堆棧,保持堆棧平衡 ;子程序返回 ;過程結(jié)束MOV[EBP+4],EDI?示意圖子程序調(diào)用的堆棧返回4.3.2子程序設(shè)計子程序的編寫方法與主程序一樣但需要留意幾個問題:利用過程定義,獲得子程序名和調(diào)用屬性指令返回主程序,指令調(diào)用子程序壓入和彈出操作要成對使用,保持堆棧平衡開始保護(hù)寄存器,返回前相應(yīng)恢復(fù)安排在代碼段的主程序之外子程序允許嵌套和遞歸最好有完整的注釋難點是參數(shù)傳遞回車換行子程序 ;回車換行子程序 ;保護(hù)寄存器 ,0 ;輸出回車字符
;子程序中調(diào)用子程序,實現(xiàn)子程序嵌套 ,0 ;輸出換行字符
;子程序中調(diào)用子程序,實現(xiàn)子程序嵌套 ;恢復(fù)寄存器 ;子程序返回
4.3.3參數(shù)傳遞主程序與子程序間通過參數(shù)傳遞建立聯(lián)系入口參數(shù)(輸入?yún)?shù)):主程序→子程序出口參數(shù)(輸出參數(shù)):子程序→主程序傳遞參數(shù)的多少反映程序模塊間的耦合程度參數(shù)的具體內(nèi)容數(shù)據(jù)本身(傳遞數(shù)值)數(shù)據(jù)的存儲地址(傳遞地址,傳遞引用)參數(shù)傳遞方法寄存器變量堆棧1.寄存器傳遞參數(shù)最簡單和常用的參數(shù)傳遞方法把參數(shù)存于約定的寄存器少量數(shù)據(jù)直接傳遞數(shù)值大量數(shù)據(jù)只能傳遞地址帶有出口參數(shù)的寄存器不能保護(hù)和恢復(fù)帶有入口參數(shù)的寄存器可以保護(hù)、也可以不保護(hù),但最好能夠保持一致〔例4-15〕十六進(jìn)制顯示程序-1 ,1234 ;假設(shè)一個數(shù)據(jù)
,8 ;8位十六進(jìn)制數(shù): ,4 ;高4位循環(huán)移位進(jìn)入低4位 ; ;調(diào)用子程序 4[] ;保存轉(zhuǎn)換后的碼 ;
;顯示'',8(0),'H',0〔例4-15〕十六進(jìn)制顯示程序-2 ;子程序
;將低4位表達(dá)的一位十六進(jìn)制數(shù)轉(zhuǎn)換為碼 ,0 ;只取的低4位 ,30h ;高4位變成3 ,39h ;是0~9,還是A~F
,7 ;是A~F,碼再加上7: ;子程序返回
〔例4-15〕十六進(jìn)制顯示程序-3 ;子程序
,0 ;取低4位 [];換碼
;子程序的局部數(shù)據(jù)(只讀) '0123456789'
1234運行結(jié)果〔例4-16〕有符號十進(jìn)制數(shù)顯示程序-1轉(zhuǎn)換的算法如下:(1)首先判斷數(shù)據(jù)是零、正數(shù)或負(fù)數(shù),是零顯示“0”退出(2)是負(fù)數(shù),顯示負(fù)號“-”,求數(shù)據(jù)的絕對值(3)接著數(shù)據(jù)除以10,余數(shù)為十進(jìn)制數(shù)碼,加30H轉(zhuǎn)換為碼保存(4)重復(fù)(3)步,直到商為0結(jié)束(5)依次從高位開始顯示各位數(shù)字〔例4-16〕有符號十進(jìn)制數(shù)顯示程序-2 ;數(shù)據(jù)段 12345678901234,0,1,... 12(0) ;顯示緩沖區(qū) ;代碼段
,0: [*4] ;=入口參數(shù) ;調(diào)用子程序,顯示一個數(shù)據(jù) ;換行以便顯示下一個數(shù)據(jù)
寄存器傳遞參數(shù)〔例4-16〕有符號十進(jìn)制數(shù)顯示程序-3 ;顯示有符號十進(jìn)制數(shù)的子程序 ;=入口參數(shù) ;保護(hù)寄存器
;指向顯示緩沖區(qū) ;判斷數(shù)據(jù)是零、正數(shù)或負(fù)數(shù) 1 ;不是零,跳轉(zhuǎn) [],'0' ;是零,設(shè)置“0”
5 ;轉(zhuǎn)向顯示1: 2 ;是正數(shù),跳轉(zhuǎn) [],'-';是負(fù)數(shù),設(shè)置負(fù)號
;數(shù)據(jù)求補(bǔ)(絕對值)寄存器傳遞參數(shù)〔例4-16〕有符號十進(jìn)制數(shù)顯示程序-42: ,10 ;10壓入堆棧,作為退出標(biāo)志3: ,0 ;數(shù)據(jù)(商)為零,轉(zhuǎn)向保存 4 ;零位擴(kuò)展被除數(shù)為 ;數(shù)據(jù)除以10:÷10 ,30h ;余數(shù)(0~9)轉(zhuǎn)換為碼 ;數(shù)據(jù)先低位后高位壓入堆棧 3〔例4-16〕有符號十進(jìn)制數(shù)顯示程序-54: ;數(shù)據(jù)先高位后低位彈出堆棧 ;是結(jié)束標(biāo)志10,轉(zhuǎn)向顯示 5 [] ;數(shù)據(jù)保存到緩沖區(qū)
45: [],0 ;顯示內(nèi)容加上結(jié)尾標(biāo)志
;恢復(fù)寄存器
;子程序返回
2.共享變量傳遞參數(shù)子程序和主程序使用同一個變量名存取數(shù)據(jù)如果變量定義和使用不在同一個程序模塊中,需要利用、聲明共享變量傳遞參數(shù),子程序的通用性較差特別適合在多個程序段間、尤其在不同的程序模塊間傳遞數(shù)據(jù)〔例4-17〕二進(jìn)制數(shù)輸入程序-1輸入一個字符,判斷是否合法是字符“0”或“1”合法減去30H轉(zhuǎn)換成數(shù)值“0”或“1”重復(fù)轉(zhuǎn)換每個字符將前一次的數(shù)值左移1位并與新數(shù)值進(jìn)行組合輸入非法字符,或超過數(shù)據(jù)位數(shù)提示錯誤重新輸入〔例4-17〕二進(jìn)制數(shù)輸入程序-2 ;數(shù)據(jù)段 =5 (0) ? ;代碼段
: ;調(diào)用子程序,輸入一個數(shù)據(jù) ;獲得出口參數(shù) [] ;存放到數(shù)據(jù)緩沖區(qū) ,4
共享變量傳遞參數(shù)〔例4-17〕二進(jìn)制數(shù)輸入程序-3 ;輸入二進(jìn)制數(shù)的子程序
;出口參數(shù):變量=補(bǔ)碼表示的二進(jìn)制數(shù)值 ;說明:負(fù)數(shù)用“-”引導(dǎo)
1: 用于存放二進(jìn)制結(jié)果 ,32 ;限制輸入字符的個數(shù)2: ;輸入一個字符 ,'0' ;檢測鍵入字符是否合法 ;不合法則返回重新輸入 ,'1'
〔例4-17〕二進(jìn)制數(shù)輸入程序-4 ,'0' ;對輸入的字符進(jìn)行轉(zhuǎn)化 ,1 的值乘以2 和相加 2 ;循環(huán)鍵入字符
;把的二進(jìn)制結(jié)果存放返回 ;分行
;子程序返回〔例4-17〕二進(jìn)制數(shù)輸入程序-5: ;顯示錯誤信息
1 0,0,',:',0
共享變量傳遞參數(shù)〔例4-18〕有符號十進(jìn)制數(shù)輸入程序-1十進(jìn)制有符號整數(shù)轉(zhuǎn)換為補(bǔ)碼的算法如下:(1)判斷輸入了正數(shù)、還是負(fù)數(shù),用一個寄存器記錄(2)判斷下一個字符是否為有效數(shù)碼 字符無效,提示錯誤重新輸入,并轉(zhuǎn)向(1) 字符有效,繼續(xù)(3)字符有效,減30H轉(zhuǎn)換為二進(jìn)制數(shù);然后將前面輸入的數(shù)值乘10,并與剛輸入的數(shù)字相加得到新的數(shù)值(4)判斷輸入的數(shù)據(jù)是否超出有效范圍超出范圍,提示錯誤重新輸入,并轉(zhuǎn)向(1)沒有超出范圍,則繼續(xù)(5)重復(fù)(2)~(4)步,輸入字符都有效,一直處理完(6)是負(fù)數(shù)進(jìn)行求補(bǔ),轉(zhuǎn)換成補(bǔ)碼;否則直接將數(shù)值保存〔例4-18〕有符號十進(jìn)制數(shù)輸入程序-2 ;數(shù)據(jù)段 =10 (0) ? 30(0) ;代碼段
: ;調(diào)用子程序,輸入一個數(shù)據(jù) ;獲得出口參數(shù) [] ;存放到數(shù)據(jù)緩沖區(qū) ,4
共享變量傳遞參數(shù)〔例4-18〕有符號十進(jìn)制數(shù)輸入程序-3 ;輸入有符號十進(jìn)制數(shù)的子程序
;出口參數(shù):變量=補(bǔ)碼表示的二進(jìn)制數(shù)值 ;說明:負(fù)數(shù)用“-”引導(dǎo)
0: ;輸入一個字符串
;沒有輸入數(shù)據(jù),錯誤 ,12 ;輸入超過12個字符,錯誤〔例4-18〕有符號十進(jìn)制數(shù)輸入程序-4 ;指向輸入緩沖區(qū) ;保存結(jié)果 為正負(fù)標(biāo)志,0為正,-1為負(fù) ,[] ;取一個字符 ,'+' ;是“+”,繼續(xù) 1 ,'-' ;是“-”,設(shè)置-1標(biāo)志 2 11: ;取下一個字符 ,[] ;是結(jié)尾0,轉(zhuǎn)向求補(bǔ)碼 3〔例4-18〕有符號十進(jìn)制數(shù)輸入程序-52: ,'0' ;不是0~9之間的數(shù)碼,錯誤
,'9'
,30h ;是0~9之間的數(shù)碼,轉(zhuǎn)換 ,10 ;原數(shù)值乘10:=×10 ;=1,乘積溢出,出錯 ;零位擴(kuò)展,便于相加 ;原數(shù)乘10后,與新數(shù)碼相加 ,80000000h ;數(shù)據(jù)超過231,出錯 1 ;繼續(xù)轉(zhuǎn)換下一個數(shù)位〔例4-18〕有符號十進(jìn)制數(shù)輸入程序-6: ;顯示出錯信息
0 ;3: ;判斷是正數(shù)還是負(fù)數(shù) 4 ;是負(fù)數(shù),進(jìn)行求補(bǔ) 54: ,7 ;正數(shù)超過231-1,出錯
〔例4-18〕有符號十進(jìn)制數(shù)輸入程序-75: ;設(shè)置出口參數(shù)
;子程序返回 ',:',0
共享變量傳遞參數(shù)3.堆棧傳遞參數(shù)主程序?qū)⑷肟趨?shù)壓入堆棧,子程序從堆棧中取出參數(shù)出口參數(shù)通常不使用堆棧傳遞高級語言進(jìn)行函數(shù)調(diào)用時提供的參數(shù),實質(zhì)也利用堆棧傳遞采用堆棧傳遞參數(shù)是程式化的,它是編譯程序處理參數(shù)傳遞、以及匯編語言與高級語言混合編程時的常規(guī)方法〔例4-19〕計算有符號數(shù)平均值程序-1 ;數(shù)據(jù)段 675,35434,... ;代碼段 ;壓入數(shù)據(jù)個數(shù) ;壓數(shù)組的偏移地址
;調(diào)用求平均值子程序 ;出口參數(shù):=平均值(整數(shù)部分) ,8 ;平衡堆棧(壓入了8個字節(jié)數(shù)據(jù)) ;顯示堆棧傳遞參數(shù)〔例4-19〕計算有符號數(shù)平均值程序-2 ;計算32位有符號數(shù)平均值子程序
;入口參數(shù):順序壓入數(shù)據(jù)個數(shù)和數(shù)組偏移地址 ;出口參數(shù):=平均值
;保護(hù)寄存器
,[8] ;=取出的偏移地址 ,[12] ;=取出的數(shù)據(jù)個數(shù) ;保存和值 ;=指向數(shù)組元素堆棧傳遞參數(shù)〔例4-19〕計算有符號數(shù)平均值程序-31: ,[*4] ;求和 ,1 ;指向下一個數(shù)據(jù) ;比較個數(shù) 1 ;循環(huán) ;將累加和符號擴(kuò)展到 ;有符號數(shù)除法,=平均值 ;恢復(fù)寄存器
示意圖求和溢出與個數(shù)為0的問題?利用堆棧傳遞參數(shù)返回4.3.4程序模塊程序分段、子程序等是進(jìn)行程序模塊化開發(fā)大型程序時采用的方法子程序模塊子程序庫庫文件包含宏匯編源文件包含1.子程序模塊子程序單獨編寫,匯編形成目標(biāo)模塊文件連接時輸入子程序模塊文件名用共用偽指令和外部偽指令聲明標(biāo)識符[,標(biāo)識符…] ;定義標(biāo)識符的模塊使用標(biāo)識符:類型[,標(biāo)識符:類型…] ;調(diào)用標(biāo)識符的模塊使用子程序在代碼段,與主程序文件采用相同的存儲模型,沒有開始執(zhí)行和結(jié)束執(zhí)行點處理好子程序與主程序之間的參數(shù)傳問題〔例4-20〕數(shù)據(jù)輸入輸出程序-1;0420(子程序文件) 32 ;子程序共用 ;外部變量 ;定義的變量集中起來 12(0) ;顯示緩沖區(qū) 30(0) ;代碼段 c ;明確采用C語言規(guī)范 …… ;輸出子程序 c …… ;輸入子程序 c …… ;計算平均值子程序
〔例4-20〕數(shù)據(jù)輸入輸出程序-2;0420(主程序文件) 32
;外部子程序 ;變量共用
=10 (0) ?1 '10:',13,10,02 ':',0
: 1 ;提示輸入10個數(shù)據(jù)
〔例4-20〕數(shù)據(jù)輸入輸出程序-3
;=數(shù)據(jù)個數(shù): ;調(diào)用子程序,輸入一個數(shù)據(jù) ;獲得出口參數(shù) [*4] ,1
〔例4-20〕數(shù)據(jù)輸入輸出程序-4 ;傳遞參數(shù)
;調(diào)用子程序,求平均值 ,8 ;返回值轉(zhuǎn)存到 2 ;提示輸出平均值
;提示輸出平均值 ;調(diào)用子程序,顯示平均值 0
2.子程序庫子程序庫:統(tǒng)一管理子程序模塊遵循更加嚴(yán)格的子程序模塊要求子程序文件編寫完成、匯編形成目標(biāo)模塊利用庫管理工具程序:把子程序模塊逐個加入到子程序庫()使用子程序庫:在連接主程序模塊時提供子程序庫文件名操作演示數(shù)據(jù)輸入輸出程序-子程序模塊數(shù)據(jù)輸入輸出程序-執(zhí)行實例數(shù)據(jù)輸入輸出程序-子程序庫3.庫文件包含直接在主程序源文件中用庫文件包含偽指令說明不用在連接時輸入庫文件名 文件名子程序庫文件名要符合操作系統(tǒng)規(guī)范必要時含有路徑,用于指明文件的存儲位置如果沒有路徑名,匯編程序?qū)⒃谀J(rèn)目錄、當(dāng)前目錄和指定目錄下尋找4.宏匯編宏():具有宏名的一段匯編語句序列宏需要先定義宏名 形參表 …… ;宏定義體
然后程序中進(jìn)行宏調(diào)用宏名實體參數(shù)在匯編時,宏指令被匯編程序用宏定義的代碼序列替代,實現(xiàn)宏展開宏匯編示例宏定義
宏展開
宏調(diào)用
5.源文件包含 文件名將偽指令指定的文本文件內(nèi)容插入源程序可以包含任何文本文件一些常用的或有價值的宏定義存放在宏定義文件各種常量定義、聲明語句等組織在包含文件常用的子程序形成匯編語言源文件利用偽指令包含其他文件,其實質(zhì)仍然是一個源程序,只不過是分在了幾個文件書寫組合兩種文件包含、以及宏匯編等方法,可以精簡程序框架、簡化程序設(shè)計3232 ;不列表內(nèi)容:32 ...
32
... ;列表內(nèi)容返回4.4應(yīng)用程序編程匯編語言可以編寫32位應(yīng)用程序調(diào)用的應(yīng)用程序接口運行于操作系統(tǒng)平臺可以利用的高級特性,生成的可執(zhí)行文件相對較小、性能更高從更深層次理解運行機(jī)制及程序設(shè)計思想4.4.1操作系統(tǒng)函數(shù)調(diào)用操作系統(tǒng)以其提供的系統(tǒng)函數(shù)(系統(tǒng)功能)支持程序員進(jìn)行編程的系統(tǒng)函數(shù)(功能)以動態(tài)連接庫()形式提供,利用其應(yīng)用程序接口()調(diào)用庫中的函數(shù)是一些類型、常量和函數(shù)的集合,提供了編程中使用庫函數(shù)的途徑16:16位的32:32位的1.動態(tài)連接庫靜態(tài)連接:連接程序從庫文件中抽取需要的子程序插入到最終的可執(zhí)行代碼中動態(tài)連接:程序運行時才將代碼加載到主存動態(tài)連接庫:保存程序運行時需要重復(fù)使用的代碼的文件3個最重要的動態(tài)連接庫32:主要處理內(nèi)存管理和進(jìn)程調(diào)度32:主要控制用戶界面32:負(fù)責(zé)圖形方面的操作導(dǎo)入庫():程序開發(fā)的連接階段使用,與一個動態(tài)連接庫對應(yīng)2.的高級語言特性條件控制偽指令:
流程控制偽指令:
過程聲明偽指令:事先聲明過程的結(jié)構(gòu) (包括操作系統(tǒng)函數(shù)、高級語言的函數(shù)) 過程名 [調(diào)用距離][語言類型] [,參數(shù)∶[類型]]...過程調(diào)用偽指令:實現(xiàn)過程調(diào)用 過程名[,參數(shù),...]3.程序退出函數(shù)32程序員參考手冊(
);匯編語言聲明
匯編語言調(diào)用,0將函數(shù)調(diào)用定義成宏
宏調(diào)用 04.4.2控制臺應(yīng)用程序應(yīng)用程序開始運行創(chuàng)建控制臺()窗口或創(chuàng)建圖形界面窗口32位控制臺程序像增強(qiáng)版的程序使用標(biāo)準(zhǔn)控制臺 標(biāo)準(zhǔn)輸入設(shè)備(鍵盤) 標(biāo)準(zhǔn)輸出設(shè)備(顯示器)32位控制臺程序運行在保護(hù)方式通過使用的動態(tài)鏈接庫函數(shù)1.處理器識別指令返回處理器特征信息的指令當(dāng)=0時執(zhí)行指令返回指令中能夠賦給的最大值、和返回生產(chǎn)廠商的標(biāo)識串利用這個廠商標(biāo)識串,確認(rèn)是公司處理器當(dāng)=1或2等值時執(zhí)行指令返回處理器更詳細(xì)的識別信息例如處理器型號、支持的指令集等〔例4-21〕處理器識別程序-1 .686
\32
\
<>=-11
? '' 12(0) = ?控制臺句柄控制臺輸出〔例4-21〕處理器識別程序-2
: ,0 ;執(zhí)行處理器識別指令 12 8 4 ;獲得輸出句柄
;顯示信息 ,\ ,0 ;退出 ,0
運行結(jié)果2.控制臺句柄句柄()是一個32位無符號整數(shù)用來唯一確定一個對象例如某個輸入設(shè)備、輸出設(shè)備或者一個圖形標(biāo)準(zhǔn)輸入句柄 =-10標(biāo)準(zhǔn)輸出句柄 =-11標(biāo)準(zhǔn)錯誤句柄 =-12函數(shù)獲取控制臺輸入或輸出的句柄實例用于控制臺程序的輸入輸出操作返回3.控制臺輸出函數(shù)顯示器輸出函數(shù)將一個字符串輸出到屏幕上支持標(biāo)準(zhǔn)的控制字符,例如回車、換行等32中可以使用兩種字符集8位字符集,函數(shù)名以字母A結(jié)尾16位字符集,函數(shù)名以字母W結(jié)尾參數(shù)第一個:控制臺輸出句柄實例第二個:指向字符串的指針、即緩沖區(qū)地址第三個:指明字符串長度,是一個32位整數(shù)第四個:指向一個整數(shù)變量,返回實際輸出的字符數(shù)第五個:保留,設(shè)置為0返回4.控制臺輸入函數(shù)鍵盤輸入函數(shù)將鍵盤輸入的文本保存到一個緩沖區(qū)第一個:控制臺輸入句柄實例第二個:輸入緩沖區(qū)指針第三個:要讀取字符的最大數(shù)量第四個:實際輸入字符數(shù)量的指針第五個:未使用,設(shè)置為0調(diào)用函數(shù)時系統(tǒng)等待用戶輸入、并回車確認(rèn)(例如用戶輸入了3個字符,依次是123)第4個參數(shù)的變量保存用戶輸入字符個數(shù)再加2的結(jié)果(例如本例是5)(內(nèi)容用十六進(jìn)制數(shù)表達(dá)依次是3132330D0A)定義輸入緩沖區(qū)要多留兩個字節(jié)〔例4-22〕信息輸入輸出程序-1 .686
\32
<>
<>=-10=-11〔例4-22〕信息輸入輸出程序-2
1 ':',02 '',0 80(0)3 '32!',0 ? ? ? 255(0) ;設(shè)置輸入緩沖區(qū)最大255個字符〔例4-22〕信息輸入輸出程序-3
: 1 ;提示輸入
;輸入信息
2
;顯示輸入信息
3
0〔例4-22〕信息輸入輸出程序-4 ;字符串顯示子程序 ;入口參數(shù):=字符串地址
;保存入口參數(shù),即字符串地址
;=字符串地址 ;計算字符串長度1: ,[]
2
1〔例4-22〕信息輸入輸出程序-52: ,\ ,0
;字符串輸入子程序 ;入口參數(shù):=緩沖區(qū)地址
〔例4-22〕信息輸入輸出程序-6 ;保護(hù)輸入的緩沖區(qū)地址參數(shù)
,\ ,255,0 ,2
;獲得緩沖區(qū)地址1: [] [] ;將輸入的字符串復(fù)制到用戶緩沖區(qū)
1〔例4-22〕信息輸入輸出程序-7 [],0 ;最后填入結(jié)尾字符0
:32!運行結(jié)果4.4.3圖形窗口應(yīng)用程序消息窗口是常見的圖形窗口顯示形式使用函數(shù)32程序員參考手冊的定義(,,,
);:父窗口的句柄:要顯示字符串的地址指針,字符串的首地址:消息窗標(biāo)題的地址指針:指明該消息窗的類型〔例4-23〕消息窗口程序-1 .686
\32 \32
<> 0 0
'消息窗口',0 '本機(jī)的處理器是',12(0),0 =1〔例4-23〕消息窗口程序-2
: ,0 ;獲得顯示器信息 12 8 4 ,\
操作演示
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度創(chuàng)意園區(qū)門面房租賃及知識產(chǎn)權(quán)保護(hù)合同4篇
- 2025年度新能源項目土地使用權(quán)轉(zhuǎn)讓買賣合同范本3篇
- 個人財產(chǎn)抵押融資合同樣本版B版
- 二零二四停薪留職企業(yè)員工培訓(xùn)與教育協(xié)議3篇
- 2025年度醇基燃料新能源推廣應(yīng)用合同3篇
- 2025年度美發(fā)店人才招聘股份制投資合同4篇
- 二零二五年度船運貨物貿(mào)易結(jié)算服務(wù)合同范本4篇
- 二零二五食用油線上線下融合營銷推廣合同
- 智慧校園的構(gòu)建智能校車停車位安保系統(tǒng)的應(yīng)用與展望
- 禮儀規(guī)范打造專業(yè)學(xué)術(shù)交流氛圍
- 2025年病案編碼員資格證試題庫(含答案)
- 2025新譯林版英語七年級下單詞表
- 新疆2024年中考數(shù)學(xué)試卷(含答案)
- 2024-2030年中國連續(xù)性腎臟替代治療(CRRT)行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略分析報告
- 跨學(xué)科主題學(xué)習(xí):實施策略、設(shè)計要素與評價方式(附案例)
- 場地委托授權(quán)
- 2024年四川省成都市龍泉驛區(qū)中考數(shù)學(xué)二診試卷(含答案)
- 項目工地春節(jié)放假安排及安全措施
- 印染廠安全培訓(xùn)課件
- 紅色主題研學(xué)課程設(shè)計
- 裝置自動控制的先進(jìn)性說明
評論
0/150
提交評論