4.1一個源程序從寫出到執(zhí)行的過程
成都創(chuàng)新互聯(lián)科技有限公司專業(yè)互聯(lián)網(wǎng)基礎(chǔ)服務(wù)商,為您提供服務(wù)器托管,高防主機,成都IDC機房托管,成都主機托管等互聯(lián)網(wǎng)服務(wù)。
一個匯編語言程序從寫出到最終執(zhí)行的簡要過程:
編寫~編譯連接~執(zhí)行
1、編寫:使用文本編輯器(如記事本、nodepad++、UltraEdit等),用匯編語言編寫匯編源程序。
2、對源程序編譯連接:使用匯編語言編譯程序(MASM.EXE)對源程序文件中的源程序進行編譯,? 產(chǎn)生目標(biāo)文件;再用連接程序(LINK.EXE)對目標(biāo)文件進行連接,生成可在操作系統(tǒng)中直接運行的可執(zhí)行文件。
?可執(zhí)行文件包含兩部分內(nèi)容:
?程序(從源程序中的匯編指令翻譯過來的機器碼)和數(shù)據(jù)(源程序中定義的數(shù)據(jù))
?相關(guān)的描述信息(比如:程序有多大、要占多少內(nèi)存空間等)
3、執(zhí)行可執(zhí)行文件中的程序:操作系統(tǒng)依照可執(zhí)行文件中的描述信息,將可執(zhí)行文件中的機器碼和數(shù)據(jù)加載入內(nèi)存,并進行相關(guān)的初始化(比如:設(shè)置CS:IP指向第一條要執(zhí)行的指令),然后由cpu執(zhí)行程序。
4.2源程序
匯編指令? 有對應(yīng)的機器碼的指令,可以被編譯成機器指令,最終為cpu所執(zhí)行。
偽指令? 沒有對應(yīng)的機器碼的指令,最終不被cpu所執(zhí)行。是由編譯器來執(zhí)行的指令,編譯器根據(jù)? ? ? ? ? ? ? ? ?偽指令來進行相關(guān)的編譯工作。
定義一個段? ? ?segment和ends是成對使用的偽指令,在寫被編譯器編譯的匯編程序時,必須要用? ? ? ? ? ? ? ? ? ? ? ? ?到的一對偽指令,其功能是定義一個段,segment說明一個段開始,ends說明一個? ? ? ? ? ? ? ? ? ? ? ? ?段結(jié)束。
?(一個段必須有一個名稱來標(biāo)識,使用格式為:段名 segment? ? 段名 ends)
一個匯編程序由多個段組成,這些段被用來存放代碼,數(shù)據(jù),或當(dāng)作棧空間來使用。
end是一個匯編程序的結(jié)束標(biāo)記
assume含義為假設(shè) 其假設(shè)某一段寄存器和程序中的某一個用segment...?ends定義的段相關(guān)聯(lián)。?
源程序中的“程序”
匯編源程序:
偽指令(編譯器處理)
匯編指令(編譯為機器碼)
程序:源程序中最終由計算機執(zhí)行、處理的指令或數(shù)據(jù)。
標(biāo)號
一個標(biāo)號指代了一個地址
codesg:放在segment的前面,作為一個段的名稱,這個段的名稱最終將被編譯、連接程序處理為一個段的段地址。
一個程序結(jié)束后,將cpu的控制權(quán)交還給使它得以運行的程序,我們稱這個過程為:程序返回
應(yīng)該在程序末尾添加返回的程序段。
? mov ax,4c00H
? int 21H
? 這兩條指令所實現(xiàn)的功能就是程序返回
段結(jié)束 程序結(jié)束 程序返回
編譯和連接
連接的作用:
?當(dāng)源程序很大時,可以將它分為多個源程序文件夾來編譯,每個源程序編譯成為目標(biāo)文件后,再? ? ?用連接程序?qū)⑺麄冞B接到一起,生成一個可執(zhí)行文件;
?程序中調(diào)用了某個庫文件中的子程序,需要將這個庫文件和該程序生成的目標(biāo)文件連接到一起,? ? ?生成一個可執(zhí)行文件。
?一個源程序編譯后,得到了存有機器碼的目標(biāo)文件,目標(biāo)文件中有些內(nèi)容不能直接用來生成執(zhí)行? ? ?文件,連接程序?qū)⑦@些內(nèi)容處理為最終的可執(zhí)行文件。
4.8可執(zhí)行文件中的程序裝入內(nèi)存并運行的原理?
1.exe的執(zhí)行過程:
??(1)我們在提示符”G:\TRY“后面輸入可執(zhí)行文件的名字”1“,按enter鍵。
??(2)1.exe中的程序運行;
? (3)運行結(jié)束,返回,再次顯示提示符”G:\TRY"。
操作系統(tǒng)的外殼shell
匯編程序從寫出到執(zhí)行的過程:
4.9程序執(zhí)行過程的跟蹤
debug可以將程序加載入內(nèi)存,設(shè)置CS:IP指向程序的入口,但debug并不放棄對cpu的控制,這樣,我們就可以使用debug的相關(guān)命令來單步執(zhí)行程序,查看每條指令的執(zhí)行結(jié)果。
程序加載后,ds中存放著程序所在內(nèi)存區(qū)的段地址,這個內(nèi)存區(qū)的偏移地址為0,則程序所在的內(nèi)存區(qū)的地址為:ds:0;
這個內(nèi)存區(qū)的前256個字節(jié)中存放的是PSP,dos用來和程序進行通信。
從256字節(jié)處向后的空間存放的是程序。
所以 PSP的段地址SA,偏移地址為0,物理地址為SA*16+0.。
要使用P命令執(zhí)行int21。
5.1[bx]
[bx]和[0]有些類似,[0]表示內(nèi)存單元,它的偏移地址是0.
(1)內(nèi)存單元的地址:
(2)內(nèi)存單元的長度。
我們用[0]表示一個內(nèi)存單元時,0 表示單元的 偏移地址,段地址默認在ds中,單元的長度 (類型)可以由具體指令中的其他操作對象 (比如說寄存器)指出如前邊的AX.AL。
[bx]同樣也表示一個內(nèi)存單元,它的偏移地址在bx中,比如下面的指令:
mov ax,[bx]
mov al, [bx]
loop循環(huán)
描述性符號()
pop ax?
(ax)=((ss)*16+(sp))
(sp)=(sp)+2
idata表示常量
mov ax,[bx] 功能:bx中存放的數(shù)據(jù)作為一個偏移地址 EA ,段地址SA 默認在ds中,將SA:EA處 的教據(jù)送入ax中 即(ax)=(ds*16+(bx))
5.2loop
指令的格式是:loop標(biāo)號,CPU 執(zhí)行l(wèi)oop指令的時候,要進行兩步操作:
1、(cx)?=(cx)-1
2、?判斷cx中的值,不為零則轉(zhuǎn)至標(biāo)號處執(zhí)行程序,如果為零則向下執(zhí)行。
通常用loop實現(xiàn)循環(huán)功能,cx中存放循環(huán)次數(shù)
mov cx,循環(huán)次數(shù)
s:
? 循環(huán)執(zhí)行的程序段
? loops
利用加法計算123*236
assume cs:code
code segment
mov ax,0
mov cx,236
s:add ax,123
loop s
mov ax,4c00h
int 21h
code ends
end
5.3在debug中跟蹤用loop指令實現(xiàn)的循環(huán)程序
苜先,將其編輯為源程序文件,文件名 定為 p3.asm:對其進行編譯連接后生成 p3.exe:然后西用Debug對p3.exe中的程序進行跟蹤。
5.5loop和[bx]的聯(lián)合應(yīng)用
計算ffff:0~ffff:b單元中的數(shù)據(jù)的和,結(jié)果存儲在dx中。
(1)運算后的結(jié)果是否會超出dx 所能存儲的范圍?
ffff0~ffffb內(nèi)存單元中的數(shù)據(jù)是字節(jié)型數(shù)據(jù),范圍在0~255之間,12個這樣的數(shù)據(jù)相加,結(jié)果不會大于 65535,可以在dx中存放下。
(2)是否能將量0~ffffb中的數(shù)據(jù)直接累加到dx?
不行,因為量:0~ffffb中的數(shù)據(jù)是8位 的,不能直接加到16位寄存器dx中
5.7一段安全的空間
在8086模 式中,隨意向一 段內(nèi)存空間寫入內(nèi)容是很危險的,因為這段空間中可能存放著重要的系統(tǒng)數(shù)據(jù)或代碼。
比如下面的指令:
mov ax.1000h
mov ds.ax
mov al.0
mov ds:[0],al??
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
當(dāng)前名稱:匯編語言4,5章學(xué)習(xí)筆記-創(chuàng)新互聯(lián)
URL分享:http://m.newbst.com/article18/dpgddp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、Google、網(wǎng)站內(nèi)鏈、網(wǎng)站制作、域名注冊、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容