1. 程式人生 > >匯編語言——匯編程序從寫出到最終執行的過程

匯編語言——匯編程序從寫出到最終執行的過程

生成 語言 樣式 art masm 程序編譯 spa color assume

一個匯編語言程序從寫出到最終執行的簡要過程:
編寫--〉編譯--〉連接--〉執行

技術分享圖片

1、編寫

notepad++選擇Assembly編寫程序,保存成xx.asm,樣式如下

assume cs:abc    ; abc被我們當做代碼段來使用,so要把它和cs聯系起來
abc segment        ; 定義一個段(abc),到ends結束
start:    mov ax,2    ; 給程序一個起始位置,從這開始到段結束的位置才是匯編指令,其他的都是偽指令(給編譯器看的)
        add ax,ax    ; 在這個代碼段寫入匯編指令(這個段就是我們定義的代碼段)
        add
ax,ax mov ax,4c00H ; 這兩句匯編指令就是程序返回 int 21H ; 我們暫時不需要知道這兩句話為啥是這樣的,只要知道它的作用是程序返回(將CPU的控制權還給使它能運行的程序) abc ends ; 代碼段結束 end start ; 指出程序結束的位置

技術分享圖片

2、編譯

程序經過編譯後成為可執行文件

技術分享圖片

編譯方法

進入DOS方式(cmd),進入 C:\masm 目錄,運行masm.exe。
如果源程序文件不是以 asm 為擴展名的話,就要輸入它的全名。比如p1.txt。
在輸入源程序文件名的時候一定要指明它所在的路徑。如果文件就在當前路徑下,只輸入文件名就可以。
輸入要編譯的源文件文件名後,按 Enter鍵。
目標文件(*.obj)是我們對一個源程序進行編譯要得到的最終結果。
編譯程序默認要輸出的目標文件名為1.obj,所以可以不必再另行指定文件名。

3、連接

我們剛剛把文件編譯成了(*.obj)的格式,現在要將.obj格式 --> .exe格式

連接方法

進入DOS方式,進入C:\masm目錄,運行link.exe。
如果目標文件不是以obj為擴展名的話,就要輸入它的全名。比如:p1.bin。
在輸入目標文件名的時候,要註意指明它所在的路徑。這裏,我們要連接的文件是當前路徑下1.obj,所以此處輸入“1”。
輸入要連接的目標文件名後,按Enter鍵。
可執行文件是我們對一個程序進行連接要得到的最終結果。
連接程序默認要輸出的可執行文件名為 1.EXE ,所以可以不必再另行指定文件名。
我們直接按 Enter 鍵,使用連接程序設定的可執行文件名。

連接的作用

連接的作用有以下幾個:
當源程序很大時,可以將它分為多個源程序文件來編譯,每個源程序編譯成為目標文件後,再用連接程序將它們連接到一起,生成一個可執行文件;
程序中調用了某個庫文件中的子程序,需要將這個庫文件和該程序生成的目標文件連接到一起,生成一個可執行文件;
一個源程序編譯後,得到了存有機器碼的目標文件,目標文件中的有些內容還不能直接用來生成可執行文件,連接程序將這此內容處理為最終的可執行信息。
所以,在只有一個源程序文件,而又不需要調用某個庫中的子程序的情況下,也必須用連接程序對目標文件進行處理,生成可執行文件。

4、執行

直接在目錄下執行1.exe

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

程序真正開始的位置是SA:100H位置,那256(100H)個內存單元是存放PSP的。

PSP的作用:連接程序與系統的接口。

技術分享圖片

程序加載後,ds中存放著程序所在內存區的段地址,這個內存區的偏移地址為 0 ,則程序所在的內存區的地址為:ds:0;
這個內存區的前256 個字節中存放的是PSP,dos用來和程序進行通信。
從 256字節處向後的空間存放的是程序。
所以,我們從ds中可以得到PSP的段地址SA,PSP的偏移地址為 0,則物理地址為SA×16+0。
因為PSP占256(100H)字節,所以程序的物理地址是:SA×16+0+256= SA×16+16×16=(SA+16)×16+0,可用段地址和偏移地址表示為:SA+10:0。

匯編語言——匯編程序從寫出到最終執行的過程