1. 程式人生 > >4 第一個程式:1.exe

4 第一個程式:1.exe

知識儲備
1、組合語言程式從寫出到執行的過程
編寫彙編源程式;
對源程式進行編譯連結;
執行可執行檔案中的程式。
2、可執行檔案包含兩部分內容:

  • 程式(從源程式中的彙編指令翻譯過來的機器碼)和資料(源程式中定義的資料)
  • 相關的描述資訊(比如:程式有多大,要佔用多少記憶體空間等)

生成*.exe檔案步驟
3、彙編程式碼

assume cs:fallrain

fallrain segment
	mov ax,2
	add ax,ax
	add ax,ax
	
    mov ax,4c00H
    int 21H
fallrain ends

end

將檔案儲存為1.asm。
4、編譯(本機如果沒有需要自行下載masm彙編編譯器)
將1.asm儲存到masm資料夾中,方便操作。
開啟命令列介面,如圖所示:
這裡寫圖片描述


先進入masm目錄下:
這裡寫圖片描述
執行masm.exe:
這裡寫圖片描述
由於我所寫的彙編檔案已經在當前目錄下,所以無需指定路徑:
這裡寫圖片描述
具體解釋下輸入的四行:
第1行:指定操作的*.asm的檔案,如果不在此目錄下需要指定絕對路徑(我嫌麻煩所以就直接放同級目錄了)
第2行:生成的*.obj檔案,同樣可以指定目錄,這裡為預設(同級目錄下與.asm檔名相同的.obj檔案)
第3行:列表檔案的名稱,這個檔案是編譯器將源程式編譯為目標檔案的過程中產生的中間結果。可以讓編譯器不生成這個檔案,直接按ENTER鍵即可。
第4行:交叉引用檔案的名稱,同樣是中間檔案,可以不生成,直接ENTER。
執行完就生成了一個名為1.obj的檔案。
5、連線(一般link.exe在masm的資料夾內)
執行link.exe
這裡寫圖片描述

由於1.obj已經在當前目錄下,所以無需指定路徑:
這裡寫圖片描述
具體解釋一下輸入的四行:
第1行:指定操作的*.obj的檔案
第2行:生成的*.exe檔案,同樣可以指定目錄,這裡為預設
第3行:映像檔案的名稱,是中間檔案,ENTER
第4行:庫檔案的名稱,庫檔案裡面包含了一些可以呼叫的子程式,如果程式中呼叫了某一個庫檔案中的子程式,就需要在連線的時候,將這個庫檔案和目標檔案連結到一起,生成可執行檔案,但這個程式沒有呼叫任何子程式,所以直接ENTER
最後一行有一個警告提示:”沒有棧段“,先不理會。
執行完就生成了一個名為1.exe的檔案。
連線的作用:
-當程式很大時,可以將它分為多個源程式檔案來編譯,每個源程式編譯成為目標檔案後,再用連線程式將它們連線在一起,生成一個可執行檔案
-程式中呼叫了某個庫檔案中的子程式,需要將這個庫檔案和該程式生成的目標檔案連線到一起,生成一個可執行檔案
-正常什麼都不需要的話也需要通過連線來生成一個可執行的檔案才可以執行。
6、執行
這裡寫圖片描述

很奇怪,程式執行未出現任何結果,為什麼?
因為程式執行了,我們在程式碼中未向顯示器輸出任何資訊,程式只是做了一些將資料送入暫存器和加法的操作,這些事情並不能從螢幕上看出來,程式執行完成後返回,螢幕上再次出現作業系統的提示符。

程式執行的過程
在DOS(一個單任務作業系統)的基礎上,簡單討論:
一個程式2在可執行檔案中,必須有一個正在執行的程式1,將2從可執行檔案中載入記憶體後,將CPU的控制權交給2,2才能得以執行,2開始執行後,1暫停執行
2執行完畢後,應該將CPU的控制權交還給使他執行的程式1,此後,繼續執行。

在本程式中:
-在DOS中直接執行1.exe時,是正在執行的cmd,將1.exe中的程式載入入記憶體
-cmd設定CPU的CS:IP指向程式的第一條指令(即程式的入口),從而使程式得以執行
-程式執行結束後,返回cmd中,CPU繼續執行cmd。