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