組合語言03 第乙個匯程式設計序

2021-06-23 03:34:11 字數 2950 閱讀 1094

整理自魚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...