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