網(wǎng)站框架指的是什么百度公司推廣電話
《匯編語言》- 讀書筆記 - 第4章-第一個程序
- 4.1 一個源程序從寫出到執(zhí)行的過程
- 4.2 源程序
- 程序 4.1
- 1. 偽指令
- 1.1 segment ends 聲明段
- 1.2 end 結(jié)束標記
- 1.3 assume 關(guān)聯(lián)
- 2. 源程序中的“程序”
- 3. 標號
- 4. 程序的結(jié)構(gòu)
- 5. 程序返回
- 6. 語法錯誤和邏輯錯誤
- 4.3 編輯源程序
- 4.4 編譯
- 4.5 連接
- 4.6 以簡化的方式進行編譯和連接
- 4.7 執(zhí)行exe
- 4.8 誰將可執(zhí)行文件中的程序裝載進入內(nèi)存并使它運行?
- 問題 4.1
- 問題 4.2
- 操作系統(tǒng)的shell
- 4.9 程序執(zhí)行過程的跟蹤
- 實驗3 編程、編譯、連接、跟蹤
4.1 一個源程序從寫出到執(zhí)行的過程
- 第一步:編寫匯編源程序。
- 第二步:對源程序進行編譯連接。
可執(zhí)行文件包含兩部分內(nèi)容- 程序(從源程序中的匯編指令翻譯過來的機器碼)和數(shù)據(jù)(源程序中定義的)
- 相關(guān)的描述信息(比如,程序有多大、要占用多少內(nèi)存空間等)
- 第三步:執(zhí)行可執(zhí)行文件中的程序。
操作系統(tǒng)依照可執(zhí)行文件中的描述信息,將可執(zhí)行文件中的機器碼和數(shù)據(jù)加載入內(nèi)存,并進行相關(guān)的初始化(比如設(shè)置 CS:IP 指向第一條要執(zhí)行的指令),然后由 CPU 執(zhí)行程序。
4.2 源程序
程序 4.1
assume cs:codesg
codesg segmentmov ax, 0123Hmov bx, 0456Hadd ax, bxadd ax, axmov ax,4c00Hint 21H
codesg ends
end
1. 偽指令
匯編指令:會被編譯為機器指令,最終為 CPU 所執(zhí)行。
而偽指令:沒有對應(yīng)的機器指令,它被用來輔助編譯器進行相關(guān)的編譯工作。
1.1 segment ends 聲明段
段名 segment; 代碼...
段名 ends
segment
和 ends
是一對偽指令,功能是定義一個段,segment 說明一個段開始,ends 說明一個段結(jié)束。一個段必須有一個名稱來標識。
一個匯編程序是由多個段
組成的,指令
、數(shù)據(jù)
、棧
,被劃分到了不同的段中。
一個有意義的匯編程序中至少要有一個段,這個段用來存放代碼。
1.2 end 結(jié)束標記
編譯器在編譯匯編程序的過程中,碰到了偽指end,就結(jié)束對源程序的編譯。
1.3 assume 關(guān)聯(lián)
用于將特定的段
與相關(guān)段寄存器
建立關(guān)聯(lián)。
assume cs:codesg
將代碼段的段 codesg 和段寄存器 cs 聯(lián)系起來。
2. 源程序中的“程序”
程序最先以匯編指令的形式存在源程序中,經(jīng)編譯、連接后轉(zhuǎn)變?yōu)闄C器碼,存儲在可執(zhí)行文件中。這個過程如圖 4.2 所示。
3. 標號
匯編源程序中,除了匯編指令
和偽指令
外,還有一些標號
,比如codesg
。它指代了一個地址。
比如 codesg
在 segment
的前面,作為一個段的名稱,這個段的名稱最終將被編譯、連接程序處理為一個段的段地址。
4. 程序的結(jié)構(gòu)
源程序是由一些段
構(gòu)成的。
任務(wù): 編程運算 2^3。源程序應(yīng)該怎樣來寫呢?
assume cs:abc ; 將 abc 和 cs 建立關(guān)聯(lián),當(dāng)作代碼段。
abc segment ; 定義一個段,名稱為 abcmov ax,2 ; 在段中寫入?yún)R編指令 1add ax,ax ; 在段中寫入?yún)R編指令 2add ax,ax ; 在段中寫入?yún)R編指令 3; 這里還缺程序返回指令,后面自己補上。
abc ends ; 段 abc 結(jié)束
end ; 指出程序在何處結(jié)束
5. 程序返回
程序原本只是躺在硬盤中的一坨二進制數(shù)據(jù)。
執(zhí)行程序的流程:(這里討論的是DOS系統(tǒng))
- 程序A將程序B加載到內(nèi)存。
- 程序A將CPU控制權(quán)交給程序B。
- 程序B執(zhí)行。
- 程序B執(zhí)行完畢,程序返回。交出CPU控制權(quán)。
- 程序A拿到CPU控制權(quán),繼續(xù)執(zhí)行。
程序返回指令如下:(書上說先死記,后面會講)
mov ax, 4c00H
int 21H
表4.1 與結(jié)束相關(guān)的概念
目的 | 相關(guān)指令 | 指令性質(zhì) | 指令執(zhí)行者 |
---|---|---|---|
通知編譯器一個段結(jié)束 | 段名 ends | 偽指令 | 編譯時,由編譯器執(zhí)行 |
通知編譯器程序結(jié)束 | end | 偽指令 | 編譯時,由編譯器執(zhí)行 |
程序返回 | mov ax,4c00H int 21H | 匯編指令 | 執(zhí)行時,由 CPU 執(zhí)行 |
6. 語法錯誤和邏輯錯誤
語法錯誤:編譯器能發(fā)現(xiàn)。
邏輯錯誤:跑起來看了效果才知道。
4.3 編輯源程序
任何你熟悉的文本編輯器都可以。
4.4 編譯
- 將源文件保存得到
test.asm
- 編譯:
masm test.asm
得到目標文件test.obj
。(也可以直接輸入masm
回車,交互式設(shè)置編譯參數(shù) )
4.5 連接
連接的作用:
- 根據(jù)需要將源程序分為多個來編譯,得到多個目標標文件后,再連接生成一個可執(zhí)行文件;
- 程序中調(diào)用了某個庫文件中的子程序,需要將這個庫文件和該程序生成的目標文件連接到一起,生成一個可執(zhí)行文件;
- 一個源程序編譯后,得到了存有機器碼的目標文件,目標文件中的有些內(nèi)容還不能直接用來生成可執(zhí)行文件,連接程序?qū)⑦@些內(nèi)容處理為最終的可執(zhí)行信息。所以,在只有一個源程序文件,而又不需要調(diào)用某個庫中的子程序的情況下,也必須用連接程序?qū)δ繕宋募M行處理,生成可執(zhí)行文件。
使用微軟的 Overlay Linker3.60 連接器,文件名為 link.exe
4.6 以簡化的方式進行編譯和連接
末尾加分號 ;
表示都用默認參數(shù):
masm test.asm;
link test.obj;
當(dāng)然還有更簡化的,我們直接用 ML.exe
4.7 執(zhí)行exe
我們的 test.exe
只是對寄存器進行操作。直接執(zhí)行是看不到效果的,debug調(diào)試一下,就能看到效果了。(作者說后面會介紹輸出到屏幕的程序,不過要幾章之后去了)
4.8 誰將可執(zhí)行文件中的程序裝載進入內(nèi)存并使它運行?
我們在前面講過,在 DOS 中,可執(zhí)行文件中的程序 P1 若要運行,必須有一個正在運行的程序 P2,將 P1 從可執(zhí)行文件中加載入內(nèi)存,將 CPU 的控制權(quán)交給它,P1 才能得以運行;當(dāng) P1 運行完畢后,應(yīng)該將 CPU 的控制權(quán)交還給使它得以運行的程序 P2。
按照上面的原理,再來看一下 4.7 節(jié)中 test.exe 的執(zhí)行過程(思考相關(guān)的問題)。
- 在提示符
c:\
后面輸入可執(zhí)行文件的名字test
,按 Enter 鍵。這時,請思考問題 4.1。 - l.exe 中的程序運行。
- 運行結(jié)束,返回,再次顯示提示符“c:masm’。請思考問題 4.2。
問題 4.1
此時,有一個正在運行的程序?qū)?test.exe
中的程序加載入內(nèi)存,這個正在運行的程序是什么? 它將程序加載入內(nèi)存后,如何使程序得以運行?
- 在 DOS 中直接執(zhí)行
test.exe
時,是正在運行的 shell 程序 command,將其加載入內(nèi)存。 command
設(shè)置 CS:IP 指向test.exe
的第一條指令(即程序的入口),從而使test.exe
得以運行。
問題 4.2
程序運行結(jié)束后,返回到哪里?
- 程序運行結(jié)束后,返回到
command
。
操作系統(tǒng)的shell
操作系統(tǒng)是由多個功能模塊組成的龐大、復(fù)雜的軟件系統(tǒng)。任何通用的操作系統(tǒng),都要提供一個稱為 shell外殼)的程序,用戶(操作人員)使用這個程序來操作計算機系統(tǒng)進行工作。
DOS 中有一個程序command.com
,這個程序在 DOS 中稱為命令解釋器
,也就是 DOS 系統(tǒng)的shell
。
DOS 啟動時,先完成其他重要的初始化工作,然后運行command.com
,command.com
運行后,執(zhí)行完其他的相關(guān)任務(wù)后,在屏幕上顯示出由當(dāng)前盤符和當(dāng)前路徑組成的提示符,比如:c:\
或“c:\windows`等,然后等待用戶的輸入。
用戶可以輸入所要執(zhí)行的命令,比如,cd、dir、 type 等,這些命令由command
執(zhí)行,command 執(zhí)行完這些命令后,再次顯示由當(dāng)前盤符和當(dāng)前路徑組成的提示符,等待用戶的輸入。
如果用戶要執(zhí)行一個程序,則輸入該程序的可執(zhí)行文件的名稱,command
首先根據(jù)文件名找到可執(zhí)行文件,然后將這個可執(zhí)行文件中的程序加載入內(nèi)存,設(shè)置 CS:IP 指向程序的入口。此后,command
暫停運行,CPU運行程序。程序運行結(jié)束后,返回到command
中,command
再次顯示由當(dāng)前盤符和當(dāng)前路徑組成的提示符,等待用戶的輸入。
在 DOS 中,command
處理各種輸入:命令
或要執(zhí)行的程序
的文件名。我們就是通過command
來進行工作的。
4.9 程序執(zhí)行過程的跟蹤
在 DOS 系統(tǒng)中EXE 文件中的程序的加載過程
debug test.exe
CX:存放程序的長度。
DS:存放程序所在內(nèi)存區(qū)的段地址。
CS:CS = DS + 10H。
PSP:此內(nèi)存區(qū)的前256字節(jié)(100H),是DOS用來與程就進行通信的。
程序:PSP之后就是程序。物理地址:SA16 + 0 + 256 = SA * 16 + 1616 +0 = (SA+16) * 16 + 0
段地址:偏移地址表示為 SA+10H:0
- 單步執(zhí)行用
T
- 執(zhí)行到
int 21
用P
,正常執(zhí)行結(jié)束會顯示Program terminated normally
,然后回到debug
中。(因為是 Debug 加載程序進內(nèi)存執(zhí)行的)
實驗3 編程、編譯、連接、跟蹤
《匯編語言》- 讀書筆記 - 實驗3 編程、編譯、連接、跟蹤