国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 操作系統(tǒng) > 正文

第一個匯編程序

2024-06-28 13:23:06
字體:
來源:轉載
供稿:網(wǎng)友
第一個匯編程序

本文將開始編寫完整的匯編語言程序,用編譯器將它們編譯成為可執(zhí)行文件(如:*.exe文件),在操作系統(tǒng)中運行。

本文地址:http://www.CUOXin.com/archimedes/p/assembly-first-PRogram.html,轉載請注明源地址。

1、一個源程序從寫出到執(zhí)行的過程一個匯編語言程序從寫出到最終執(zhí)行的簡要過程:

編寫--〉編譯--〉連接--〉執(zhí)行

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

先看一段代碼:

assum cs:codesgcodesg segmentstart: mov ax,0123H          mov bx,0456H          add ax,bx          add ax,ax          mov ax,4c00h          int 21hcodesg endsend
segment和ends是一對成對使用的偽指令,這是在寫可被編譯器編譯的匯編程序時,必須要用到的一對偽指令。segment和ends的功能是定義一個段,segment說明一個段開始,ends 說明一個段結束。一個段必須有一個名稱來標識,使用格式為:

段名 segment

段名 ends

一個匯編程序是由多個段組成的,這些段被用來存放代碼、數(shù)據(jù)或當作棧空間來使用。一個有意義的匯編程序中至少要有一個段,這個段用來存放代碼。end 是一個匯編程序的結束標記,編譯器在編譯匯編程序的過程中,如果碰到了偽指令 end,就結束對源程序的編譯。如果程序?qū)懲炅耍诮Y尾處加上偽指令end 。否則,編譯器在編譯程序時,無法知道程序在何處結束。注意:不要搞混了end和ends。nassume:含義為“假設”。它假設某一段寄存器和程序中的某一個用 segment … ends 定義的段相關聯(lián)。通過assume說明這種關聯(lián),在需要的情況下 ,編譯程序可以將段寄存器和某一個具體的段相聯(lián)系。程序經(jīng)編譯連接后變?yōu)闄C器碼:標號:一個標號指代了一個地址。codesg:放在segment的前面,作為一個段的名稱,這個段的名稱最終將被編譯、連接程序處理為一個段的段地址。任務:編程運算 2^3
assume cs:abcabc segmentmov ax,2add ax,axadd ax,axabc endsend 

應該在程序的末尾添加返回的程序段。

mov ax,4c00Hint 21H

這兩條指令所實現(xiàn)的功能就是程序返回。

3、編輯源程序

進入DOS方式,運行edit,在其中編輯程序,如下圖所示:

4、編譯

進入DOS方式,進入 C:/masm 目錄,運行masm.exe。如果源程序文件不是以 asm 為擴展名的話,就要輸入它的全名。比如p1.txt。在輸入源程序文件名的時候一定要指明它所在的路徑。如果文件就在當前路徑下,只輸入文件名就可以。

輸入要編譯的源文件文件名后,按 Enter鍵。目標文件(*.obj)是我們對一個源程序進行編譯要得到的最終結果。編譯程序默認要輸出的目標文件名為1.obj,所以可以不必再另行指定文件名。

編譯程序提示輸入交叉引用文件的名稱。

這個文件同列表文件一樣,是編譯器將源程序編譯為目標文件過程中產(chǎn)生的中間結果。可以不生成這個文件,直接按 Enter 鍵即可。

一般來說,有兩類錯誤使我們得不到所期望的目標文件:

(1)我們程序中有“Severe Errors”;

(2)找不到所給出的源程序文件。

5、連接

在對源程序進行編譯得到目標文件后,我們需要對目標文件進行連接,從而得到可執(zhí)行文件。繼續(xù)上面的過程,我們再將C:/masm/1.obj連接為C:/masm/1.exe。

進入DOS方式,進入C:/masm目錄,運行l(wèi)ink.exe。如果目標文件不是以obj為擴展名的話,就要輸入它的全名。比如:p1.bin。在輸入目標文件名的時候,要注意指明它所在的路徑。這里,我們要連接的文件是當前路徑下1.obj,所以此處輸入“1”。

輸入要連接的目標文件名后,按Enter鍵。可執(zhí)行文件是我們對一個程序進行連接要得到的最終結果。連接程序默認要輸出的可執(zhí)行文件名為 1.EXE ,所以可以不必再另行指定文件名。我們直接按 Enter 鍵,使用連接程序設定的可執(zhí)行文件名。

映像文件是連接程序?qū)⒛繕宋募B接為可執(zhí)行文件過程中產(chǎn)生的中間結果。可以不生成這個文件,直接按 Enter 鍵即可。

連接程序提示輸入庫文件的名稱。

庫文件里包含了一些可以調(diào)用的子程序,如果我們的程序中調(diào)用了某一個庫文件中的子程序,就需要在連接的時候,將這個庫文件和我們的目標文件連接到一起,生成可執(zhí)行文件。

如果沒有調(diào)用任何子程序,直接按Enter鍵即可。

連接的作用:

當源程序很大時,可以將它分為多個源程序文件來編譯,每個源程序編譯成為目標文件后,再用連接程序?qū)⑺鼈冞B接到一起,生成一個可執(zhí)行文件;

程序中調(diào)用了某個庫文件中的子程序,需要將這個庫文件和該程序生成的目標文件連接到一起,生成一個可執(zhí)行文件;

一個源程序編譯后,得到了存有機器碼的目標文件,目標文件中的有些內(nèi)容還不能直接用來生成可執(zhí)行文件,連接程序?qū)⑦@此內(nèi)容處理為最終的可執(zhí)行信息。

所以,在只有一個源程序文件,而又不需要調(diào)用某個庫中的子程序的情況下,也必須用連接程序?qū)δ繕宋募M行處理,生成可執(zhí)行文件。

6、以簡化的方式進行編譯和連接

我們編譯、連接的最終目的是用源程序文件生成可執(zhí)行文件。在這個過程中所產(chǎn)生的中間文件都可以忽略。我們可以用一種較為簡捷的方式進行編譯、連接。

編譯:

連接:

7、1.exe的執(zhí)行

現(xiàn)在,終于將我們的第一個匯編程序加工成了一個可在操作系統(tǒng)下執(zhí)行的程序文件。1.exe的執(zhí)行情況:

我們的程序沒有像顯示器輸出任何信息。程序只是做了一些將數(shù)據(jù)送入寄存器和加法的操作,而這些事情,我們不可能從顯示屏上看出來。程序執(zhí)行完成后,返回,屏幕上再次出現(xiàn)操作系統(tǒng)的提示符。

8、可執(zhí)行文件中的程序裝入內(nèi)存并運行的原理

DOS中有一個程序command.com ,這個程序在 DOS 中稱為命令解釋器,也就是DOS系統(tǒng)的shell。

(1)我們在DOS中直接執(zhí)行 1.exe 時,是正在運行的command將1.exe中的程序加載入內(nèi)存。

(2)command設置CPU的CS:IP指向程序的第一條指令(即程序的入口),從而使程序得以運行。

(3)程序運行結束后,返回到command中,CPU繼續(xù)運行command。

匯編程序從寫出到執(zhí)行的過程:

9、程序執(zhí)行過程的跟蹤

為了觀察程序的運行過程 ,我們可以使用Debug。

Debug 可以將程序加載入內(nèi)存,設置CS:IP指向程序的入口,但Debug并不放棄對CPU 的控制,這樣,我們就可以使用Debug 的相關命令來單步執(zhí)行程序 ,查看每條指令指令的執(zhí)行結果。

EXE文件中的程序的加載過程:

總結:

程序加載后,ds中存放著程序所在內(nèi)存區(qū)的段地址,這個內(nèi)存區(qū)的偏移地址為 0 ,則程序所在的內(nèi)存區(qū)的地址為:ds:0;這個內(nèi)存區(qū)的前256 個字節(jié)中存放的是PSP,dos用來和程序進行通信。

從 256字節(jié)處向后的空間存放的是程序。所以,我們從ds中可以得到PSP的段地址SA,PSP的偏移地址為 0,則物理地址為SA×16+0。

因為PSP占256(100H)字節(jié),所以程序的物理地址是:

SA×16+0+256= SA×16+16×16=(SA+16)×16+0

可用段地址和偏移地址表示為:SA+10:0

用U命令查看一下其他指令:

用T命令但不執(zhí)行程序中的每一條指令,并觀察每條指令的執(zhí)行結果,到了 int 21,我們要用P命令執(zhí)行:

int 21 執(zhí)行后,顯示“Program terminated normally”,返回到Debug中。表示程序正常結束。

注意,要使用P命令執(zhí)行int 21。

參考資料

《匯編語言》--王爽


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黑河市| 天柱县| 尼勒克县| 永和县| 牙克石市| 广宁县| 南乐县| 咸丰县| 琼海市| 句容市| 夏河县| 什邡市| 万源市| 镇康县| 昌图县| 利津县| 宾川县| 汕头市| 凭祥市| 嘉定区| 绥阳县| 中方县| 洮南市| 时尚| 东乌珠穆沁旗| 高尔夫| 邓州市| 密山市| 新安县| 甘谷县| 兴安盟| 伊川县| 高州市| 万宁市| 汉川市| 张家口市| 江川县| 巴中市| 台东市| 长乐市| 武宣县|