整理自魚c論壇課件
匯程式設計序編寫步驟
編寫源**->使用masm.exe進行編譯,產生目標檔案->用link.exe,對目標檔案進行鏈結,生成可執行檔案
可執行檔案中包含兩部分內容
1,程式和資料
2,相關的描述資訊(程式有多大,要占用多少記憶體空間等)
源程式:
assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00h
int 21h
abc ends
end有對應的機器碼的指令,可以被編譯為機器指令,最終為cpu所執行。
源程式中:
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00h
int 21h
為彙編指令,會被編譯為機器指令
沒有對應的機器碼的指令,最終不被cpu所執行。
偽指令是由編譯器來執行的指令,編譯器根據偽指令來進行相關的編譯工作。
segment和ends是一對成對使用的偽指令,這是在寫可被編譯器編譯的匯程式設計序時,必須要用到的一對偽指令。
segment和ends的功能是定義乙個段,segment說明乙個段開始,ends 說明乙個段結束。
乙個段必須有乙個名稱來標識,使用格式為:
段名 segment
… …段名 ends
乙個匯程式設計序是由多個段組成的,這些段被用來存放**、資料或當作棧空間來使用。
乙個有意義的匯程式設計序中至少要有乙個段,這個段用來存放**。
end 是乙個匯程式設計序的結束標記,編譯器在編譯匯程式設計序的過程中,如果碰到了偽指令 end,就結束對源程式的編譯。
如果程式寫完了,要在結尾處加上偽指令end 。否則,編譯器在編譯程式時,無法知道程式在何處結束。
切記:不要搞混了end和ends。
它假設某一段暫存器和程式中的某乙個用 segment … ends 定義的段相關聯。
通過assume說明這種關聯,在需要的情況下 ,編譯程式可以將段暫存器和某乙個具體的段相聯絡。
偽指令 (編譯器處理)
彙編指令(編譯為機器碼)
程式:源程式中最終由計算機執行、處理的指令或資料。
我們可以將源程式檔案中的所有內容稱為源程式,將源程式中最終由計算機執行處理的指令或資料 ,成為程式。
程式最先以彙編指令的形式存在源程式中,經編譯、連線後轉變為機器碼,儲存在可執行檔案中。
請看圖!
程式經編譯連線後變為機器碼
源程式:
標號:乙個標號指代了乙個位址。
codesg:放在segment的前面,作為乙個段的名稱,這個段的名稱最終將被編譯、連線程式處理為乙個段的段位址。
我們的程式最先以彙編指令的形式存在源程式中,經編譯、連線後轉變為機器碼,儲存在可執行檔案中,那麼,它怎樣得到執行呢?
dos中的程式執行
dos是乙個單任務作業系統。乙個程式p2在可執行檔案中,則必須有乙個正在執行的程式p1,將p2從可執行檔案中加載入記憶體後,將cpu的控制權交給p2,p2才能得以執行。
p2開始執行後,p1暫停執行。而當p2執行完畢後,應該將cpu的控制權交還給使它得以執行的程式p1,此後,p1繼續執行。
現在,我們知道,乙個程式結束後,將cpu的控制權交還給使它得以執行的程式,我們稱這個過程為:程式返回。
最後如何返回呢?
應該在程式的末尾新增返回的程式段。
mov ax,4c00h
int 21h
這兩條指令所實現的功能就是程式返回。
作業系統的外殼
作業系統是由多個功能模組組成的龐大 、複雜的軟體系統。任何通用的作業系統 ,都要提供乙個稱為shell(外殼)的程式 ,使用者(操作人員)使用這個程式來操作計算機系統工作。
dos中有乙個程式command.com ,這個程式在 dos 中稱為命令直譯器,也就是dos系統的shell。
(1)我們在dos中直接執行 1.exe 時,是正在執行的command將1.exe中的程式加載入記憶體。
(2)command設定cpu的cs:ip指向程式的第一條指令(即程式的入口),從而使程式得以執行。
(3)程式執行結束後,返回到command中,cpu繼續執行command。
假如彙編原始檔放在:d:\develop\asm_program\first_asm\下,檔名為1.asm
1.asm內容:(求2^3)
assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00h
int 21h
abc ends
endwin+r,輸入cmd
進入命令列,輸入
c:\users\administrator>d:
d:\>cd develop\asm_program\first_asm
至此,進入了源程式所在目錄,之後,輸入:
d:\develop\asm_program\first_asm>masm 1.asm
這樣,程式就被編譯好了,在1.asm資料夾下出現了乙個1.obj的檔案
之後,再輸入:
link 1.obj之後回車
這樣,就生成了1.exe檔案,即可執行檔案
但是由於作業系統是64位的,不能直接執行這個檔案,所以,需要使用dosbox進行執行
開啟dosbox,輸入:
mount c d:\develop\asm_program\first_asm\
之後,輸入c:
然後輸入debug 1.exe
就使用debug開啟了1.exe了
可以輸入r命令檢視當前暫存器的狀態,在我的機器上狀態如下:
cx暫存器中記錄了程式的大小
輸入t命令進行單步執行
注意,執行到最後一句int 21時,要使用p命令執行
第乙個匯程式設計序hello world
程式原始碼如下 assume cs code,ds data 定義 段和資料段框架 data segment 資料段 msg db hello world 定義字串 data ends code segment 段 start mov ax,data mov ds,ax 資料段初始化 mov bx,...
01 第乙個匯程式設計序
在閱讀 x86組合語言 從實模式到保護模式 這本書的時候,從b站上看到 教程,使用虛擬機器然後將彙編檔案寫入磁碟0面0扇區,然後啟動,在螢幕輸出字元,這個程式本身就很簡單,之前學習過王爽的彙編,知道視訊記憶體位置08b00h,字低8位是ascii編碼,高8位是字元的顏色 但是在看 的 發現不同之處 ...
組合語言第乙個程式
接下來,我們開始真正學寫匯程式設計序,前面都是鋪墊知識,我和大家一起學習,如果 講的不好或講錯了,謝謝大家幫我指出。assume cs codesg codesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h i...