彙編學習筆記:第一個程序,Hello World!!!

==============第一個程序,Hello World!!!===========================
編寫執行過程:
1:用文本編輯器編寫彙編源程序
2:對源程序進行編譯連接,使用彙編語言編譯程序對源文件中的程序進行編譯,產生目標文件。
   再用連接程序對目標程序進行連接,生成可在操作系統中直接運行的可執行文件(.exe)。
3:由操作系統執行可執行文件中的程序


可執行文件包含兩部分內容:
1:程序(從源程序中的彙編指令翻譯過來的機器碼)和數據(源程序中定義的數據)。
2:相關描述信息(比如,程序有多大,佔用多少內存空間等等)


assume cs:codesg // 通過assume語句,把段及要關聯的段寄存器進行聲明


codesg segment // 聲明一個段的開始
	mov ax,0123H
	mov bx,0456H
	add ax,bx
	add ax,ax


	mov ax,4c00H
	int 21H
codesg ends // 聲明一個段的結束


end // 程序結束,編譯器結束對源程序的編譯




源程序的組成:
一.僞指令:彙編源程序中,包含兩種指令,一種是彙編指令,一種是僞指令。


彙編指令有對應的機器碼,可以被編譯爲機器指令,最終由CPU執行。
僞指令沒有對應的機器碼,由編譯器來執行僞指令,編譯器根據僞指令來進行相關的編譯工作。


上面的程序代碼中包含三種僞指令
1):codesg segment
   codesg ends
segment和ends是一對成對用的僞指令,功能是定義一個段,segment用於一個段的開始,ends用於一個段的結束。


一個段必須用一個名稱來標示,使用格式爲:
段名 segment
...
段名 ends


一個彙編程序由多個段組成,這些段被用來存放代碼,數據或當做棧空間來使用。
一個源程序中所有被計算機所處理的信息:指令、數據、棧,被劃分了不同的段中。


2):end
end是一個彙編程序的技術標記,編譯器在編譯彙編源程序過程中,如果碰到了僞指令end,就結束對源程序的編譯。


3):assume
僞指令assume詳細解釋:
1:assume的作用僅僅是告訴編譯器,我碰到一個標號,要計算它的物理地址的時候,從哪一個段寄存器裏面取出段值,
至於這個段寄存器的值對不對,那它就不管了,這是程序員的事情,反正它只管根據assume裏面的設定來用段寄存器,
所以,對於程序員來說,不僅要用assume告訴編譯器計算物理地址的時候要從哪一個段寄存器取值,而且要在指令中明確的把對應段的段值送到設定好的段寄存器中。 
2:該命令用來通知彙編程序,CS、DS、SS、ES將被設定爲哪些段的段基址寄存器,從而在彙編時能夠知道,語句中引用的變量或標號是通過哪些寄存器進行訪問的。
3:是指明變量與段寄存器的聯繫,比如assume ds:data,
它是告訴編譯器以後所有在data段中定義的變量尋址時,使用ds作爲段地址,但是它不對程序作任何事,比如你必須自己對ds賦值


二.源程序中的程序
源程序文件中的所有內容稱爲源程序,將源程序中最終由計算機執行,處理的指令或數據稱爲程序。


三.標號
除了彙編指令和僞指令外,還有一些標號,比如codesg,一個標號指代了一個地址。
比如codesg在segment的前面,作爲一個段的名稱,這個段的名稱最終將被編譯、連接程序處理爲一個段的段地址。


四.程序的結構
計算2^3:
1): 定義一個段,名稱爲abc
abc segment
abc ends


2):在這段中寫入彙編指令,實現我們的任務
abc segment
  mov ax,2
  add ax,ax
  add ax,ax
abc ends


3):然後,要指出程序在何處結束
abc segment
  mov ax,2
  add ax,ax
  add ax,ax
abc ends


end


4):與相應的段寄存器相關聯
assume cs:abc


abc segment
  mov ax,2
  add ax,ax
  add ax,ax
abc ends


end


五.程序返回
一個程序結束後,將CPU的控制權交還給使它得以運行的程序,我們稱這個過程爲程序返回。
所以,我們在程序的末尾添加返回的程序段
mov ax 4c00H
int 21H
這兩條指令所實現的功能就是程序返回。


編譯源程序:


將源程序文件保存爲filename.asm。
1.進入dos,進入編譯器所在目錄,c:\masm,運行masm.exe
2.然後提示輸入被編譯的源程序文件的名稱,然後按回車鍵。
3.程序提示我們輸入要編譯出的目標文件的名稱,這裏直接按回車,使用它默認提供的.obj文件名。
4.程序提示輸入列表文件的名稱,直接Enter即可。
5.程序提示輸入交叉引用文件的名稱,直接Enter即可。




編譯結束,編譯過程中,我們提供了一個輸入,即源程序文件,
最多可以得到三個輸出:目標文件(.obj)、列表文件(.lst)、交叉引用文件(.crf)。這三個文件中,目標文件使我們最終想要的結果,另外兩個只是中間文件,可以讓編譯器忽略對它們的生成,直接Enter。


連接:


在對源程序進行編譯得到目標文件後,我們需要對目標文件(.obj)進行連接,從而得到可執行文件(.exe)。
1.進入dos,進入編譯器所在目錄,c:\masm,運行link.exe
2.提示輸入要被連接的目標文件的名稱,然後按回車鍵。
3.提示輸入要生成可執行文件的名稱,使用默認提供的名稱即可,直接按回車鍵。
4.提示輸入映像文件的名稱,屬於連接可執行文件過程中的中間文件,可以忽略不生成,直接Enter。
5.提示輸入庫文件的名稱,庫文件中包含了一些可被調用的子程序,如果程序中調用了某一個庫文件中的子程序,就需要在連接的時候,將這個庫文件和目標文件連接到一起,生成可執行文件,但是這個程序沒有調用任何子程序,直接忽略Enter即可。


以簡化的方式進行編譯和連接:
進入dos,進入編譯器所在目錄,c:\masm
輸入:masm c:\1;  結尾加分號,這樣直接生成目標文件,忽略中間文件。
link 1; 直接生成可執行文件1.exe,忽略中間文件。
發佈了23 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章