日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《汇编语言程序设计》(双语)上机指导

發布時間:2024/3/13 编程问答 86 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《汇编语言程序设计》(双语)上机指导 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

唔。省得每次忘帶U盤。。。

?

?

《匯編語言程序設計》(雙語)上機指導... 1

實驗1 建立windows環境下32位匯編語言開發環境... 2

實驗2? Instruction Format and Addressing Mode. 3

實驗3? Data Operation Programming. 4

實驗4? Branching and Loop Programming. 5

實驗5? Procedure Programming. 7

實驗6? Input/Output Programming. 9

實驗7? Macro Design. 10

實驗8? Mixed Programming. 11

調試程序Windbg. 18

宏匯編命令ML和連接命令LINK常用參數速查... 21

輸入輸出宏命令... 22


實驗1 建立windows環境下32位匯編語言開發環境

?

實驗目的:建立windows環境下32位匯編語言開發環境,并熟悉它的使用方法。

實驗要求: (1)建立windows環境下32位匯編語言開發環境;

????????? ?(2)熟悉自己建立的開發環境的使用方法;

實驗內容: (1)定制masm32集成開發環境,使之符合教學要求。

?????????? (2)分別建立匯編,連接,和匯編&連接批處理命令,能夠生成包含調試信息的目標文件,列表文件,以及能夠進行調試的可執行WIN32控制臺程序。

?????????? ?(3)建立32位匯編語言框架程序。

??????????? (4)在自己建立的開發環境下匯編,連接,運行教材中的fig3-1。

實驗步驟:

1、定制開發環境masm32

修改文件msm32\bin\buildc.bat中的內容,使得執行Project\Console Assemble & Link后能夠匯編連接可調試的32位控制臺應用程序,同時生成列表文件。

匯編命令改為:

\masm32\bin\ml /c /coff /Fl /Zi %1.asm

連接命令改為:

\masm32\bin\link /debug %1.obj

2、在定制后的masm32開發環境中運行教材中的例題fig3-1.

3、利用教材提供的80x86/software在命令行方式下運行例題fig3-1.

4、建立適合在定制開發環境下使用的32位應用程序框架

參考:

.386????????????????? ;必須是第一條非注釋語句,說明這是一個32位應用程序

?????????? .model flat, stdcall? ;定義程序的存儲模式(32位應用程序中必須采用flat)

?????????? include \masm32\include\io32.inc ;可選,如果在程序中使用作者自定義的宏命令需要這一句

????? ????? .stack 4096?????????? ;定義堆棧段

?????????? .data???????????????? ;定義數據段

?????????? ……????????????????? ;數據定義

?????????? .code???????????????? ;定義代碼段

?????????? start:??????????????? ;程序起始點

?????????? ……????????????????? ;程序代碼

?????????? ret? ??;程序結束點,返回WINDOWS

?????????? ……????????????????? ;子程序代碼

?????????? end start???????????? ;匯編結束

5、在自己建立的開發環境下實現教材中P59. Programming Exercises 3.3中第3題。

實驗要求:完成實驗報告。在實驗報告中完成下列內容:

(1)寫出你自己的32位應用程序框架,并說明如何匯編,連接生成可執行文件。

(2)寫出實驗步驟5中程序的完整源代碼。

?


?

實驗2 ?Instruction Format and Addressing Mode

實驗目的:熟悉匯編語言指令格式,掌握常用數據定義偽指令,理解各種尋址方式的應用。掌握調試工具Windbg.exe的使用。

實驗要求: (1)通過調試程序理解常用數據定義偽指令的作用。

????????? ?(2)通過調試程序理解各種尋址方式的應用。

????????? ?(3)熟練掌握調試工具Windbg的使用方法。

實驗內容:(1)上機匯編連接fig3-1,生成并觀察列表文件;用調試工具Windbg單步執行程序,觀察寄存器和內存的變化。

(2)編寫程序完成教材中P72. Exercises3.5。用Windbg觀察內存的分配情況。

實驗步驟:

1、??? 上機匯編連接fig3.1

(1)?????? 查看列表文件。根據列表文件畫出數據段中數據的分配情況。

(2)?????? 用Windbg調試fig3-1。用memory窗口察看prompt1開始的內存空間,并記錄下來。

(3)?????? 對比源程序中的數據定義,列表文件的數據分配和在Windbg中記錄的數據,理解數據定義偽指令的作用。

2、??? 用Windbg調試fig3-1,用Disassembly窗口察看指令的機器碼。

3、??? 用Windbg單步執行fig3-1,觀察每一條指令的執行結果。

4、??? 上機編寫完整的源程序加入教材中P72. Exercises3.5中的數據定義,匯編連接后,用Windbg觀察內存分配的情況。

實驗要求:完成實驗報告,回答下面的問題:

1、? 要使程序能在windbg中調試,執行匯編和連接命令時,需要使用什么參數?

2、? Fig3-1.exe中執行指令input string, 40時,用戶如果輸入123, 該指令的執行結果是什么?atod string指令執行后的結果是什么?

3、? 寫出P72. Exercises3.5中1,3,5,7,10,12,15,17,23,32定義的內存空間的值。

4、? 寫出下列指令的尋址方式和機器碼:

(1)?????? add eax, number1

(2)?????? mov number1, eax

(3)?????? mov eax, 100

(4)?????? mov ebx, offset number1

add eax, [ebx]

?


?

實驗3? Data Operation Programming

實驗目的:熟練掌握基本的數據傳送指令,算術運算指令和位操作指令在編程中的應用。

實驗要求:按照要求編寫程序,調試運行。

實驗內容:

1、? 完成教材P107. Programming Exercises 4.2中第2題。Write a complete 80x86 assembly language program to prompt for values of x,y,and z and display the value of expression 2(-x+y-1)+z. Allow for 32-bit integer values.

2、? 完成教材P117. Programming Exercises 4.3中第3題。Suppose that someone has a certain number of coins(pennies, nickels,dimes,quarters,fifty-cent pieces, and dollar coins) and wants to know the total value of the coins, as well as how many coins there are. Write a program to help.

3、? 完成教材P129. Programming Exercises 4.4中第4題和第5題。

a)???????? Write a complete 80x86 assembly language program to prompt for four pairs of grades and weighting factors. Each weighting factor indicates how many times the corresponding grade is to be counted in the sum. The weighted sum is: WeightedSum=Grade1*Weight1+ Grade2*Weight2+ Grade3*Weight3+ Grade4*Weight4 and the sum of the weight is: SumWeights=Weight1+Weight2+Weight3+Weight4. Display the weighted sum, the sum of the weights and the weighted average(WeightedSum/SumofWeights).

b)??????? Write a complete 80x86 assembly language program to prompt for four grades , and then display the sum and the average of the grades in ddddd format.

4、? 編寫代碼實現下面的功能:無符號兩位十進制字符串轉換為對應的二進制數存入AL

5、? 編寫代碼實現下面的功能:將AL中的數值(0-99)轉換為無符號十進制數字符串。

6、? 編寫代碼實現下面的功能:將兩位的十六進制字符串(0-9)轉換為對應的二進制數存入AL

7、? 編寫代碼實現下面的功能:將AL中的數值轉換為對應的兩位十六進制字符串。

實驗要求:提交試驗內容1-3源程序,完成實驗報告。實驗報告中要求寫出實現實驗內容4,5,6,7的關鍵代碼。

?


?

實驗4? Branching and Loop Programming

實驗目的:熟練掌握分支和循環結構的設計方法,熟悉跳轉和循環指令的使用方法。

實驗要求:按照要求編寫程序,調試運行。

實驗內容:

1、 編寫程序實現下面的算法:

if

then

lowerCount+1;

else

if(ch≥’A’) and (ch≤’Z’)

then

upperCount+1

else

otherCount+1;

endif

endif

其中ch調用ReadChar輸入,lowerCount, upperCount和otherCount的值用WriteUDecByte顯示。

2、 編寫程序從鍵盤輸入一系列有符號數,找出其中的最大數和最小數,顯示運行結果。建議算法如下:

顯示 “First number?”;

調用ReadSDecDword輸入雙字有符號數;

minimum:=number;

maximum:=number;

while(顯示 “Another number?(Y or N)”)loop

if (輸入Y) then

調用ReadSDecDword輸入雙字有符號數;

if(number<minimum)

then

minimum:=number;

endif

if(number>maximum)

then

maximum:=number;

endif

endwhile

3-6題中任選一題:

3、編寫程序將EAX的內容轉換為二進制字符串

4、編寫程序將EAX的內容轉換為十六進制字符串

5、編寫程序將EAX的內容轉換為無符號十進制字符串

6、編寫程序將EAX的內容轉換為有符號十進制字符串,負數字符串以“-“引導。

7-10題中任選一題:

7、編寫程序將二進制字符串表示的數據存入EAX寄存器

8、編寫程序將十六進制字符串表示的數據存入EAX寄存器

9、編寫程序將十進制字符串表示的無符號數據存入EAX寄存器

10、編寫程序將十進制字符串表示的有符號數據存入EAX寄存器

實驗要求:提交實驗內容1,2的源程序,完成實驗報告,實驗報告中給出3-6題中任一題的關鍵代碼,7-10題中任意一題的關鍵代碼。


?

實驗5? Procedure Programming

實驗目的:理解堆棧的工作原理,熟練掌握子程序的設計方法,熟悉子程序相關指令的使用方法。

實驗要求:按照要求編寫程序,調試運行。

實驗內容:

1、? 上機調試下面的代碼,單步執行,觀察ESP寄存器和EIP寄存器內容的變化情況。觀察esp指示的內存單元的內容。畫出堆棧的變化過程,標注ESP寄存器的變化情況。

.386????????????????? ;必須是第一條非注釋語句,說明這是一個32位應用程序

?????????? .model flat, stdcall? ;定義程序的存儲模式(32位應用程序中必須采用flat)

?????????? .code???????????????? ;定義代碼段

?????????? start:??????????????? ;程序起始點

?????? push 100

?????????? call subproc;程序代碼

?????????? pop eax

?????????? ret? ??;程序結束點,返回WINDOWS

?????????? subproc proc

ret

?????? subproc endp

?????????? end start???????????? ;匯編結束

2、編寫完整的32位應用程序:設計子程序完成下面的功能, 在主程序中先調用ReadUDec輸入數據,然后調用自己編寫的子程序,將輸入的數據轉換為對應的可顯示字符串的形式,最后調用WriteString顯示轉換后的字符串。要求完成的子程序可以在(1)-(4)中任選一題,(5)-(8)中任選一題。

(1)編寫子程序將EAX的內容轉換為二進制字符串

(2)編寫子程序將雙字補碼轉換為十六進制字符串

(3)編寫子程序將EAX的內容轉換為無符號十進制字符串

(4)編寫子程序將雙字補碼轉換為有符號十進制字符串,負數字符串以“-“引導。

(5)編寫子程序將二進制字符串表示的數據存入EAX寄存器

(6)編寫子程序將十六進制字符串表示的數據存入EAX寄存器

(7)編寫子程序將十進制字符串表示的無符號數據存入EAX寄存器

(8)編寫子程序將十進制字符串表示的有符號數據存入EAX寄存器

3、利用多模塊設計方法實現上面程序的功能,建立子程序庫,并編寫主程序調用子程序庫中的函數。

提示:? (1) 編寫子程序模塊完成上題中的子程序功能,匯編生成目標文件。

(2)??? 將子程序目標文件組成庫文件:
\masm32\bin\lib 目標文件名 /out:庫文件名

或者\masm32\bin\link? -lib 目標文件名 /out:庫文件名

(3)??? 編寫主程序模塊: extern聲明外部子程序,用includelib包含前面生成的庫文件,在主程序中先調用ReadUDec輸入數據,然后調用自己編寫的子程序,將輸入的數據轉換為對應的可顯示字符串的形式,最后調用WriteString顯示轉換后的字符串。匯編連接生成可執行文件。

實驗要求:提交實驗內容3的源程序,并在實驗報告中說明子程序庫的開發過程,以及可執行程序的執行結果;實驗報告中給出實驗內容3中子程序源代碼(可以在(1)-(4)中任選一題,(5)-(8)中任選一題。)

?


?

實驗6? Input/Output Programming

實驗目的:熟練掌握實現實模式和保護模式下鍵盤輸入和屏幕顯示功能的程序設計方法。

實驗要求:按照要求編寫程序,調試運行。

實驗內容:

1、編寫實模式應用程序:利用IN/OUT指令讀寫CMOS時鐘,顯示當前的日期和時間。

2、編寫實模式應用程序:利用IN/OUT指令編寫簡單的音樂程序。運行時,當用戶按下按鍵1-7,分別演奏音調douremifasolasi

3、編寫完整的16位應用程序:設計子程序完成下面的功能, 在主程序中先調用輸入字符串的子程序,將字符串中所有英文字符變為大寫,其他字符不變。最后調用輸出字符串的子程序,顯示原始字符串和轉換后的字符串。

(1) 編寫實模式子程序利用系統調用完成鍵盤輸入一個字符。

(2) 編寫實模式子程序利用系統調用完成屏幕顯示一個字符。

(3) 編寫實模式子程序利用系統調用完成鍵盤輸入一個字符串。

(4) 編寫實模式子程序利用系統調用完成屏幕顯示一個字符串。

4、編寫完整的32位應用程序:設計子程序完成下面的功能, 在主程序中先調用輸入字符串的子程序,將字符串中的字符逆序排序生成新的字符串。最后調用輸出字符串的子程序,顯示原始字符串和轉換后的字符串。編寫保護模式子程序利用系統調用完成鍵盤輸入一個字符。

(1) 編寫保護模式子程序利用系統調用完成鍵盤輸入一個字符。

(2) 編寫保護模式子程序利用系統調用完成屏幕顯示一個字符。

(3) 編寫保護模式子程序利用系統調用完成鍵盤輸入一個字符串。

(4) 編寫保護模式子程序利用系統調用完成屏幕顯示一個字符串。

實驗要求:提交第2題源程序;在實驗報告中給出第33)和(4)題和第43)和(4)題的關鍵代碼。


?

實驗7? Macro Design

實驗目的:熟練宏的使用方法。

實驗要求:按照要求編寫程序,調試運行。

實驗內容:

1、編寫完整的32位應用程序:先定義下面的宏,然后在程序中調用宏,生成列表文件。根據列表文件寫出宏擴展后的結果。

(1) 定義Move32宏接收兩個內存操作數,把源操作數送到目的操作數。

(2) 定義Mult32宏接收兩個內存操作數,將他們相乘產生一個32位的乘積。

2、? 編寫一個ReadUdec的宏,從標準輸入上讀取一個8位,16位或32位的無符號整數,并在給定的參數中返回。使用條件操作符允許宏能夠處理不同大小的輸入參數。寫一個程序調用宏并傳遞不同尺寸的操作數。

3、? 編寫一個WriteUdec的宏,通過調用顯示無符號數的功能在標準輸出上顯示一個無符號數。傳遞給宏的參數可以是一個字節、字或雙字,在宏內使用條件操作符以便能適應不同尺寸的參數。寫一個程序調用宏,并傳遞給宏不同尺寸的參數。

實驗要求:提交123源程序,在實驗報告中寫出它們的宏定義方法和宏調用方法。

實驗8 ?Mixed Programming

實驗目的:熟練掌握匯編語言與VC++的混合編程的方法。

實驗要求:按照要求編寫程序,調試運行。

實驗內容:

1.???????? 編寫一個C++程序通過調用匯編子程序實現的功能。

提示:在C程序中輸入兩個整數,然后調用匯編子程序對這兩個數求積,在主程序中打印計算結果。編程并上機調試通過。

2.???????? 編寫程序,在匯編程序中初始化varA12varB6,調用C語言的子程序求積并打印計算結果。編程并上機調試通過。

3.???????? 將排序子程序改寫成C語言的嵌入式匯編函數;然后編寫一個C語言主程序,提供待排序的數據和顯示排序后的結果。

4.???????? 將排序子程序改寫成可供C語言調用的模塊;然后編寫一個C語言主程序,提供待排序的數據和顯示排序后的結果。

5.???????? 編寫識別CPU的匯編語言過程,供Visual C++6.0調用的形式,然后編寫一個Visual C++主程序,并上機調試通過。

實驗要求:完成實驗報告,在實驗報告中寫出134的關鍵代碼,并寫出運行結果
附錄:

Windows環境下32位匯編語言開發環境的建立

在Windows環境下進行匯編語言程序設計之前,首先需要搭建一個匯編語言的開發環境。現在匯編語言開發工具包常見的是MASM,TASM和NASM。MASM是微軟開發的宏匯編工具,適合在Windows環境下進行程序設計,性能穩定,持續升級;NASM的語法與MASM略有不同,它可以在不同的環境下使用,LINUX或Windows。鑒于目前匯編語言程序設計教學中更多的選擇了MASM,本文將介紹基于MASM的32位匯編開發環境的幾種搭建方法。其他匯編工具的具體內容可參考相關的手冊。

?

匯編語言的開發分為源代碼編輯,匯編和連接三個步驟,在必要的時候還需要對程序進行調試。因此匯編語言開發環境中應包含編輯軟件,匯編軟件,連接軟件和調試軟件。如果將這些軟件集成在一起就是構成一個集成開發環境。

?

一、命令行環境

首先下載一個MASM615開發工具包。在許多匯編網站和匯編教材的配套光盤中都提供了該工具包。根據提示,進行安裝。然后就可以用它來開發匯編程序。

?

(1)源代碼編輯

匯編源程序是純文本文件,其擴展名為.asm,可以用任何一種文本編輯軟件來編寫匯編原代碼。比如EditPlus,UltraEdit,NotePad,Word, VC++等,注意文件保存的時候必須以純文本格式保存,并取.asm后綴名。

(2)匯編

源文件不能直接被機器執行,需要運行匯編軟件對它進行匯編生成目標文件,后綴為.obj.,這是一個二進制文件。如果出現語法錯誤,匯編程序會產生錯誤報告,程序員可以根據這些錯誤報告對源程序進行重新編輯,重新匯編,直到沒有語法錯誤為止。

MASM匯編器的命令是ml.exe,其命令行格式為:

Ml [/option] 源文件 [/link option]

生成32位應用程序時,常用的命令行是:

ML /coff /c /Fl /Zi filename;

例如,要匯編test.asm源文件,生成coff格式的目標文件,列表文件和調試信息,可以使用命令行:

ML /coff /c /Fl /Zi test.asm;

為了避免每次匯編源文件的時候都要輸入許多參數,可以建立一個批處理文件。例如批處理文件mlbat.bat

?

@echo off

?

if exist "%1.obj" del "%1.obj"

if exist "%1.exe" del "%1.exe"

?

path\ml /c /coff /Fl? /Zi "%1.asm"

if errorlevel 1 goto errasm

:errasm

echo _

echo Assembly Error

goto TheEnd

?

:TheEnd

?

pause

?

有了這個批處理文件以后,如果匯編test.asm,就可以用命令:

mlbat test

在建立自己批處理文件的時候,可以根據需要設定參數,指定路徑。

(3)連接

目標文件仍然不能執行,還需要運行連接程序,將目標文件和庫文件連接起來,才能生成最后可以執行的.exe文件。

生成可執行文件的工具叫做連接器。在前面提到的匯編語言開發工具包中都包含有連接器link.需要注意的是,連接器有兩種:一種是16位連接器(Segmented Executable Linker),用于生成DOS程序,一種是32位連接器,可以生成Win32PE文件(Incremental Linker),如果要生成32位應用程序需要使用后者。在MASM8和VC中提供有32位連接程序。一般來說,在開發工具包中用link16和link32分別表示16位和32位連接軟件。

連接器的命令行用法為:

LINK [option] filename

生成windows控制臺程序的常用命令是:

LINK /subsystem: console /DEBUG filename

生成windows程序的常用命令是:

LINK /subsystem: windows /DEBUG filename

參數/DEBUG是為方便調試而設置的。

例如,將前面生成的目標文件test.obj連接生成控制臺程序test.exe所用的命令行是:

LINK /subsystem:console /DEBUG test.obj

?

為了避免每次連接的時候都要輸入許多參數,同樣也可以建立一個批處理文件。例如批處理文件linkbat.bat

?

@echo off

?

if not exist “%1.obj goto errlink

?

path\Link /SUBSYSTEM:CONSOLE /OPT:NOREF /DEBUG "%1.obj"

if errorlevel 1 goto errlink

:errlink

echo _

echo link Error

goto TheEnd

?

:TheEnd

?

pause

?

此時,對test.obj連接,可以用命令:

linkbat test

在建立自己批處理文件的時候,可以根據需要設定參數,指定路徑。

如果建立一個類似VC里build的命令,就可以執行一個命令對原程序進行匯編和連接。下面的批處理文件buildc.bat執行的就是先匯編再連接的功能:

REM? buildc.bat

?

@echo off

?

if exist "%1.obj" del "%1.obj"

if exist "%1.exe" del "%1.exe"

?

path\ml /c /coff "%1.asm"

if errorlevel 1 goto errasm

?

path\Link /SUBSYSTEM:CONSOLE /OPT:NOREF "%1.obj"

if errorlevel 1 goto errlink

dir "%1.*"

goto TheEnd

?

:errlink

echo _

echo Link error

goto TheEnd

?

:errasm

echo _

echo Assembly Error

goto TheEnd

?

:TheEnd

?

pause

?

執行命令:buildc test

就會對test.asm進行匯編,并生成windows控制臺程序test.exe.

(4)調試

生成的.exe文件執行后完成的功能如果與預想的功能不相符,說明程序編寫出現了邏輯錯誤,程序員需要對原程序進行檢查,找出錯誤。檢查邏輯錯誤可以閱讀原程序,通過分析邏輯算法找出錯誤;也可以在程序中適當的位置添加輸出語句,顯示中間結果來發現錯誤,還可以利用調試軟件,跟蹤程序的執行,動態調試程序從而發現錯誤。

調試器有兩大類,用戶模式和內核模式。用戶模式的調試器用于調試用戶模式的應用程序,工作在Ring3級,如vc自帶的調試器和Windbg;內核模式的調試器則可以調試操作系統內核,處于CPU和操作系統之間,工作在Ring0級,如SoftICE, OLLYDBG, trw2000。關于調試器的使用方法,將在另外的文章中討論。

?

二、集成開發環境

開發一個匯編程序需要經過上述四步才能生成正確的可執行文件。程序員可以下載安裝匯編語言開發工具包,然后就可以進行程序開發。如果需要更加方便的執行匯編和連接的步驟,建議自己建立批處理文件,避免每次命令行輸入許多參數。也可以使用集成開發環境將上述步驟放在一個界面下方便的完成。WINDOWS環境下常用的集成開發環境有MASM32和Visual C++,VisualAsm,PASS32,GASM。下面介紹MASM32和Visual C++的在開發匯編語言程序時的用法。

1、? MASM32

MASM32是Windows環境下的窗口應用程序,集成了微軟的MASM工具,包含豐富的庫函數和宏文件以及相應的聯機幫助,用戶界面友好,可以很方便的進行WINDOWS下匯編程序的開發,基本不需要進行額外的設置。

下載安裝MASM32之后,將Qeditor圖標拖到桌面上以方便以后的使用。

單擊Qeditor圖標啟動MASM32,在主窗口中輸入源代碼,選擇File/Save保存文件。然后再選擇Project菜單下的命令進行匯編和連接。該菜單中主要使用的命令有:

Assemble ASM file:匯編生成32位應用程序,對應的批處理文件是masm32\bin\assembl.bat.

Link OBJ file : masm32\bin\lnk.bat

ASSEMBLE & link : BUILD.BAT

BLDALL:BUILDALL.BAT

Link OBJ file : masm32\bin\lnkC.bat

ASSEMBLE & link : BUILDC.BAT

BLDALL:BUILDALLC.BAT

這些批處理文件的內容都與前面所講的匯編和連接批處理的內容類似,讀者可以根據需要修改這些命令。

MASM32將編輯,匯編和連接很好的結合在一起,對于windows圖形界面的變成也非常方便,它提供了一個資源編輯器。窗口應用程序可以在該環境中直接運行,但是控制臺程序則需要啟動命令行方式窗口運行。

2、? Visual C++ 6.0

VC是微軟開發的C++ 6.0的集成開發環境,在安裝了MASM615之后,也可以用作匯編語言程序開發的集成環境。有兩種方法可以用VC來開發匯編程序。

方法1:

啟動VC++后,從菜單中選擇“File”-〉New

在New對話框的標簽中選擇Projects,再選中Win32 Console Application,在Location中選擇路徑,并在Projectname中輸入名字,例如test。VC在指定的路徑自動建立test文件夾。

單擊OK,在接下來的對話框中選擇An Empty project,單擊Finish。

在左面的列表窗口的下面選擇FileView標簽,列出當前project中的文件,現在沒有文件在projects中。

單擊新建按鈕,在右側的編輯窗口中輸入匯編源程序,存盤到test目錄下,命名為test.asm。

在左側的窗口右擊SourceFiles,出現的快捷菜單中,選擇Add files to projects,在文件選擇對話框里選擇文件test.asm,OK,這時,在Source Files下出現test.asm的名字。右擊該文件名,出現快捷菜單,選擇setting三,在對話框右邊的Commands內輸入ml /c /coff test.asm,Outputs內輸入test.obj,單擊Ok,將ML.exe和ml.err復制到windows目錄。按F7,自動編譯生成test.exe.

編譯和連接信息顯示在Output視圖中。接下來可以直接在VC環境中運行和調試該程序。

方法2

打開VC++。點取File->New命令,新建一個Workspace,命名如testmak,右擊工作區名字,選擇加入新工程命令,在工作區中加入一個makefile工程。該工程文件與工作區在同一個文件夾中。

建立一個make文件testmak.mak加入工程中:

?

LINK32=link.exe

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 ole32.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_FLAGS) $(LINK32_OBJS)

<<?

?

SOURCE=.\testmak.asm

?

?

InputPath=.\testmak.asm

?

".\testmak.obj" : $(SOURCE)?

??? <<tempfile.bat

?

??? ml /c /coff /Zi testmak.asm

<<

???

下面建立一個匯編源文件testmak.asm加入工程文件的源文件夾中:

?

.386

.model flat, stdcall

option casemap:none

includelib msvcrt.lib

printf PROTO C: ptr sbyte, :vararg

?

.data

szMsg byte "hello world!",0ah,0

.code

start:

invoke printf, offset szMsg

ret

public start

end start

?

最后設置可執行文件,庫和包含文件的路徑選擇TOOLS->OPTIONS- >DIRECTORIES,在Executable中加入路徑C:\MASM615,在Include中加入C:\MASM615\INCLUDE ;在library的路徑中加入C: \MASM615\LIB

如果一切正常,下面就可以選build命令F7,生成你的可執行文件了。如果沒有錯誤單擊執行按鈕,可以看見執行的結果。

?

在VC中開發匯編程序建立工程時的設置工作稍顯繁瑣,但是一旦設置好后,開發的四個步驟一氣呵成,在進行多模塊設計的時候,這是一個很好的選擇。

(附注:本文中的示例程序都與testmak.asm一樣。)


調試程序Windbg

WinDbg是微軟開發的免費源碼級圖形界面調試工具,可以調試Win32應用程序,服務器應用程序調試和Kernel模式驅動調試。本文介紹Windbg在調試Win32應用程序時的常用命令。

1、 Windbg的啟動

Windbg可以從命令行啟動,啟動命令格式為:

windbg [-a] [-g] [-h] [-i] [-k [platform port speed]] [-l[text]]

[-m] [-p id [-e event]] [-s[pipe]] [-v] [-w name] [-y path]

[-z crashfile] [filename[.ext] [arguments]]

在WindowsXP/2000操作系統下,可以直接雙擊Windbg圖標啟動。

2、 打開應用程序

被調試的應用程序在匯編和連接時應加入調試信息。匯編時使用參數/Zi;連接程序使用參數/debug。

開始調試一個應用程序時,首先選擇File菜單下的Open Executable命令,在對話框中選擇可執行文件。出現Command 窗口,點擊工具欄按鈕后,在Command 窗口中顯示一組信息,再次點擊按鈕后,在Command 窗口后出現Source窗口。

3、顯示存儲單元

顯示存儲單元的按鈕是。點擊該按鈕后,出現對話框

在Address Expression編輯框中填入要察看的地址信息。地址信息有兩種常用的輸入方式:

(1)指定內存單元地址

例如:在Address Expression 中填入0x0040103f,點擊按鈕OK后出現指定地址開始的內存單元的內容:

其中0x0040103F至0x004010BF是Windbg顯示以十六進制表示的單元地址,中間用十六進制表示每個字節,右邊用ASClI字符表示每個字節。

(2)????? 通過變量名表示

例如:在Address Expression 中填入&b_var1,點擊按鈕OK后出現b_var1開始的內存單元的內容:

其中0x00404000地址是變量b_var1所在的單元。

隨著程序的執行,相應內存單元的內容會相應變化。

4、 顯示寄存器內容

顯示寄存器內容的按鈕是,點擊該按鈕后,出現窗口

其中EFL是標志寄存器內容,對應每一位判斷標志位的值。EA是內存尋址方式指示的有效地址。

隨著程序的執行,寄存器的內容會相應變化。

5、 運行程序

運行程序按鈕是。從應用程序入口地址開始執行程序,遇到斷點停止。

6.單步執行程序,

單步執行程序有兩種類型:

(1)????? Stepinto

單步執行命令,當遇到子程序調用指令時,進入子程序內部逐條執行指令。

(2)????? Step over

單步執行命令,當遇到子程序調用指令時,不進入子程序內部逐條執行指令,而把調用子程序當作一條指令執行。

7.反匯編命令U(Unassemble)

該命令執行后,出現窗口:

窗口中的內容從左至右依次是:地址,機器碼,指令。隨著程序的執行,反匯編窗口也隨之變化。

8、Watch窗口

點擊按鈕后出現空白的Watch窗口:

在左邊的一列中輸入變量的名字,右邊顯示變量的值:

隨著程序的執行,變量的值會相應變化。

11> 退出Windbg

選擇File菜單中的Exit命令,可以退出Windbg。


宏匯編命令ML和連接命令LINK常用參數速查

宏匯編命令ML.EXE的命令行格式如下:

??????? ML [/參數選項] 文件列表 [/LINK 連接參數選項]

ML允許匯編和連接多個程序形成一個可執行文件;它的常用參數選項如下,注意參數是大小寫敏感的):

/AT——允許tiny存儲模式(創建一個COM文件)

/c——只匯編源程序,不進行自動連接(這里是小寫的字母c)

/Fl 文件名——創建一個匯編列表文件(擴展名LST)

/Fr 文件名——創建一個可在PWB下瀏覽的.SBR源瀏覽文件

/Fo 文件名——根據指定的文件名生成模塊文件,而不是采用缺省名

/Fe 文件名——根據指定的文件名生成可執行文件,而不是采用缺省名

/Fm 文件名——創建一個連接映象文件(擴展名MAP)

/I 路徑名——設置需要包含進(INCLUDE)源程序的文件的所在路徑

/Sg——在生成的列表文件中,列出由匯編程序產生的指令

/Sn——在創建列表文件時不產生符號表

/Zi——生成模塊文件時,加入調試程序CodeView需要的信息

/Zs——只進行句法檢查,不產生任何代碼

/LINK——傳遞給連接程序LINK的參數

/nologo——展開版權信息

/Bl ——連接器名字—— 使用其它連接器

/Sa—— 列表文件最大限度展開源碼

/Sc—— 在創建列表文件時加入時間信息

/Cp—— 區分用戶自定義標識符的大小寫?

/Sf—— 生成第一次匯編列表

/Cu ——所有標識符轉換為大寫

/Sl<width>——設置行寬

/Cx——保留PUBLIC 和EXTERN變量的大小寫

/Sn—— 展開符號表列表

/coff——生成COFF格式的文件?

/Ta 文件名 ——匯編不是以ASM為擴展名的源文件

/WX ——警告信息被看作錯誤信息

/W——<number> 設置警告級別

/Zd ——在調試信息中加入行號

/Zf ——所有符號成為公有符號

/G<c|d|z> ——指定語言類型

/Zi ——加入符號調試信息

/I<name>—— 設置INCLUDE路徑

?

連接命令LINK.EXE的命令行格式如下:

??????? LINK [/參數選項] 文件列表

LINK連接一個或多個程序形成一個可執行文件;它的常用參數選項如下,

????? /COMMENT:注釋信息——加入注釋信息

????? /DEBUG——加入調試信息

????? /DEBUGTYPE:{CV|COFF}——指定調試信息類型

????? /DEFAULTLIB:library——指定默認庫文件

????? /DLL——創建DLL文件

????? /DRIVER[:{UPONLY|WDM}]——創建驅動程序

????? /ENTRY:標號——設置程序入口

????? /EXPORT:symbol——定義可以被其他模塊使用的符號

????? /INCREMENTAL:{YES|NO}——是否為增式連接器

????? /LIBPATH:dir——指定庫文件的路徑

????? /MAP[:filename] ——映像文件

????? /OUT:filename——定義生成文件名

???? ?/SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}——指定操作系統類型

?????

輸入輸出宏命令

本表中所列出的宏命令是作者自己定義的輸入輸出宏,它們的定義在文件io16.inc和io32.inc中。如果在實模式的應用程序中,加入INCLUDE io16.inc才可以使用這些宏;如果在保護模式的32位應用程序中,加入INCLUDE io32.inc才可以使用這些宏。

?

宏命令

格式

功能

ReadBinByte

ReadBinByte b_var

讀入二進制字節數據存放到字節類型參數b_var

ReadBinWord

ReadBinWord w_var

讀入二進制字數據存放到字類型參數w_var

ReadBinDword

ReadBinDword d_var

讀入二進制雙字數據存放到雙字類型參數d_var

ReadHexByte

ReadHexByte d_var

讀入十六進制雙字數據存放到雙字類型參數d_var

ReadHexWord

ReadHexWord w_var

讀入十六進制字數據存放到字類型參數w_var

ReadHexDword

ReadHexDword b_var

讀入十六進制字節數據存放到字節類型參數b_var

ReadUDecByte

ReadUDecByte b_var

讀入無符號十進制字節數據存放到字節類型參數b_var

ReadUDecWord

ReadUDecWord w_var

讀入無符號十進制字數據存放到字類型參數w_var

ReadUDecDword

ReadUDecDword d_var

讀入無符號十進制雙字數據存放到雙字類型參數d_var

ReadSDecByte

ReadSDecByte b_var

讀入有符號十進制字節數據存放到字節類型參數b_var

ReadSDecWord

ReadSDecWord w_var

讀入有符號十進制字數據存放到字類型參數w_var

ReadSDecDword

ReadSDecDword d_var

讀入有符號十進制雙字數據存放到雙字類型參數d_var

ReadChar

ReadChar char

讀入字符,其ASCII碼存放到字節類型參數char

ReadString

ReadString buffer

讀入字符串,字符串輸入以回車結束,輸入的字符串存放到buffer指向的內存空間。

WriteString

WriteString string

顯示以0結尾的字符串string.字符串的長度不超過128

WriteBinByte

WriteBinByte? b_var

顯示二進制字節數據b_var

WriteBinWord

WriteBinWord? w_var

顯示二進制字數據w_var

WriteBinDword

WriteBinDword? d_var

顯示二進制雙字數據d_var

WriteHexByte

WriteHexByte? b_var

顯示十六進制字節數據b_var

WriteHexWord

WriteHexWord? w_var

顯示十六進制字數據w_var

WriteHexDword

WriteHexDword? d_var

顯示十六進制雙字數據d_var

WriteUDecByte

WriteUDecByte? b_var

顯示無符號十進制字節數據b_var

WriteUDecWord

WriteUDecWord? w_var

顯示無符號十進制字數據w_var

WriteUDecDword

WriteUDecDword? d_var

顯示無符號十進制雙字數據d_var

WriteSDecByte

WriteSDecByte? b_var

顯示有符號十進制字節數據b_var

WriteSDecWord

WriteSDecWord? w_var

顯示有符號十進制字數據w_var

WriteSDecDword

WriteSDecDword d_var

顯示有符號十進制雙字數據d_var

WriteChar

WriteChar char

顯示字符char

?

?

影子妞加油~

=S=

總結

以上是生活随笔為你收集整理的《汇编语言程序设计》(双语)上机指导的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。