匯編語言-運行程序


匯編語言-一個程序

程序從寫出到執行

源程序

這是一段簡單的匯編源程序代碼,在匯編語言源程序中,包含兩種指令,種是匯編指令,種是偽指令。匯編指令是有對應的機器碼的指令,可以被編譯為機器指令,最終為CPU所執行。而偽指令沒有對應的機器指令,最終不被CPU所執行。那么誰來執行偽指令呢?偽指令是由編譯器來執行的指令,編譯器根據偽指令來進行相關的編譯工作。

assume cs:codesg
	codesg segment
		mov ax,0123H
		mov bx,0456H 
		add ax,bx 
		add ax,ax 
		mov ax,4c00H 
		int 21H
	codesg ends 
end

如上面顯示的代碼,codesg segmentcodesg ends是一組成對使用的偽指令,他們定義了一個段codesg,分別對應着段的開始和結束。一個匯編程序是由多個段組成的,這些段被用來存放代碼、數據或當作棧空間。

end是一個匯編程序的結束標記,編譯器在編譯匯編程序的過程中,如果碰到了偽指令end,就結束對源程序的編譯。所以,在我們寫程序的時候,如果程序寫完了,要在結尾處加上偽指令end。否則,編譯器在編譯程序時,無法知道程序在何處結束。

assume這條偽指令的含義為假設”。它假設某一段寄存器和程序中的某一個用segment...ends定義的段相關聯。通過assume說明這種關聯,在需要的情況下,編譯程序可以將段寄存器和某一個具體的段相聯系。

通過指令匯編指令mov ax,4c00H 和int 21H,實現程序的返回功能,以8086CPU為例,開機后運行的command控制台,當程序運行時將控制權交與程序,程序運行結束后,又將控制權返回給控制台。關於上面的兩條指令是如何實現將控制權返還給控制台,會在之后的章節詳細介紹。

編譯和鏈接源程序

當我們寫好一個程序后,將其保存為file.asm 文件,通過masm編譯器實現編譯功能,編譯器會根據代碼編譯出.obj 文件,之后再進行鏈接操作,使用命令link file.obj,即可實現鏈接功能生成.exe文件。

現在已是2021年,想要重新實現8086CPU不太現實的事情,這里提供幾個可以代替的方法:

  1. emu8086
  2. DOSbox

對於第1種方法,他本身集成,無需控制指令,有完整的圖形化界面。
對於第2種方法它是一個仿 DOS界面,具體操作可以轉到enter link description here

執行程序

以dosbox如果只想執行程序,在鏈接出.exe文件后,直接輸入文件名即可(無需exe后綴)。若想debug程序,需要debug file.exe(文件全名)。

在命令控制台去執行程序,首先它會將我們的目標程序從可執行文件加載到內存中,將CPU的控制權交給目標程序,該程序才可運行。程序運行結束后,又將控制權返還給當初使它運行的程序。

debug程序

如果我們運行一個程序,需要一個程序去調用另一個程序,並將控制權交給他,直到程序運行結束將控制全返還。很容易想到,若是在debug程序的過程中,控制前在程序手中,我們是無法控制程序的操作命令的,在debug的過程中,雖然我們在執行程序,但控制權仍然在command中。

debug后,可以看到,Debug將程序從可執行文件加載入內存后,cx中存放的是程序的長度。hello.exe中程序的機器碼共有15個字節。則hello.exe加載后,cx中的內容為000FH。現在程序已從hello.exe中裝入內存,接下來查看一下它的內容,可是我們查看哪里的內容呢?程序被裝入內存的什么地方?我們如何得知?這里,需要講解一下在DOS系統中EXE文件中的程序的加載過程。

那么,我們的程序被裝入內存的什么地方?我們如何得知?
(1)程序加載后,ds中存放着程序所在內存區的段地址,這個內存區的偏移地址為0,則程序所在的內存區的地址為ds:0;
(2)這個內存區的前256個字節中存放的是PSP,DOS用來和程序進行通信。從256字節處向后的空間存放的是程序。
所以,從ds中可以得到PSP的段地址SA,PSP的偏移地址為0,則物理地址為SA x 16+0

因為PSP占256(100H)字節,所以程序的物理地址是:SA x 16+0+256,可用段地址和偏移地址表示為:SA+10H:0

INT21執行后,顯示出"Programterminatednormally",返回到Debug中。表示程序正常結束。(注意,要使用P命令執行INT21。需要注意的是,在DOS中運行程序時,是command將程序加載入內存,所以程序運行結束后返回到command中,而在這里是Debug將程序加載入內存,所以程序運行結束后要返回到Debug中。)

使用Q命令退出Debug,將返回到command中,因為Debug是由command加載運行的。在DOS中用"debug hello.exe"運行Debug對hello.exe進行跟蹤時,程序加載的順序是:command加載Debug,Debug加載hello.exe。返回的順序是:從hello.exe中的程序返回到Debug,從Debug返回到command。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM