天天看點

彙編語言學習筆記4——編寫小程式

彙編指令:有機器碼與其一一對應。

僞指令:沒有對應的機器碼,最終不被cpu所執行,是由編譯器來執行的。

定義段

segment和ends是一對成對使用的僞指令,在寫可被編譯器編譯的彙程式設計式時,必須要用到這對指令。它們的功能是定義一個段,segment說明一個段的開始,ends說明一個段的結束。使用格式為:

段名 segment
段名 ends
           

一個彙程式設計式由一個或多個段組成,這些段用來存放代碼、資料或當作棧空間使用。

end僞指令

end是一個彙程式設計式的結束标記,編譯器在編譯彙程式設計式的過程中,如果碰到了僞指令end就結束對源程式的編譯。

assume僞指令

assume的意思是假設。

它假設某一段寄存器和程式中的某一個用segment和ends定義的段相關聯。這樣cpu可以知道這段代碼是資料還是指令。

标号

一個标号标号指代了一個位址。程式中定義的段名最終将被編譯、連接配接程式處理為一個段的段位址,這個位址就是标号。

程式的傳回

DOS系統是單任務系統,同一時刻隻能有一個程序在運作。如果要運作a程式,則需要一個正在運作的程式b将cpu控制權交給a程式,a程式運作完後再将cpu控制權返還給b程式,這個返還控制權的過程就是程式傳回。要實作這個功能,需要在程式的末尾添加一段程式:

mov ax,4c00H
int 21H
           

執行個體代碼

運算2^3^:

assume cs:code
code segment
start: mov ax,2     ;start代表程式入口,可以任意命名
       add ax,ax
       add ax,ax
       mov ax,4c00H
       int 21H      ;在debug中調試時這一步用p指令執行
code ends
end start
           

上述代碼經過masm編譯、連接配接之後可以生成一個可運作的exe檔案。

exe程式的加載過程

  • 先找到一段起始位址為SA:0000的容量足夠的空閑記憶體區;
  • 在這段記憶體區的前256個位元組中,建立一個稱為程式的字首(PSP)的資料區,Dos要利用PSP來和被加載的程式進行通信;
  • 從這段記憶體區的256位元組處開始(PSP後面),将程式裝入,程式的位址被設定為SA+10H:0;
  • 将該記憶體的段位址存入DS中,初始化其它相關寄存器後,設定CS:IP指向程式的入口。

轉載于:https://www.cnblogs.com/starsli/p/4749186.html

繼續閱讀