Intel汇编语言程序设计学习-第三章 汇编语言基础-中
3.2 ?例子:整數(shù)相加減
? ? 現(xiàn)在來看一個進行整數(shù)加減操作的匯編語言小程序。寄存器用于存放中間數(shù)據(jù),我們調(diào)用一個庫函數(shù)在屏幕上顯示寄存器的內(nèi)容。下面是程序的源碼:
TITLE Add and Subtract (AddSub.asm) ;This program adds and subtracts 32-bit integers. INCLUDE Irvine32.inc .code main PROC mov eax,10000h ;EAX = 10000h add eax,40000h ;EAX = 50000h sub eax,20000h ;EAX = 30000h call DumpRegs ;display registers exit main ENDP END main
? ? 執(zhí)行結果(我用vs2012+MASM32執(zhí)行的)
?
? ? 現(xiàn)在來解釋上面代碼:
TITLE Add and Subtract (AddSub.asm) ??TITLE偽指令將整行標為注釋,該行可放置任何東西。
;This program adds and subtracts 32-bit integers.??編譯器忽略分號右邊的所有文本。
INCLUDE Irvine32.inc ??INCLUDE偽指令從Irvine32.inc文件中復制必須的定義和設置信息,Irvine32.inc在匯編器的INCLUDE目錄中。
.code ??.code偽指令用來標記代碼段的開始,代碼段中存放程序中的所有可執(zhí)行語句。
Main PROC ?PROC偽指令用來標示一個過程的開始,我們?yōu)槌绦蛑形ㄒ坏倪^程選擇的名字是main.
Mov eax,10000h ?MOV指令把整數(shù)10000h送(復制)到EAX寄存器。第一個操作數(shù)(EAX)稱為目的操作數(shù),第二個操作數(shù)稱為源操作數(shù)。
add eax,40000h ?ADD指令將40000h加到EAX寄存器上。
sub eax,20000h ?SUB指令從EAX寄存器中減掉20000h。
CALL調(diào)用一個現(xiàn)實CPU寄存器值的過程,這是正式程序正確運行的一種有效方法。
exit
main ENDP exit語句(間接)調(diào)用一個預定義的MS-Windows函數(shù)來終止程序。ENDP偽指令標記main過程的結束。注意,exit并不是MASM的關鍵字,而是Irvine32.inc中定義的命令,它提供了一種結束程序的簡便方法。
END main
END 偽指令表明該行是匯編程序的最后一行。編譯器將忽略該行后面的所有內(nèi)容。其后的標示符main是程序啟動過程(即程序啟動時執(zhí)行的子程序,或程序入口點)的名字。
? ? 段:程序是以段組織的,常見的段有代碼段、數(shù)據(jù)段和堆棧段等。代碼段包含程序的全部可執(zhí)行指令,通常代碼段中包含一個活多個過程,其中一個是啟動過程。在AddSub程序中,main就是啟動過程。堆棧段用于存放過程的參數(shù)和局部變量,數(shù)據(jù)段則用于存放變量。
? ? 編碼風格:由于匯編語言是大小寫不敏感的(默認情況下),因此就源代碼的大小寫而言,沒有固定的規(guī)則,單位了增強可讀性,應該再代碼中一致地使用大小寫及標示符命名。
3.2.1 ?AddSub的另一個版本
? ? AddSub程序使用了Irvine32.inc文件,該文件隱藏了一些實現(xiàn)細節(jié)。也許最終你能夠理解Irvine32.inc中所有東西,不過現(xiàn)在我們才剛剛開始學習匯編語言,所以有必要不依賴于它來一發(fā)上面那個AddSub的程序,粗體字用于標示與前一個程序的不同之處:
TITLE Add and Subtract (AddSubAlt.asm) ;This program adds and subtracts 32-bit integers. .386 .model flat,stdcall .stack 4096 ExitProcess PROTO, dwExitCode:DWORD DumpRegs PROTO .code main PROCmov eax,10000h add eax,40000h sub eax,20000h call DumpRegs INVOKE ExitProcess,0 main ENDP END main運行結果:
解釋新增部分:
.386 ?指出了改程序要求的最低CPU(Intel386)。
.model flat,stdcall ?.MDOE偽指令只是匯編器為保護模式程序生成代碼,STDCALL允許調(diào)用MS-Windows函數(shù)。
ExitProcess PROTO ,dwExitCode:DWORD
DumpRegs PROTO
兩條PROTO偽指令聲明了改程序使用的過程原型;ExitProcess是一個MS-Windows函數(shù),其作用是終止當前程序(進程);DumpRegs是Irvine32連接庫中一個現(xiàn)實寄存器的過程。
INVOKE ExitProcess,0 ?程序通過調(diào)用ExitProcess來結束執(zhí)行,傳遞給該函數(shù)的參數(shù)是返回碼。取值是0.INVOKE是一個用于調(diào)用過程或函數(shù)的匯編偽指令。
3.2.2 ?程序模板
匯編語言程序有一個簡單的基本結構,這個框架隨情況不同可能略有變化。開始編寫程序的時候,讀者可借助于模板迅速創(chuàng)建具有基本元素的空程序外殼,然后只需要填寫其中缺少的部分并以新名字保存文件即可,這樣就可以避免重復鍵入相同的內(nèi)容。下面的保護莫模式程序模板,便于根據(jù)需要進行自定義。注意在文件中插入的注釋表明了何處需要加讀者自己的代碼:
TITLE Program Template (Template.asm) ;程序的描述: ;作者: ;創(chuàng)建日期 ;修改: ;日期: ;修改者 INCLUDE Irvine32.inc .data;(在此插入變量) .code main PROC;(在此插入可執(zhí)行代碼) exit main ENDP;(在此插入其他子程序) END main
使用注釋:程序的開始位置插入了幾個注釋區(qū)域。在程序中包含程序的描述、作者的名字、創(chuàng)建日期以及后續(xù)的修改信息等是一個不錯的注意。這種文檔對任何閱讀程序的人都很有用。
3.3 ?匯編、連接和運行程序
匯編器生成一個包含機器語言的文件,稱為目標文件。目標文件還不能執(zhí)行,必須把目標文件傳遞給另外一個稱為鏈接器的程序,由鏈接器生成可執(zhí)行文件。可執(zhí)行文件就可以在MS-DOS/MS-Windows命令提示符下執(zhí)行了。
3.3.1 ?匯編-鏈接-執(zhí)行
編輯、編譯、鏈接和執(zhí)行匯編語言程序的過程總結在下圖中:
下面是每個步驟的詳細說明。
1.程序員使用文本編輯器創(chuàng)建ASCII文本文件,稱為源文件(source file)。
2.匯編器讀取源文件并生成目標文件(object file),目標文件是源文件到機器語言的翻譯。另外還可以選擇生成列表文件(listing file)。如果發(fā)生了錯誤,程序員必須回到1修正程序。
3.鏈接器讀取目標文件并檢查程序是否調(diào)用了鏈接庫中的過程,鏈接器從庫中復制所需的過程并將其同目標文件合并在一起生成可執(zhí)行文件(executable file),還可以選擇生成映像文件(map file)。
4.操作系統(tǒng)的裝載器(loader)將可執(zhí)行文件讀入內(nèi)存,并使CPU轉(zhuǎn)移到程序的其實地址開始執(zhí)行。
列表文件
列表文件的內(nèi)容包括程序源代碼及行號、偏移地址、翻譯后的機器碼和一個符號表,其格式很適合于打印。下面是例子:
測試代碼:
TITLE Add and Subtract (AddSubAlt.asm) ;This program adds and subtracts 32-bit integers. .386 .model flat,stdcall .stack 4096 ExitProcess PROTO, dwExitCode:DWORD DumpRegs PROTO .code main PROCmov eax,10000h add eax,40000h sub eax,20000h call DumpRegs INVOKE ExitProcess,0 main ENDP END main對應的列表文件:
?
?
鏈接器創(chuàng)建或更新的文件
??映像文件:影響文件是包含被連接程序的分段信息的文本文件,主要包含以下信息:
??1.模塊名。模塊名作為鏈接器生成的可執(zhí)行文件的基本名(除擴展名外的部分)
??2.程序文件頭中(不是取自文件系統(tǒng))的時間戳。
??3.程序中各個段組的列表,包括每個段組的起始地址、長度、組名和類別信息。
??4.公共符號的列表,包括每個符號的地址、名稱、線性地址和定義符號的模塊。
??5.程序入口地址。
??程序數(shù)據(jù)庫文件:若以-ZI(調(diào)試)選項來編譯程序,MASM就會創(chuàng)建程序數(shù)據(jù)庫文件(*.PDB)。在鏈接階段,鏈接器讀取并更新它。在調(diào)試程序的時候,調(diào)試器可以根據(jù)PDB顯示程序的源代碼、數(shù)據(jù)、運行時棧以及其他附加信息。
?
總結
以上是生活随笔為你收集整理的Intel汇编语言程序设计学习-第三章 汇编语言基础-中的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intel汇编语言程序设计学习-第三章
- 下一篇: Intel汇编语言程序设计学习-第三章