匯編語言第4章_第1頁
匯編語言第4章_第2頁
匯編語言第4章_第3頁
匯編語言第4章_第4頁
匯編語言第4章_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第4章 匯編語言程序設(shè)計(jì)v4.1 一個(gè)源程序從寫出到執(zhí)行的過程v4.2 源程序v4.3 編輯源程序v4.4 編譯v4.5 連接v4.6 以簡化的方式進(jìn)行編譯和連接v4.7 1.exe的執(zhí)行v4.8 可執(zhí)行文件中的程序裝入內(nèi)存并運(yùn)行的原理v4.9 程序執(zhí)行過程的跟蹤引言v現(xiàn)在我們將開始編寫完整的匯編語言程序,用編譯器將它們編譯成為可執(zhí)行文件(如:*.exe文件),在操作系統(tǒng)中運(yùn)行。v這一章,我們將編寫第一個(gè)這樣的程序。4.1 一個(gè)源程序從寫出到執(zhí)行的過程v一個(gè)匯編語言程序從寫出到最終執(zhí)行的簡要過程: 編寫-編譯-連接-執(zhí)行編寫匯編源程序v使用文本編輯器(如Edit、記事本等),用匯編語言編寫匯編

2、源程序。對源程序進(jìn)行編譯連接v使用匯編語言編譯程序?qū)υ闯绦蛭募械脑闯绦蜻M(jìn)行編譯,產(chǎn)生目標(biāo)文件;再用連接程序?qū)δ繕?biāo)文件進(jìn)行連接,生成可在操作系統(tǒng)中直接運(yùn)行的可執(zhí)行文件??蓤?zhí)行文件v可執(zhí)行文件中包含兩部分內(nèi)容:程序(從原程序中的匯編指令翻譯過來的機(jī)器碼)和數(shù)據(jù)(源程序中定義的數(shù)據(jù))相關(guān)的描述信息(比如:程序有多大、要占多少內(nèi)存空間等)執(zhí)行可執(zhí)行文件中的程序v在操作系統(tǒng)中,執(zhí)行可執(zhí)行文件中的程序。v操作系統(tǒng)依照可執(zhí)行文件中的描述信息,將可執(zhí)行文件中的機(jī)器碼和數(shù)據(jù)加載入內(nèi)存,并進(jìn)行相關(guān)的初始化(比如:設(shè)置CS:IP指向第一條要執(zhí)行的指令),然后由CPU執(zhí)行程序。4.2 源程序v匯編指令v偽指令 XX

3、X segment XXX ends end assume4.2 源程序v匯編指令有對應(yīng)的機(jī)器碼的指令,可以被編譯為機(jī)器指令,最終為CPU所執(zhí)行。4.2 源程序v偽指令沒有對應(yīng)的機(jī)器碼的指令,最終不被CPU所執(zhí)行。v誰來執(zhí)行偽指令呢?偽指令是由編譯器來執(zhí)行的指令,編譯器根據(jù)偽指令來進(jìn)行相關(guān)的編譯工作。它可以完成:數(shù)據(jù)定義,分配存儲(chǔ)區(qū),指示程序結(jié)束等功能。本課件由匯編網(wǎng)()制作提供 偽操作(偽指令)偽操作(偽指令) 偽操作是匯編程序?qū)υ闯绦蜻M(jìn)行匯編時(shí)處理的操作,完成處理器選擇、存儲(chǔ)模式定義、數(shù)據(jù)定義、存儲(chǔ)器分配、指示程序開始結(jié)束等功能。 處理器選擇偽操作 段定義偽操作 程序開始和結(jié)束偽操作 數(shù)據(jù)

4、定義及存儲(chǔ)器分配偽操作 表達(dá)式賦值偽操作 地址計(jì)數(shù)器與對準(zhǔn)偽操作 基數(shù)控制偽操作定義一個(gè)段v segment和ends是一對成對使用的偽指令,這是在寫可被編譯器編譯的匯編程序時(shí),必須要用到的一對偽指令。v segment和ends的功能是定義一個(gè)段,segment說明一個(gè)段開始,ends 說明一個(gè)段結(jié)束。v一個(gè)段必須有一個(gè)名稱來標(biāo)識,使用格式為: 段名 segment 段名 ends定義一個(gè)段v一個(gè)匯編程序是由多個(gè)段組成的,這些段被用來存放代碼、數(shù)據(jù)或當(dāng)作??臻g來使用。v一個(gè)有意義的匯編程序中至少要有一個(gè)段,這個(gè)段用來存放代碼。程序結(jié)束標(biāo)記vEnd 是一個(gè)匯編程序的結(jié)束標(biāo)記,編譯器在編譯匯編程

5、序的過程中,如果碰到了偽指令 end,就結(jié)束對源程序的編譯。v如果程序?qū)懲炅?,要在結(jié)尾處加上偽指令end 。否則,編譯器在編譯程序時(shí),無法知道程序在何處結(jié)束。v注意:不要搞混了end和ends。寄存器與段的關(guān)聯(lián)假設(shè)vassume:含義為“假設(shè)”。v它假設(shè)某一段寄存器和程序中的某一個(gè)用 segment ends 定義的段相關(guān)聯(lián)。v通過assume說明這種關(guān)聯(lián),在需要的情況下 ,編譯程序可以將段寄存器和某一個(gè)具體的段相聯(lián)系。4.2 源程序v源程序中的“程序”匯編源程序: 偽指令 (編譯器處理) 匯編指令(編譯為機(jī)器碼)程序:源程序中最終由計(jì)算機(jī)執(zhí)行、處理的指令或數(shù)據(jù)。注意注意v我們可以將源程序文件

6、中的所有內(nèi)容稱為源程序,將源程序中最終由計(jì)算機(jī)執(zhí)行處理的指令或數(shù)據(jù) ,成為程序。v程序最先以匯編指令的形式存在源程序中,經(jīng)編譯、連接后轉(zhuǎn)變?yōu)闄C(jī)器碼,存儲(chǔ)在可執(zhí)行文件中,v圖示程序經(jīng)編譯連接后變?yōu)闄C(jī)器碼4.2 源程序v標(biāo)號一個(gè)標(biāo)號指代了一個(gè)地址地址。codesg:放在segment的前面,作為一個(gè)段的名稱,這個(gè)段的名稱最終將被編譯、連接程序處理為一個(gè)段的段地址。4.2 源程序v程序的結(jié)構(gòu)任務(wù):編程運(yùn)算 23。v定義一個(gè)段v實(shí)現(xiàn)處理任務(wù)v程序結(jié)束v段與段寄存器關(guān)聯(lián) 匯編程序 assume cs:abc abc segment mov ax,2 add ax,ax add ax,ax abc end

7、s end 4.2 源程序v程序返回我們知道,一個(gè)程序結(jié)束后,將CPU的控制權(quán)交還給使它得以運(yùn)行的程序,我們稱這個(gè)過程為:程序返回。如何返回呢?DOS中的程序運(yùn)行vDOS是一個(gè)單任務(wù)操作系統(tǒng)。一個(gè)程序P2在可執(zhí)行文件中,則必須有一個(gè)正在運(yùn)行的程序P1,將P2從可執(zhí)行文件中加載入內(nèi)存后,將CPU的控制權(quán)交給P2,P2才能得以運(yùn)行。P2開始運(yùn)行后,P1暫停運(yùn)行。而當(dāng)P2運(yùn)行完畢后,應(yīng)該將CPU的控制權(quán)交還給使它得以運(yùn)行的程序P1,此后,P1繼續(xù)運(yùn)行。4.2 源程序v程序返回應(yīng)該在程序的末尾添加返回的程序段。 mov ax,4c00H int 21Hv這兩條指令所實(shí)現(xiàn)的功能就是程序返回。v幾個(gè)和結(jié)束

8、相關(guān)的內(nèi)容段結(jié)束、程序結(jié)束、程序返回參數(shù)、變量和標(biāo)號參數(shù)、變量和標(biāo)號v下面詳細(xì)討論匯編語言程序語句的主要部分:參數(shù) 變量名 標(biāo)號v并引出相關(guān)的偽指令和操作符v本節(jié)重點(diǎn)掌握:常數(shù)的表達(dá)變量定義偽指令DB/DW/DD地址操作符和類型操作符變量定義偽指令變量定義偽指令v變量定義(Define)偽指令為變量申請固定長度的存儲(chǔ)空間,并可同時(shí)將相應(yīng)的存儲(chǔ)單元初始化變量名 偽指令助記符 初值表 變量定義偽指令最常使用變量定義偽指令最常使用變量名v變量名為用戶自定義標(biāo)識符,表示初值表首元素的表示初值表首元素的邏輯地址邏輯地址;用這個(gè)符號表示地址,常稱為符號地址v變量名可以沒有。這種情況,匯編程序?qū)⒅苯訛槌踔当?/p>

9、分配空間,無符號地址v設(shè)置變量名是為了方便存取它指示的存儲(chǔ)單元變量定義偽指令助記符變量定義偽指令助記符v變量定義偽指令根據(jù)申請的主存空間單位分類vDB定義字節(jié)偽指令定義字節(jié)偽指令vDW定義字偽指令定義字偽指令vDD定義雙字偽指令定義雙字偽指令vDF定義3字偽指令vDQ定義4字偽指令vDT定義10字節(jié)偽指令v還有定位偽指令定義字節(jié)單元偽指令DBDB偽指令用于分配一個(gè)或多個(gè)字節(jié)單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)一定是字節(jié)量(Byte),存放一個(gè)8位數(shù)據(jù): 可以是0255的無符號數(shù) 或是128127帶符號數(shù) 也可以是字符串常數(shù)datasegment;數(shù)據(jù)段Xdb a,-5db 2 du

10、p(100),?Ydb ABCdataends字節(jié)單元定義實(shí)例字節(jié)單元定義實(shí)例 43H 42H 41H 64H 64H FBH 61HYXdata數(shù)據(jù)段偏移地址偏移地址存儲(chǔ)單元存儲(chǔ)單元0001H0002H0003H0004H0005H0006H0007H0000H初值表初值表movmov al,X al,X;此處X表示它的第1個(gè)數(shù)據(jù),故ALadecdec X+1 X+1;對X為始的第2個(gè)數(shù)據(jù)減1,故成為-6movmov Y,al Y,al;現(xiàn)在Y這個(gè)字符串成為 aBC字節(jié)變量的應(yīng)用字節(jié)變量的應(yīng)用定義字單元偽指令DWDW偽指令用于分配一個(gè)或多個(gè)字單元,并可以將它們初始化為指定值初值表中每個(gè)數(shù)據(jù)一

11、定是字量(Word),一個(gè)字單元可用于存放任何16位數(shù)據(jù): 一個(gè)段地址一個(gè)偏移地址 兩個(gè)字符 065535之間的無符號數(shù) 3276832767之間的帶符號數(shù)datasegment;數(shù)據(jù)段countdw 8000h,?,ABmaxint equequ 64hnumber dw maxintarraydw maxint dup(0)dataends字單元定義實(shí)例字單元定義實(shí)例 00Hnumbercountdata數(shù)據(jù)段偏移地址偏移地址存儲(chǔ)單元存儲(chǔ)單元0000H0002H0004H0006H0008H000aH 80H - - 42H 41H 64H 00H 00H 00H 00H 00H arra

12、y初值表初值表v初值表是用逗號逗號分隔的參數(shù)v主要由數(shù)值常數(shù)數(shù)值常數(shù)、表達(dá)式或?、表達(dá)式或?、DUP組成組成?表示初值不確定,即未賦初值;DUP表示重復(fù)初值DUP的格式為:重復(fù)次數(shù) DUP(重復(fù)參數(shù))DUPvdup是一個(gè)操作符,在匯編語言中同db、dw、dd 等一樣,也是由編譯器識別處理的符號。v它是和db、dw、dd 等數(shù)據(jù)定義偽指令配合使用的,用來進(jìn)行數(shù)據(jù)的重復(fù)。v示例dupvdup示例db 3 dup (0) 定義了3個(gè)字節(jié),它們的值都是0, 相當(dāng)于 db 0,0,0dup示例db 3 dup (0,1,2) 定義了9個(gè)字節(jié),它們是 0、1、2、0、1、2、0、1、2, 相當(dāng)于 db 0

13、,1,2,0,1,2,0,1,2 dupvdup示例db 3 dup (abc,ABC) 定義了18個(gè)字節(jié),它們是 abcABCabcABCabcABC, 相當(dāng)于db abcABCabcABCabcABCdupv可見,dup的使用格式如下:db 重復(fù)的次數(shù) dup (重復(fù)的字節(jié)型數(shù)據(jù))dw 重復(fù)的次數(shù) dup (重復(fù)的字型數(shù)據(jù))dd 重復(fù)的次數(shù) dup (重復(fù)的雙字?jǐn)?shù)據(jù))dupvdup是一個(gè)十分有用的操作符 比如我們要定義一個(gè)容量為 200 個(gè)字節(jié)的棧段,如果不用dup,則必須用這樣的格式: stack segment dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

14、0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 stack endsdupv當(dāng)然,讀者可以用dd,使程序變得簡短一些,但是如果要求定義一個(gè)容量為1000字節(jié)或10000字節(jié)的呢? 如果沒有dup,定義部分的程序就變得太長了; 有了dup就可以輕松解決。如下: stack segment db

15、 200 dup (0) stack ends 返回本課件由匯編網(wǎng)()制作提供 段定義偽操作:段定義偽操作:完整的段定義格式完整的段定義格式 data segment data segment ; 定義數(shù)據(jù)段定義數(shù)據(jù)段 data endsdata ends;-;-extra segment extra segment ; 定義附加段定義附加段 extra endsextra ends;-;-code segment code segment ; 定義代碼段定義代碼段 assume cs:code, ds:data, es:extraassume cs:code, ds:data, es:ext

16、rastart: start: mov mov ax, data ax, data mov ds mov ds, ax , ax ; 段地址段地址 段寄存器段寄存器 code endscode ends end start end startPSPPSPDSDSESESSSSSCSCSEXE程序的內(nèi)存映象圖裝入模塊文件頭過程定義偽指令過程定義偽指令v格式格式:過程名字過程名字 + PROC + 類型屬性類型屬性(near/ far) 過程名字過程名字 + ENDPvfar和near是子程序調(diào)用時(shí)的參數(shù)v如果子程序和調(diào)用程序在一個(gè)段內(nèi),子程序參數(shù)設(shè)置為nearv如果子程序和調(diào)用程序不在一個(gè)段內(nèi),

17、子程序參數(shù)設(shè)置為farv“main proc far” v注釋:注釋:這是定義一個(gè)子程序的第一行。子程序名是main,類型far。就是說main這個(gè)子程序可以被不跟main在同一個(gè)段內(nèi)的程序調(diào)用。即主程序和子程序的段基址不同時(shí)主程序也可以調(diào)用子程序。例如:主程序code的段基址在CS中,子程序main的段基址在ES中,且CS和ES中的內(nèi)容不同,子程序的類型是far時(shí),code可以調(diào)用main。否則,不能調(diào)用。 code segmentmain proc farmain proc far assume start: push ds mov ax, 0 push ax retmain endpma

18、in endpcode ends end startcode segmentmain proc far assume start: mov ax,4c00h int 21hmain endpcode ends end start本課件由匯編網(wǎng)()制作提供其他偽操作其他偽操作本課件由匯編網(wǎng)()制作提供 地址計(jì)數(shù)器與對準(zhǔn)偽操作:地址計(jì)數(shù)器與對準(zhǔn)偽操作:地址計(jì)數(shù)器地址計(jì)數(shù)器 $ :保存當(dāng)前正在匯編的指令的地址保存當(dāng)前正在匯編的指令的地址 ORG $+8 ; 跳過8個(gè)字節(jié)的存儲(chǔ)區(qū) JNE $+6 ; 轉(zhuǎn)向地址是 JNE 的首址 +6 JMP $+2 $ 用在偽操作的參數(shù)字段:用在偽操作的參數(shù)字段:表示

19、地址計(jì)數(shù)器的當(dāng)前值表示地址計(jì)數(shù)器的當(dāng)前值 ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4 00H00H 01H 00H 02H 00H 7CH7CH 00H00H 03H 00H 04H 00H 82H82H ARRAY ARRAY 007E007E0078007800740074本課件由匯編網(wǎng)()制作提供SIZE SIZE 變量變量功能:功能:LENGTH LENGTH * * TYPE TYPEOFFSETOFFSET / SEGSEG 變量變量 / 標(biāo)號標(biāo)號功能:回送變量或標(biāo)號的偏址功能:回送變量或標(biāo)號的偏址 / / 段址段址TYPETYPE 變量變量 / 標(biāo)號標(biāo)號

20、/ 常數(shù)常數(shù) DB DW DD DF DQ DT NEAR FAR DB DW DD DF DQ DT NEAR FAR 常數(shù)常數(shù) 1 2 4 6 8 10 -1 -2 01 2 4 6 8 10 -1 -2 0LENGTH LENGTH 變量變量功能:回送由功能:回送由DUP定義的定義的變量的單元數(shù),其它情況回送變量的單元數(shù),其它情況回送1 1本課件由匯編網(wǎng)()制作提供類型類型 PTR PTR 表達(dá)式表達(dá)式 MOV WORD PTRPTR BX, 5段操作符段操作符 MOV ES:ES: BX, ALSHORT SHORT 標(biāo)號標(biāo)號 JMP SHORTSHORT NEXT本課件由匯編網(wǎng)()制

21、作提供 end本課件由匯編網(wǎng)()制作提供v后面內(nèi)容僅限上機(jī)使用,可以不看上機(jī)部分上機(jī)部分4.4 編輯源程序v進(jìn)入DOS方式,運(yùn)行Edit,在其中編輯程序,如下圖所示:4.4 編譯v進(jìn)入DOS方式,進(jìn)入 C:masm 目錄,運(yùn)行masm.exe。v如果源程序文件不是以 asm 為擴(kuò)展名的話,就要輸入它的全名。比如p1.txt。v在輸入源程序文件名的時(shí)候一定要指明它所在的路徑。如果文件就在當(dāng)前路徑下,只輸入文件名就可以。4.4 編譯v輸入要編譯的源文件文件名后,按 Enter鍵。v目標(biāo)文件(*.obj)是我們對一個(gè)源程序進(jìn)行編譯要得到的最終結(jié)果。v編譯程序默認(rèn)要輸出的目標(biāo)文件名為1.obj,所以可

22、以不必再另行指定文件名。4.4 編譯v列表文件是編譯器將源程序編譯為目標(biāo)文件的過程中產(chǎn)生的中間結(jié)果。v可以不生成這個(gè)文件,直接按 Enter鍵即可。4.4 編譯v編譯程序提示輸入交叉引用文件的名稱。v這個(gè)文件同列表文件一樣,是編譯器將源程序編譯為目標(biāo)文件過程中產(chǎn)生的中間結(jié)果。v可以不生成這個(gè)文件,直接按 Enter 鍵即可。4.4 編譯v對源程序的編譯結(jié)束,編譯器輸出的最后兩行告訴我們這個(gè)源程序沒有警告錯(cuò)誤和必須要改正的錯(cuò)誤。4.4 編譯v一般來說,有兩類錯(cuò)誤使我們得不到所期望的目標(biāo)文件:(1)我們程序中有“Severe Errors”;(2)找不到所給出的源程序文件。4.5 連接v在對源程序

23、進(jìn)行編譯得到目標(biāo)文件后,我們需要對目標(biāo)文件進(jìn)行連接,從而得到可執(zhí)行文件。v繼續(xù)上一節(jié)的過程,我們再將C:masm1.obj連接為C:masm1.exe。4.5 連接v進(jìn)入DOS方式,進(jìn)入C:masm目錄,運(yùn)行l(wèi)ink.exe。v如果目標(biāo)文件不是以obj為擴(kuò)展名的話,就要輸入它的全名。比如:p1.bin。v在輸入目標(biāo)文件名的時(shí)候,要注意指明它所在的路徑。這里,我們要連接的文件是當(dāng)前路徑下1.obj,所以此處輸入“1”。4.5 連接v輸入要連接的目標(biāo)文件名后,按Enter鍵。v可執(zhí)行文件是我們對一個(gè)程序進(jìn)行連接要得到的最終結(jié)果。v連接程序默認(rèn)要輸出的可執(zhí)行文件名為 1.EXE ,所以可以不必再另行

24、指定文件名。v我們直接按 Enter 鍵,使用連接程序設(shè)定的可執(zhí)行文件名。4.5 連接v映像文件是連接程序?qū)⒛繕?biāo)文件連接為可執(zhí)行文件過程中產(chǎn)生的中間結(jié)果。v可以不生成這個(gè)文件,直接按 Enter 鍵即可。4.5 連接v連接程序提示輸入庫文件的名稱。v庫文件里包含了一些可以調(diào)用的子程序,如果我們的程序中調(diào)用了某一個(gè)庫文件中的子程序,就需要在連接的時(shí)候,將這個(gè)庫文件和我們的目標(biāo)文件連接到一起,生成可執(zhí)行文件。v如果沒有調(diào)用任何子程序,直接按Enter鍵即可。4.5 連接v對目標(biāo)文件的連接結(jié)束,連接程序輸出的最后一行告訴我們,這個(gè)程序有一個(gè)警告錯(cuò)誤:“沒有棧段” ,這里我們不理會(huì)這個(gè)錯(cuò)誤。4.5 連

25、接v前面我們通過對 1.obj 進(jìn)行連接的過程,展示了使用連接器對目標(biāo)文件進(jìn)行連接的方法。v我們得到了一個(gè)新的文件 1.exe 。當(dāng)然,如果連接過程中出現(xiàn)錯(cuò)誤,那么我們將得不到這個(gè)可執(zhí)行文件。v連接的作用是什么呢?4.5 連接v這里再次強(qiáng)調(diào)一下,我們學(xué)習(xí)匯編的主要目的,就是通過用匯編語言進(jìn)行編程而深入地理解計(jì)算機(jī)底層的基本工作機(jī)理,達(dá)到可以隨心所欲地控制計(jì)算機(jī)的目的。v基于這種考慮,我們的編程活動(dòng),大都是直接對硬件進(jìn)行的。我們希望直接對硬件編程,卻并不希望用機(jī)器碼編程。4.5 連接v我們用匯編語言編程,就要用到 :編輯器(Edit)、編譯器(masm)、連接器(link)、調(diào)試工具(debug

26、)等所有工具,而這些工具都是在操作系統(tǒng)之上運(yùn)行的程序,所以我們的學(xué)習(xí)過程必須在操作系統(tǒng)的環(huán)境中進(jìn)行。4.5 連接v我們在一個(gè)操作系統(tǒng)環(huán)境中,使用了許多工具,這勢必要牽扯到操作系統(tǒng)、編譯原理等方面的知識和原理。v我們只是利用這些環(huán)境、工具來方便我們的學(xué)習(xí),而不希望這些東西分散了我們的注意力。4.5 連接v所以,對于涉及到而又不在我們學(xué)習(xí)的主要內(nèi)容之中的東西,我們只做簡單的解釋。4.5 連接v連接的作用有以下幾個(gè):當(dāng)源程序很大時(shí),可以將它分為多個(gè)源程序文件來編譯,每個(gè)源程序編譯成為目標(biāo)文件后,再用連接程序?qū)⑺鼈冞B接到一起,生成一個(gè)可執(zhí)行文件;程序中調(diào)用了某個(gè)庫文件中的子程序,需要將這個(gè)庫文件和該程

27、序生成的目標(biāo)文件連接到一起,生成一個(gè)可執(zhí)行文件;4.5 連接v連接的作用有以下幾個(gè)(續(xù)):一個(gè)源程序編譯后,得到了存有機(jī)器碼的目標(biāo)文件,目標(biāo)文件中的有些內(nèi)容還不能直接用來生成可執(zhí)行文件,連接程序?qū)⑦@此內(nèi)容處理為最終的可執(zhí)行信息。所以,在只有一個(gè)源程序文件,而又不需要調(diào)用某個(gè)庫中的子程序的情況下,也必須用連接程序?qū)δ繕?biāo)文件進(jìn)行處理,生成可執(zhí)行文件。v注意,對于連接的過程,可執(zhí)行文件是我們要得到的最終結(jié)果。4.6 以簡化的方式進(jìn)行編譯和連接v我們編譯、連接的最終目的是用源程序文件生成可執(zhí)行文件。v在這個(gè)過程中所產(chǎn)生的中間文件都可以忽略。我們可以用一種較為簡捷的方式進(jìn)行編譯、連接。4.6 以簡化的方

28、式進(jìn)行編譯和連接v編譯:4.6 以簡化的方式進(jìn)行編譯和連接v連接:4.7 1.exe的執(zhí)行v現(xiàn)在,終于將我們的第一個(gè)匯編程序加工成了一個(gè)可在操作系統(tǒng)下執(zhí)行的程序文件。1.exe的執(zhí)行情況:v程序到底運(yùn)行沒有?程序當(dāng)然運(yùn)行了,只是從屏幕上不可能看到任何運(yùn)行結(jié)果。4.7 1.exe的執(zhí)行v我們的程序沒有像顯示器輸出任何信息。程序只是做了一些將數(shù)據(jù)送入寄存器和加法的操作,而這些事情,我們不可能從顯示屏上看出來。v程序執(zhí)行完成后,返回,屏幕上再次出現(xiàn)操作系統(tǒng)的提示符。4.8 可執(zhí)行文件中的程序裝入內(nèi)存并運(yùn)行的原理v在DOS中,可執(zhí)行文件中的程序P1若要運(yùn)行,必須有一個(gè)正在運(yùn)行的程序P2 ,將 P1 從

29、可執(zhí)行文件中加載入內(nèi)存,將CPU的控制權(quán)交給它,P1才能得以運(yùn)行;當(dāng)P1運(yùn)行完畢后,應(yīng)該將CPU的控制權(quán)交還給使它得以運(yùn)行的程序P2。v1.exe的執(zhí)行過程4.8 可執(zhí)行文件中的程序裝入內(nèi)存并運(yùn)行的原理v1.exe的執(zhí)行過程:(1)我們在提示符“C:masm”后面輸入可執(zhí)行文件的名字“1”,按Enter鍵。 問題4.1(2)1.exe中的程序運(yùn)行;(3)運(yùn)行結(jié)束,返回,再次顯示提示符“C:masm”。 問題4.2 問題4.1v執(zhí)行第(1)步操作時(shí),有一個(gè)正在運(yùn)行的程序?qū)?.exe中的程序加載入內(nèi)存,這個(gè)正在運(yùn)行的程序是什么?它將程序加載入內(nèi)存后,如何使程序得以運(yùn)行? 問題4.2v執(zhí)行第(3)步

30、操作,程序運(yùn)行結(jié)束后,返回到哪里?v參考內(nèi)容v回答問題4.1和4.2操作系統(tǒng)的外殼v操作系統(tǒng)是由多個(gè)功能模塊組成的龐大 、復(fù)雜的軟件系統(tǒng)。任何通用的操作系統(tǒng) ,都要提供一個(gè)稱為shell(外殼)的程序 ,用戶(操作人員)使用這個(gè)程序來操作計(jì)算機(jī)系統(tǒng)工作。vDOS中有一個(gè)程序 ,這個(gè)程序在 DOS 中稱為命令解釋器,也就是DOS系統(tǒng)的shell?;卮饐栴}4.1和4.2v(1)我們在DOS中直接執(zhí)行 1.exe 時(shí),是正在運(yùn)行的command將1.exe中的程序加載入內(nèi)存。v(2)command設(shè)置CPU的CS:IP指向程序的第一條指令(即程序的入口),從而使程序得以運(yùn)行。v(3)程序運(yùn)行結(jié)束后,返回到command中,CPU繼續(xù)運(yùn)行command。4.8 可執(zhí)行文件中的程序裝入內(nèi)存并運(yùn)行的原理v匯編程序從寫出到執(zhí)行的過程:4.9 程序執(zhí)行過程的跟蹤v為了觀察程序的運(yùn)行過程 ,我們可以使用Debug。vDebug 可以將程序加載入內(nèi)存,設(shè)置CS:IP指向程序的入口,但Debug并不放棄對CPU 的控制,這樣,我們就可以使用Debug 的相關(guān)命令來單步執(zhí)行程序 ,查看每條指令指令的執(zhí)行結(jié)果。4.9 程序執(zhí)行過程的跟蹤v接下來可以用R命令看一下各個(gè)寄存器的設(shè)置情況:v可以看到,Deb

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論