《32位匯編語言程序設(shè)計》上機(jī)指導(dǎo) ` 857_第1頁
《32位匯編語言程序設(shè)計》上機(jī)指導(dǎo) ` 857_第2頁
《32位匯編語言程序設(shè)計》上機(jī)指導(dǎo) ` 857_第3頁
《32位匯編語言程序設(shè)計》上機(jī)指導(dǎo) ` 857_第4頁
《32位匯編語言程序設(shè)計》上機(jī)指導(dǎo) ` 857_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、?32位匯編語言程序設(shè)計?上機(jī)指導(dǎo)?32位匯編語言程序設(shè)計?上機(jī)指導(dǎo)1實驗一 建立windows環(huán)境下32位匯編語言開發(fā)環(huán)境2實驗2 指令格式與尋址方式4實驗3 數(shù)據(jù)操作編程5實驗4 分支和循環(huán)程序設(shè)計6實驗5 子程序設(shè)計8實驗6 輸入輸出程序設(shè)計9實驗7: 字符串操作10實驗8: 宏結(jié)構(gòu)設(shè)計11實驗9: 混合編程12Windows環(huán)境下32位匯編語言開發(fā)環(huán)境的建立13調(diào)試程序Windbg19宏匯編命令ML和連接命令LINK常用參數(shù)速查22輸入輸出宏命令23實驗1 建立windows環(huán)境下32位匯編語言開發(fā)環(huán)境實驗?zāi)康模航indows環(huán)境下32位匯編語言開發(fā)環(huán)境,并熟悉它的使用方法。實驗要

2、求: 1建立windows環(huán)境下32位匯編語言開發(fā)環(huán)境; 2熟悉自己建立的開發(fā)環(huán)境的使用方法; 3熟悉調(diào)試工具的使用實驗內(nèi)容: 1定制masm32集成開發(fā)環(huán)境,使之符合教學(xué)要求。 2分別建立匯編,連接,和匯編&連接批處理命令,能夠生成包含調(diào)試信息的目標(biāo)文件,列表文件,以及能夠進(jìn)行調(diào)試的可執(zhí)行WIN32控制臺程序。 3建立16位和32位匯編語言框架程序。 4在自己建立的開發(fā)環(huán)境下匯編,連接,運行教材中的例3-1和例3-2。實驗步驟:1、安裝開發(fā)環(huán)境運行?32位匯編語言程序設(shè)計?教材配套開發(fā)環(huán)境軟件“,將MASM32安裝在根目錄下例如:c:masm32。接著運行Exmasm32.exe,將

3、其它軟件安裝在masm32的目錄下例如:c:masm32。建立masm32文件夾中的qEditor.exe和Windbg.exe桌面快捷方式。2、定制開發(fā)環(huán)境修改文件msm32binbuildc.bat中的內(nèi)容,使得執(zhí)行ProjectConsole Assemble & Link后能夠匯編連接可調(diào)試的32位控制臺應(yīng)用程序,同時生成列表文件。匯編命令改為:masm32binml /c /coff /Fl /Zi “連接命令改為:masm32binlink /debug “1、建立匯編連接16位應(yīng)用程序的批處理文件make16.bat,可以用于匯編連接可調(diào)試的實模式應(yīng)用程序,同時生成列表文

4、件。make16.bat的主要內(nèi)容:masm32binml /c /Fl /Zi "%1.asm"masm32binLink16 /debug "%1.obj" 4、建立適合在定制開發(fā)環(huán)境下使用的32位應(yīng)用程序框架.386;必須是第一條非注釋語句,說明這是一個32位應(yīng)用程序.model flat, stdcall;定義程序的存儲模式32位應(yīng)用程序中必須采用flatinclude masm32includeio32.inc;可選,如果在程序中使用作者自定義的宏命令需要這一句 .stack 4096;定義堆棧段.data;定義數(shù)據(jù)段;數(shù)據(jù)定義.code;定義

5、代碼段start:;程序起始點;程序代碼ret ;程序結(jié)束點,返回WINDOWS;子程序代碼end start;匯編結(jié)束5、建立適合在定制開發(fā)環(huán)境下使用的32位應(yīng)用程序框架.model small, stdcall;定義程序的存儲模式一般采用small.386;可選,如果有該語句,可以使用386指令集include masm32includeio16.inc;可選,如果在程序中使用作者自定義的宏命令需要這一句 .stack;定義堆棧段.data;定義數(shù)據(jù)段;數(shù)據(jù)定義.code;定義代碼段.startup:;程序起始點;程序代碼.exit 0 ;程序結(jié)束點,返回DOS;子程序代碼end;匯編結(jié)束

6、4、 在自己建立的開發(fā)環(huán)境下匯編,連接,運行教材中的例3-1和例3-2。實驗2 指令格式與尋址方式實驗?zāi)康模菏煜R編語言指令格式,掌握常用數(shù)據(jù)定義偽指令,理解各種尋址方式的應(yīng)用。掌握調(diào)試工具Windbg.exe的使用。實驗要求: 1通過調(diào)試程序理解常用數(shù)據(jù)定義偽指令的作用。 2通過調(diào)試程序理解各種尋址方式的應(yīng)用。 3熟練掌握調(diào)試工具Windbg的使用方法。實驗內(nèi)容:1上機(jī)匯編連接例3-4-例3-9,通過列表文件和windbg觀察數(shù)據(jù)在內(nèi)存中的分配情況。2上機(jī)匯編連接例4-1-例4-9,通過windbg觀察機(jī)器碼,并單步執(zhí)行,觀察每一條指令的執(zhí)行結(jié)果。實驗步驟:1、 上機(jī)匯編連接例3-4(1)

7、查看列表文件。根據(jù)列表文件畫出數(shù)據(jù)段中數(shù)據(jù)的分配情況,同時標(biāo)出const1和const2的內(nèi)存單元。(2) 用Windbg調(diào)試?yán)?-4。用memory窗口觀察const1開始的29個字節(jié)空間的內(nèi)容,并記錄下來。(3) 比照源程序中的數(shù)據(jù)定義,列表文件的數(shù)據(jù)分配和在Windbg中記錄的數(shù)據(jù),理解數(shù)據(jù)定義偽指令的作用。2、 按照上題的要求,上機(jī)匯編連接例3-5例3-9。3、 上機(jī)匯編連接例4-1(1) 用Windbg調(diào)試?yán)?-1,用Disassembly窗口觀察機(jī)器碼。指出指令的中操作數(shù)。(2) 在Windbg下單步執(zhí)行例4-1,觀察eax存放器的內(nèi)容變化情況。4、 按照上題的要求,上機(jī)匯編連接例

8、4-2例4-7。5、 上機(jī)匯編連接例4-8(1) 用Windbg調(diào)試?yán)?-8,用Disassembly窗口觀察機(jī)器碼(2) 在Windbg下單步執(zhí)行例4-8,觀察EIP存放器內(nèi)容的變化情況。(3) 分析指令jmp start的機(jī)器碼的含義。觀察這條指令執(zhí)行前后EIP存放器內(nèi)容的變化。6、上機(jī)匯編連接例4-91用Windbg調(diào)試?yán)?-9,用Disassembly窗口觀察機(jī)器碼2在Windbg下單步執(zhí)行例4-9,觀察EIP存放器內(nèi)容的變化情況。3觀察內(nèi)存address的內(nèi)容,觀察它與地址quit的關(guān)系。(4) 觀察指令jmp address執(zhí)行前后EIP存放器內(nèi)容的變化。實驗3 數(shù)據(jù)操作編程實驗?zāi)?/p>

9、的:熟練掌握根本的數(shù)據(jù)傳送指令,算術(shù)運算指令和位操作指令在編程中的應(yīng)用。實驗要求:按照要求編寫程序,調(diào)試運行。實驗內(nèi)容:1、 編寫32位控制臺應(yīng)用程序提示用戶輸入32位有符號整數(shù)x, y, z,計算result=x-2y+4z的值,并顯示計算結(jié)果。調(diào)用WriteString顯示字符串“Input 32-bit signed integer x:;調(diào)用ReadSDecDword輸入數(shù)據(jù)保存到x;調(diào)用WriteString顯示字符串“Input 32-bit signed integer y:;調(diào)用ReadSDecDword輸入數(shù)據(jù)保存到y(tǒng)y=y+y;result=x-y;調(diào)用WriteStrin

10、g顯示字符串“Input 32-bit signed integer z:;調(diào)用ReadSDecDword輸入數(shù)據(jù)保存到z;z=4*zresult=result+z;調(diào)用WriteString顯示字符串“x-2y+4z=:;調(diào)用WriteSDecDword顯示result.2、 寫32位控制臺應(yīng)用程序:提示用戶輸入長方形的長和寬,計算它的周長和面積,并分別顯示結(jié)果。調(diào)用WriteString顯示字符串“Input length of rectangle x:;調(diào)用ReadUDecDword輸入數(shù)據(jù)保存到x;調(diào)用WriteString顯示字符串“Input width of rectangle

11、y:;調(diào)用ReadUDecDword輸入數(shù)據(jù)保存到y(tǒng);周長=xy;面積x*y;調(diào)用WriteString顯示字符串“detmer of rectangle is:;調(diào)用WriteUDecDword顯示周長;調(diào)用WriteString顯示字符串“area of rectangle is:;調(diào)用WriteUDecDword顯示面積;3、 編寫32位控制臺應(yīng)用程序:分解AX存放器的內(nèi)容:取高7位存入value1,取中間5位存入value2,取最后4位存入value3。提示:使用移位和邏輯運算指令實現(xiàn)。4、 編寫32位控制臺應(yīng)用程序:將value1的低7位,value2的低5位,value3的低4位合

12、并到AX存放器中。提示:使用雙精度移位指令。5、 編寫32位控制臺應(yīng)用程序:利用作者提供的輸入輸出宏從鍵盤接收一個字節(jié)的十進(jìn)制數(shù),利用教材中例題5-47的代碼,將這個十進(jìn)制數(shù)轉(zhuǎn)換成十六進(jìn)制字符存放到HexStr中,用輸出字符串宏WriteString顯示轉(zhuǎn)換的結(jié)果。實驗4 分支和循環(huán)程序設(shè)計實驗?zāi)康模菏炀氄莆辗种Ш脱h(huán)結(jié)構(gòu)的設(shè)計方法,熟悉跳轉(zhuǎn)和循環(huán)指令的使用方法。實驗要求:按照要求編寫程序,調(diào)試運行。實驗內(nèi)容:1、 編寫程序?qū)崿F(xiàn)下面的算法:if thenlowerCount+1;elseif(chA) and (chZ)thenupperCount+1elseotherCount+1;endi

13、fendif其中ch調(diào)用ReadChar輸入,lowerCount, upperCount和otherCount的值用WriteUDecByte顯示。2、 編寫程序從鍵盤輸入一系列有符號數(shù),找出其中的最大數(shù)和最小數(shù),顯示運行結(jié)果。建議算法如下:顯示 “First number?;調(diào)用ReadSDecDword輸入雙字有符號數(shù);minimum:=number;maximum:=number;while(顯示 “Another number?(Y or N)loopif (輸入Y) then調(diào)用ReadSDecDword輸入雙字有符號數(shù);if(number<minimum)thenminim

14、um:=number;endifif(number>maximum)thenmaximum:=number;endifendwhile3-6題中任選一題:3、編寫程序?qū)AX的內(nèi)容轉(zhuǎn)換為二進(jìn)制字符串4、編寫程序?qū)AX的內(nèi)容轉(zhuǎn)換為十六進(jìn)制字符串5、編寫程序?qū)AX的內(nèi)容轉(zhuǎn)換為無符號十進(jìn)制字符串6、編寫程序?qū)AX的內(nèi)容轉(zhuǎn)換為有符號十進(jìn)制字符串,負(fù)數(shù)字符串以“-“引導(dǎo)。7-10題中任選一題:7、編寫程序?qū)⒍M(jìn)制字符串表示的數(shù)據(jù)存入EAX存放器8、編寫程序?qū)⑹M(jìn)制字符串表示的數(shù)據(jù)存入EAX存放器9、編寫程序?qū)⑹M(jìn)制字符串表示的無符號數(shù)據(jù)存入EAX存放器10、編寫程序?qū)⑹M(jìn)制字符串表示的有符

15、號數(shù)據(jù)存入EAX存放器實驗5 子程序設(shè)計實驗?zāi)康模豪斫舛褩5墓ぷ髟?,熟練掌握子程序的設(shè)計方法,熟悉子程序相關(guān)指令的使用方法。實驗要求:按照要求編寫程序,調(diào)試運行。實驗內(nèi)容:1、 上機(jī)調(diào)試下面的代碼,單步執(zhí)行,觀察ESP存放器和EIP存放器內(nèi)容的變化情況。觀察esp指示的內(nèi)存單元的內(nèi)容。畫出堆棧的變化過程,標(biāo)注ESP存放器的變化情況。.386;必須是第一條非注釋語句,說明這是一個32位應(yīng)用程序.model flat, stdcall;定義程序的存儲模式32位應(yīng)用程序中必須采用flat.code;定義代碼段start:;程序起始點 push 100call subproc;程序代碼pop eax

16、ret ;程序結(jié)束點,返回WINDOWSsubproc procret subproc endpend start;匯編結(jié)束2、編寫完整的32位應(yīng)用程序:設(shè)計子程序完成下面的功能, 在主程序中先調(diào)用ReadUDec輸入數(shù)據(jù),然后調(diào)用自己編寫的子程序,將輸入的數(shù)據(jù)轉(zhuǎn)換為對應(yīng)的可顯示字符串的形式,最后調(diào)用WriteString顯示轉(zhuǎn)換后的字符串。要求完成的子程序可以在14中任選一題,58中任選一題。1編寫子程序?qū)AX的內(nèi)容轉(zhuǎn)換為二進(jìn)制字符串2編寫子程序?qū)㈦p字補(bǔ)碼轉(zhuǎn)換為十六進(jìn)制字符串3編寫子程序?qū)AX的內(nèi)容轉(zhuǎn)換為無符號十進(jìn)制字符串4編寫子程序?qū)㈦p字補(bǔ)碼轉(zhuǎn)換為有符號十進(jìn)制字符串,負(fù)數(shù)字符串以“-“

17、引導(dǎo)。5編寫子程序?qū)⒍M(jìn)制字符串表示的數(shù)據(jù)存入EAX存放器6編寫子程序?qū)⑹M(jìn)制字符串表示的數(shù)據(jù)存入EAX存放器7編寫子程序?qū)⑹M(jìn)制字符串表示的無符號數(shù)據(jù)存入EAX存放器8編寫子程序?qū)⑹M(jìn)制字符串表示的有符號數(shù)據(jù)存入EAX存放器3、利用多模塊設(shè)計方法實現(xiàn)上面程序的功能,建立子程序庫,并編寫主程序調(diào)用子程序庫中的函數(shù)。提示: (1) 編寫子程序模塊完成上題中的子程序功能,匯編生成目標(biāo)文件。(2) 將子程序目標(biāo)文件組成庫文件:masm32binlib 目標(biāo)文件名 /out:庫文件名或者masm32binlink -lib 目標(biāo)文件名 /out:庫文件名(3) 編寫主程序模塊: 用extern聲明外

18、部子程序,用includelib包含前面生成的庫文件,在主程序中先調(diào)用ReadUDec輸入數(shù)據(jù),然后調(diào)用自己編寫的子程序,將輸入的數(shù)據(jù)轉(zhuǎn)換為對應(yīng)的可顯示字符串的形式,最后調(diào)用WriteString顯示轉(zhuǎn)換后的字符串。匯編連接生成可執(zhí)行文件。實驗6 輸入輸出程序設(shè)計實驗?zāi)康模菏炀氄莆諏崿F(xiàn)實模式和保護(hù)模式下鍵盤輸入和屏幕顯示功能的程序設(shè)計方法。實驗要求:按照要求編寫程序,調(diào)試運行。實驗內(nèi)容:1、編寫實模式應(yīng)用程序:利用IN/OUT指令讀寫CMOS時鐘,顯示當(dāng)前的日期和時間。2、編寫實模式應(yīng)用程序:利用IN/OUT指令編寫簡單的音樂程序。運行時,當(dāng)用戶按下按鍵1-7,分別演奏音調(diào)dou,re,mi,

19、fa,so,la,si3、編寫完整的16位應(yīng)用程序:設(shè)計子程序完成下面的功能, 在主程序中先調(diào)用輸入字符串的子程序,將字符串中所有英文字符變?yōu)榇髮?,其他字符不變。最后調(diào)用輸出字符串的子程序,顯示原始字符串和轉(zhuǎn)換后的字符串。(1) 編寫實模式子程序利用系統(tǒng)調(diào)用完成鍵盤輸入一個字符。(2) 編寫實模式子程序利用系統(tǒng)調(diào)用完成屏幕顯示一個字符。(3) 編寫實模式子程序利用系統(tǒng)調(diào)用完成鍵盤輸入一個字符串。(4) 編寫實模式子程序利用系統(tǒng)調(diào)用完成屏幕顯示一個字符串。4、編寫完整的32位應(yīng)用程序:設(shè)計子程序完成下面的功能, 在主程序中先調(diào)用輸入字符串的子程序,將字符串中的字符逆序排序生成新的字符串。最后調(diào)用

20、輸出字符串的子程序,顯示原始字符串和轉(zhuǎn)換后的字符串。編寫保護(hù)模式子程序利用系統(tǒng)調(diào)用完成鍵盤輸入一個字符。(1) 編寫保護(hù)模式子程序利用系統(tǒng)調(diào)用完成鍵盤輸入一個字符。(2) 編寫保護(hù)模式子程序利用系統(tǒng)調(diào)用完成屏幕顯示一個字符。(3) 編寫保護(hù)模式子程序利用系統(tǒng)調(diào)用完成鍵盤輸入一個字符串。(4) 編寫保護(hù)模式子程序利用系統(tǒng)調(diào)用完成屏幕顯示一個字符串。實驗7: 字符串操作實驗?zāi)康模菏炀氄莆沾僮髦噶畹氖褂梅椒?。實驗要求:本實驗要求利用串操作指令,根?jù)要求編寫程序,調(diào)試運行。輸入輸出功能可以使用作者定義的命令,也可以使用讀者自己定義的子程序來實現(xiàn)。實驗內(nèi)容:1、編寫32位應(yīng)用程序逆序拷貝字符串。程序運

21、行時首先顯示原來的字符串,然后顯示逆序排列后的字符串。2、編寫32位應(yīng)用程序:連接兩個字符串。首先提示用戶輸入兩個字符串,然后連接兩個字符串,并在兩個字符串之間插入字符.。顯示原始字符串和連接后的字符串。3、 編寫32位應(yīng)用程序加密字符串。首先提示用戶輸入一個字符串,然后用加密算法對字符進(jìn)行變換,顯示加密后的字符串。再運行解密算法得到原始的字符串,顯示解密后的字符串。加密算法:字符 異或 密鑰解密算法:加密字符 異或 密鑰密鑰是8位無符號數(shù)。實驗8: 宏結(jié)構(gòu)設(shè)計實驗?zāi)康模菏炀毢甑氖褂梅椒?。實驗要求:按照要求編寫程序,調(diào)試運行。實驗內(nèi)容:1、編寫完整的32位應(yīng)用程序:先定義下面的宏,然后在程序中

22、調(diào)用宏,生成列表文件。根據(jù)列表文件寫出宏擴(kuò)展后的結(jié)果。(1) 定義Move32宏接收兩個內(nèi)存操作數(shù),把源操作數(shù)送到目的操作數(shù)。(2) 定義Mult32宏接收兩個內(nèi)存操作數(shù),將他們相乘產(chǎn)生一個32位的乘積。2、 編寫一個ReadUdec的宏,從標(biāo)準(zhǔn)輸入上讀取一個8位,16位或32位的無符號整數(shù),并在給定的參數(shù)中返回。使用條件操作符允許宏能夠處理不同大小的輸入?yún)?shù)。寫一個程序調(diào)用宏并傳遞不同尺寸的操作數(shù)。3、 編寫一個WriteUdec的宏,通過調(diào)用顯示無符號數(shù)的功能在標(biāo)準(zhǔn)輸出上顯示一個無符號數(shù)。傳遞給宏的參數(shù)可以是一個字節(jié)、字或雙字,在宏內(nèi)使用條件操作符以便能適應(yīng)不同尺寸的參數(shù)。寫一個程序調(diào)用宏

23、,并傳遞給宏不同尺寸的參數(shù)。實驗9: 混合編程實驗?zāi)康模菏炀氄莆諈R編語言與VC的混合編程的方法。實驗要求:按照要求編寫程序,調(diào)試運行。實驗內(nèi)容:1、編寫一個C+程序通過調(diào)用匯編子程序?qū)崿F(xiàn)的功能。提示:在C程序中輸入兩個整數(shù),然后調(diào)用匯編子程序?qū)@兩個數(shù)求積,在主程序中打印計算結(jié)果。編程并上機(jī)調(diào)試通過。2、 編寫程序,在匯編程序中初始化varA12、varB6,調(diào)用C語言的子程序求積并打印計算結(jié)果。編程并上機(jī)調(diào)試通過。3、 將排序子程序改寫成C語言的嵌入式匯編函數(shù);然后編寫一個C語言主程序,提供待排序的數(shù)據(jù)和顯示排序后的結(jié)果。4、 將排序子程序改寫成可供C語言調(diào)用的模塊;然后編寫一個C語言主程序

24、,提供待排序的數(shù)據(jù)和顯示排序后的結(jié)果。5、 編寫識別CPU的匯編語言過程,供調(diào)用的形式,然后編寫一個Visual C+主程序,并上機(jī)調(diào)試通過。Windows環(huán)境下32位匯編語言開發(fā)環(huán)境的建立在Windows環(huán)境下進(jìn)行匯編語言程序設(shè)計之前,首先需要搭建一個匯編語言的開發(fā)環(huán)境?,F(xiàn)在匯編語言開發(fā)工具包常見的是MASM,TASM和NASM。MASM是微軟開發(fā)的宏匯編工具,適合在Windows環(huán)境下進(jìn)行程序設(shè)計,性能穩(wěn)定,持續(xù)升級;NASM的語法與MASM略有不同,它可以在不同的環(huán)境下使用,LINUX或Windows。鑒于目前匯編語言程序設(shè)計教學(xué)中更多的選擇了MASM,本文將介紹基于MASM的32位匯編

25、開發(fā)環(huán)境的幾種搭建方法。其他匯編工具的具體內(nèi)容可參考相關(guān)的手冊。匯編語言的開發(fā)分為源代碼編輯,匯編和連接三個步驟,在必要的時候還需要對程序進(jìn)行調(diào)試。因此匯編語言開發(fā)環(huán)境中應(yīng)包含編輯軟件,匯編軟件,連接軟件和調(diào)試軟件。如果將這些軟件集成在一起就是構(gòu)成一個集成開發(fā)環(huán)境。一、命令行環(huán)境首先下載一個MASM615開發(fā)工具包。在許多匯編網(wǎng)站和匯編教材的配套光盤中都提供了該工具包。根據(jù)提示,進(jìn)行安裝。然后就可以用它來開發(fā)匯編程序。1源代碼編輯匯編源程序是純文本文件,其擴(kuò)展名為.asm,可以用任何一種文本編輯軟件來編寫匯編原代碼。比方EditPlus,UltraEdit,NotePad,Word, VC等,

26、注意文件保存的時候必須以純文本格式保存,并取.asm后綴名。2匯編源文件不能直接被機(jī)器執(zhí)行,需要運行匯編軟件對它進(jìn)行匯編生成目標(biāo)文件,后綴為.obj.,這是一個二進(jìn)制文件。如果出現(xiàn)語法錯誤,匯編程序會產(chǎn)生錯誤報告,程序員可以根據(jù)這些錯誤報告對源程序進(jìn)行重新編輯,重新匯編,直到?jīng)]有語法錯誤為止。MASM匯編器的命令是, 其命令行格式為:Ml /option 源文件 /link option生成32位應(yīng)用程序時,常用的命令行是:ML /coff /c /Fl /Zi filename;例如,要匯編源文件,生成coff格式的目標(biāo)文件,列表文件和調(diào)試信息,可以使用命令行:ML /coff /c /Fl

27、 /Zi test.asm;為了防止每次匯編源文件的時候都要輸入許多參數(shù),可以建立一個批處理文件。例如批處理文件echo offif exist "%1.obj" del "%1.obj"if exist "%1.exe" del "%1.exe"pathml /c /coff /Fl /Zi "%1.asm"if errorlevel 1 goto errasm:errasmecho _echo Assembly Errorgoto TheEnd:TheEndpause有了這個批處理文件以后,

28、如果匯編test.asm,就可以用命令:mlbat test在建立自己批處理文件的時候,可以根據(jù)需要設(shè)定參數(shù),指定路徑。(3)連接目標(biāo)文件仍然不能執(zhí)行,還需要運行連接程序,將目標(biāo)文件和庫文件連接起來,才能生成最后可以執(zhí)行的.exe文件。生成可執(zhí)行文件的工具叫做連接器。在前面提到的匯編語言開發(fā)工具包中都包含有連接器link.需要注意的是,連接器有兩種:一種是16位連接器Segmented Executable Linker,用于生成DOS程序,一種是32位連接器,可以生成Win32PE文件(Incremental Linker),如果要生成32位應(yīng)用程序需要使用后者。在MASM8和VC中提供有3

29、2位連接程序。一般來說,在開發(fā)工具包中用link16和link32分別表示16位和32位連接軟件。連接器的命令行用法為:LINK option filename生成windows控制臺程序的常用命令是:LINK /subsystem: console /DEBUG filename生成windows程序的常用命令是:LINK /subsystem: windows /DEBUG filename參數(shù)/DEBUG是為方便調(diào)試而設(shè)置的。例如,將前面生成的目標(biāo)文件連接生成控制臺程序所用的命令行是:LINK /subsystem:為了防止每次連接的時候都要輸入許多參數(shù),同樣也可以建立一個批處理文件。例

30、如批處理文件echo offif not exist “%1.obj goto errlinkpathLink /SUBSYSTEM:CONSOLE /OPT:NOREF /DEBUG "%1.obj" if errorlevel 1 goto errlink:errlinkecho _echo link Errorgoto TheEnd:TheEndpause此時,對連接,可以用命令:linkbat test在建立自己批處理文件的時候,可以根據(jù)需要設(shè)定參數(shù),指定路徑。如果建立一個類似VC里build的命令,就可以執(zhí)行一個命令對原程序進(jìn)行匯編和連接。下面的批處理文件執(zhí)行的就

31、是先匯編再連接的功能:echo offif exist "%1.obj" del "%1.obj"if exist "%1.exe" del "%1.exe"pathml /c /coff "%1.asm"if errorlevel 1 goto errasmpathLink /SUBSYSTEM:CONSOLE /OPT:NOREF "%1.obj"if errorlevel 1 goto errlinkdir "%1.*"goto TheEnd:err

32、linkecho _echo Link errorgoto TheEnd:errasmecho _echo Assembly Errorgoto TheEnd:TheEndpause執(zhí)行命令:buildc test就會對進(jìn)行匯編,并生成windows控制臺程序test.exe.4調(diào)試生成的.exe文件執(zhí)行后完成的功能如果與預(yù)想的功能不相符,說明程序編寫出現(xiàn)了邏輯錯誤,程序員需要對原程序進(jìn)行檢查,找出錯誤。檢查邏輯錯誤可以閱讀原程序,通過分析邏輯算法找出錯誤;也可以在程序中適當(dāng)?shù)奈恢锰砑虞敵稣Z句,顯示中間結(jié)果來發(fā)現(xiàn)錯誤,還可以利用調(diào)試軟件,跟蹤程序的執(zhí)行,動態(tài)調(diào)試程序從而發(fā)現(xiàn)錯誤。調(diào)試器有兩大類

33、,用戶模式和內(nèi)核模式。用戶模式的調(diào)試器用于調(diào)試用戶模式的應(yīng)用程序,工作在Ring3級,如vc自帶的調(diào)試器和Windbg;內(nèi)核模式的調(diào)試器那么可以調(diào)試操作系統(tǒng)內(nèi)核,處于CPU和操作系統(tǒng)之間,工作在Ring0級,如SoftICE, OLLYDBG, trw2000。關(guān)于調(diào)試器的使用方法,將在另外的文章中討論。二、集成開發(fā)環(huán)境開發(fā)一個匯編程序需要經(jīng)過上述四步才能生成正確的可執(zhí)行文件。程序員可以下載安裝匯編語言開發(fā)工具包,然后就可以進(jìn)行程序開發(fā)。如果需要更加方便的執(zhí)行匯編和連接的步驟,建議自己建立批處理文件,防止每次命令行輸入許多參數(shù)。也可以使用集成開發(fā)環(huán)境將上述步驟放在一個界面下方便的完成。WIND

34、OWS環(huán)境下常用的集成開發(fā)環(huán)境有MASM32和Visual C+,VisualAsm,PASS32,GASM。下面介紹MASM32和Visual C+的在開發(fā)匯編語言程序時的用法。1、 MASM32MASM32是Windows環(huán)境下的窗口應(yīng)用程序,集成了微軟的MASM工具,包含豐富的庫函數(shù)和宏文件以及相應(yīng)的聯(lián)機(jī)幫助,用戶界面友好,可以很方便的進(jìn)行WINDOWS下匯編程序的開發(fā),根本不需要進(jìn)行額外的設(shè)置。下載安裝MASM32之后,將Qeditor圖標(biāo)拖到桌面上以方便以后的使用。單擊Qeditor圖標(biāo)啟動MASM32,在主窗口中輸入源代碼,選擇File/Save保存文件。然后再選擇Project菜

35、單下的命令進(jìn)行匯編和連接。該菜單中主要使用的命令有:Assemble ASM file:匯編生成32位應(yīng)用程序,對應(yīng)的批處理文件是masm32binassembl.bat.這些批處理文件的內(nèi)容都與前面所講的匯編和連接批處理的內(nèi)容類似,讀者可以根據(jù)需要修改這些命令。MASM32將編輯,匯編和連接很好的結(jié)合在一起,對于windows圖形界面的變成也非常方便,它提供了一個資源編輯器。窗口應(yīng)用程序可以在該環(huán)境中直接運行,但是控制臺程序那么需要啟動命令行方式窗口運行。2、VC是微軟開發(fā)的的集成開發(fā)環(huán)境,在安裝了MASM615之后,也可以用作匯編語言程序開發(fā)的集成環(huán)境。有兩種方法可以用VC來開發(fā)匯編程序。

36、方法1:啟動VC+后,從菜單中選擇“File-New在New對話框的標(biāo)簽中選擇Projects,再選中Win32 Console Application,在Location中選擇路徑,并在Projectname中輸入名字,例如test。VC在指定的路徑自動建立test文件夾。單擊OK,在接下來的對話框中選擇An Empty project,單擊Finish。在左面的列表窗口的下面選擇FileView標(biāo)簽,列出當(dāng)前project中的文件,現(xiàn)在沒有文件在projects中。單擊新建按鈕,在右側(cè)的編輯窗口中輸入?yún)R編源程序,存盤到test目錄下,命名為。在左側(cè)的窗口右擊SourceFiles,出現(xiàn)的快

37、捷菜單中,選擇Add files to projects,在文件選擇對話框里選擇文件,OK,這時,在Source Files下出現(xiàn)的名字。右擊該文件名,出現(xiàn)快捷菜單,選擇setting三,在對話框右邊的Commands內(nèi)輸入ml /c /coff test.asm,Outputs內(nèi)輸入test.obj,單擊Ok,將和復(fù)制到windows目錄。按F7,自動編譯生成test.exe.編譯和連接信息顯示在Output視圖中。接下來可以直接在VC環(huán)境中運行和調(diào)試該程序。方法2:翻開VC+。點取File->New命令,新建一個Workspace,命名如testmak,右擊工作區(qū)名字,選擇參加新工程

38、命令,在工作區(qū)中參加一個makefile工程。該工程文件與工作區(qū)在同一個文件夾中。建立一個make文件參加工程中:LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole3

39、2.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"testmak.pdb" /debug /machine:I386 /out:".testmak.exe" /pdbtype:sept LINK32_OBJS= ".testmak.obj"".testmak.exe" : $(LINK32_OBJS) $(LINK32) << $(LINK32_FLA

40、GS) $(LINK32_OBJS)<<".testmak.obj" : $(SOURCE) <<tempfile.bat << 下面建立一個匯編源文件參加工程文件的源文件夾中:.386.model flat, stdcalloption casemap:noneprintf PROTO C: ptr sbyte, :vararg.dataszMsg byte "hello world!",0ah,0.codestart:invoke printf, offset szMsgretpublic startend sta

41、rt最后設(shè)置可執(zhí)行文件,庫和包含文件的路徑選擇TOOLS->OPTIONS- >DIRECTORIES,在Executable中參加路徑C:MASM615,在Include中參加C:MASM615INCLUDE ;在library的路徑中參加C: MASM615LIB 。如果一切正常,下面就可以選build命令F7,生成你的可執(zhí)行文件了。如果沒有錯誤單擊執(zhí)行按鈕,可以看見執(zhí)行的結(jié)果。在VC中開發(fā)匯編程序建立工程時的設(shè)置工作稍顯繁瑣,但是一旦設(shè)置好后,開發(fā)的四個步驟一氣呵成,在進(jìn)行多模塊設(shè)計的時候,這是一個很好的選擇。附注:本文中的例如程序都與一樣。調(diào)試程序WindbgWinDbg是

42、微軟開發(fā)的免費源碼級圖形界面調(diào)試工具,可以調(diào)試Win32應(yīng)用程序,效勞器應(yīng)用程序調(diào)試和Kernel模式驅(qū)動調(diào)試。本文介紹Windbg在調(diào)試Win32應(yīng)用程序時的常用命令。6、 Windbg的啟動Windbg可以從命令行啟動,啟動命令格式為:windbg -a -g -h -i -k platform port speed -ltext -m -p id -e event -spipe -v -w name -y path -z crashfile filename.ext arguments在WindowsXP/2000操作系統(tǒng)下,可以直接雙擊Windbg圖標(biāo)啟動。7、 翻開應(yīng)用程序被調(diào)試的應(yīng)

43、用程序在匯編和連接時應(yīng)參加調(diào)試信息。匯編時使用參數(shù)/Zi;連接程序使用參數(shù)/debug。開始調(diào)試一個應(yīng)用程序時,首先選擇File菜單下的Open Executable命令,在對話框中選擇可執(zhí)行文件。出現(xiàn)Command 窗口,點擊工具欄按鈕后,在Command 窗口中顯示一組信息,再次點擊按鈕后,在Command 窗口后出現(xiàn)Source窗口。3、顯示存儲單元顯示存儲單元的按鈕是。點擊該按鈕后,出現(xiàn)對話框在Address Expression編輯框中填入要觀察的地址信息。地址信息有兩種常用的輸入方式:1指定內(nèi)存單元地址例如:在Address Expression 中填入0x0040103f,點擊按

44、鈕OK后出現(xiàn)指定地址開始的內(nèi)存單元的內(nèi)容:其中0x0040103F至0x004010BF是Windbg顯示以十六進(jìn)制表示的單元地址,中間用十六進(jìn)制表示每個字節(jié),右邊用ASClI字符表示每個字節(jié)。(2) 通過變量名表示例如:在Address Expression 中填入&b_var1,點擊按鈕OK后出現(xiàn)b_var1開始的內(nèi)存單元的內(nèi)容:其中0x00404000地址是變量b_var1所在的單元。隨著程序的執(zhí)行,相應(yīng)內(nèi)存單元的內(nèi)容會相應(yīng)變化。5、 顯示存放器內(nèi)容顯示存放器內(nèi)容的按鈕是,點擊該按鈕后,出現(xiàn)窗口其中EFL是標(biāo)志存放器內(nèi)容,對應(yīng)每一位判斷標(biāo)志位的值。EA是內(nèi)存尋址方式指示的有效地址

45、。隨著程序的執(zhí)行,存放器的內(nèi)容會相應(yīng)變化。6、 運行程序運行程序按鈕是。從應(yīng)用程序入口地址開始執(zhí)行程序,遇到斷點停止。6.單步執(zhí)行程序,單步執(zhí)行程序有兩種類型:(1) Stepinto 單步執(zhí)行命令,當(dāng)遇到子程序調(diào)用指令時,進(jìn)入子程序內(nèi)部逐條執(zhí)行指令。(2) Step over 單步執(zhí)行命令,當(dāng)遇到子程序調(diào)用指令時,不進(jìn)入子程序內(nèi)部逐條執(zhí)行指令,而把調(diào)用子程序當(dāng)作一條指令執(zhí)行。7.反匯編命令U(Unassemble)該命令執(zhí)行后,出現(xiàn)窗口:窗口中的內(nèi)容從左至右依次是:地址,機(jī)器碼,指令。隨著程序的執(zhí)行,反匯編窗口也隨之變化。8、Watch窗口點擊按鈕后出現(xiàn)空白的Watch窗口:在左邊的一列中輸

46、入變量的名字,右邊顯示變量的值:隨著程序的執(zhí)行,變量的值會相應(yīng)變化。11> 退出Windbg選擇File菜單中的Exit命令,可以退出Windbg。宏匯編命令ML和連接命令LINK常用參數(shù)速查宏匯編命令的命令行格式如下:ML /參數(shù)選項 文件列表 /LINK 連接參數(shù)選項ML允許匯編和連接多個程序形成一個可執(zhí)行文件;它的常用參數(shù)選項如下,注意參數(shù)是大小寫敏感的:/AT允許tiny存儲模式創(chuàng)立一個COM文件/c只匯編源程序,不進(jìn)行自動連接這里是小寫的字母c/Fl 文件名創(chuàng)立一個匯編列表文件擴(kuò)展名LST/Fr 文件名創(chuàng)立一個可在PWB下瀏覽的.SBR源瀏覽文件/Fo 文件名根據(jù)指定的文件名生

47、成模塊文件,而不是采用缺省名/Fe 文件名根據(jù)指定的文件名生成可執(zhí)行文件,而不是采用缺省名/Fm 文件名創(chuàng)立一個連接映象文件擴(kuò)展名MAP/I 路徑名設(shè)置需要包含進(jìn)INCLUDE源程序的文件的所在路徑/Sg在生成的列表文件中,列出由匯編程序產(chǎn)生的指令/Sn在創(chuàng)立列表文件時不產(chǎn)生符號表/Zi生成模塊文件時,參加調(diào)試程序CodeView需要的信息/Zs只進(jìn)行句法檢查,不產(chǎn)生任何代碼/LINK傳遞給連接程序LINK的參數(shù)/nologo展開版權(quán)信息/Bl 連接器名字 使用其它連接器 /Sa 列表文件最大限度展開源碼/Sc 在創(chuàng)立列表文件時參加時間信息/Cp 區(qū)分用戶自定義標(biāo)識符的大小寫 /Sf 生成第一

48、次匯編列表/Cu 所有標(biāo)識符轉(zhuǎn)換為大寫 /Sl<width>設(shè)置行寬/Cx保存PUBLIC 和EXTERN變量的大小寫 /Sn 展開符號表列表/coff生成COFF格式的文件 /Ta 文件名 匯編不是以ASM為擴(kuò)展名的源文件 /WX 警告信息被看作錯誤信息/W<number> 設(shè)置警告級別/Zd 在調(diào)試信息中參加行號/Zf 所有符號成為公有符號/G<c|d|z> 指定語言類型 /Zi 參加符號調(diào)試信息/I<name> 設(shè)置INCLUDE路徑 連接命令LINK.EXE的命令行格式如下:LINK /參數(shù)選項 文件列表LINK連接一個或多個程序形成一個可執(zhí)行文件;它的常用參數(shù)選項如下, /COMMENT:注釋信息參加注釋信息 /DEBUG參加調(diào)試信息 /DEBUGTYPE:CV|COFF指定調(diào)試信息類型 /DEFAULTLIB:library指定默認(rèn)庫文件 /DLL創(chuàng)立DLL文件 /DRIVER:UPONLY|WDM創(chuàng)立驅(qū)動程序 /ENTRY:標(biāo)號設(shè)置程序入口 /EXPORT:symbol定義可以被其他模塊使用的符號 /INCREMENTAL:YES|NO是否為增式連接器 /LIBPATH:dir指定庫文件的路徑 /MAP:filename 映像文件 /OUT:filename定義生成文

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論