2019_7_03
3.硬盤和顯卡訪問和控制
1)用戶程序的結(jié)構(gòu)
分段辅斟,段的匯編地址和段內(nèi)匯編地址
一個(gè)規(guī)范的程序一忱,應(yīng)包括代碼段听皿,數(shù)據(jù)段,附加段和堆棧段静檬。
段的化分和段與段之間的界限在程序加載到內(nèi)存之前就已經(jīng)準(zhǔn)備好了炭懊。
定義段的匯編指令
SECTION 段名稱
SEGMENT 段名稱
每個(gè)段要求給出名字,即段名稱拂檩,用來引用一個(gè)段侮腹。可以為任意名字稻励,只要不重復(fù)和混淆父阻。
一旦定義段,后面的內(nèi)容都屬于該段望抽,除非出現(xiàn)另一個(gè)段的定義
有時(shí)加矛,程序不以段定義語句開始,這時(shí)煤篙,這些內(nèi)容默認(rèn)自成一個(gè)段斟览。典型情況整個(gè)程序都沒有段定義語句,這時(shí)辑奈,整個(gè)程序自成一個(gè)段趣惠。
section data1 align = 16
db 0x55
section data2 align = 16
db 0xaa
section data3 align = 16
db 0x99
一般情況:
section.段名稱.start
2)用戶程序頭部
加載器的編寫者及用戶程序的編寫者之間必須有一個(gè)協(xié)定,在用戶程序內(nèi)部的某固定位置包含一些基本結(jié)構(gòu)信息身害,每個(gè)用戶程序都必須把自己的情況放在這里,加載器也固定在這個(gè)位置讀取草戈。約定塌鸯,這個(gè)協(xié)定的地點(diǎn)放在程序開頭。即用戶程序頭部唐片。
SECTION header vstart = 0
程序頭部需包含以下信息:
-
用戶程序尺寸丙猬,即以字節(jié)為單位的大小
- 程序的長(zhǎng)度取自程序中的一個(gè)標(biāo)號(hào)“program_end”,這是允許的费韭。在編譯階段茧球,編譯器將該標(biāo)號(hào)所代表的匯編地址填寫在這里。該標(biāo)號(hào)位于整個(gè)源程序的最后星持,從屬于段"trail"
- program_end所代表的匯編地址抢埋,在數(shù)值上等于整個(gè)程序的長(zhǎng)度
-
應(yīng)用程序的入口點(diǎn),包括段地址和偏移地址
- 代碼段 code_1定義
SECTION code_1 align=16 vstart=0
包含了“vstart”子句,故標(biāo)號(hào)start所代表的匯編地址是相對(duì)于當(dāng)前代碼段code_1的起始位置揪垄,從0開始計(jì)算的 -
段重定位表
- 段的重定位是加載器的工作穷吮,它需要知道每個(gè)段在用戶程序的位置
- 段重定位表的大小,或著說表項(xiàng)數(shù)是不正確的饥努。
- 因?yàn)槎沃囟ㄎ槐砦挥趦蓚€(gè)標(biāo)號(hào)header_end和code_1_segment之間捡鱼,而且每個(gè)表項(xiàng)占用4字節(jié),故實(shí)際的表項(xiàng)數(shù)為
(header_end – code_1_segment) / 4
這個(gè)值是在程序編譯階段計(jì)算的酷愧,先用兩個(gè)標(biāo)號(hào)所代表的匯編地址相減驾诈,再除以每個(gè)表項(xiàng)的長(zhǎng)度4。
緊接著表項(xiàng)數(shù)的溶浴,是實(shí)際的段重定位表乍迄,每個(gè)表項(xiàng)用偽指令dd聲明并初始化為1個(gè)雙字。
3.加載器的工作流程
1)初始化和決定加載位置
從大方面來說戳葵,加載器加在一個(gè)用戶程序就乓,需決定兩件事:
- 內(nèi)存什么地方是空閑的,即從哪個(gè)物理內(nèi)存地址開始加載用戶程序
- 用戶程序位于硬盤上的什么位置拱烁,它的起始邏輯扇區(qū)號(hào)是多少
app-lba_start equ 100
常熟用偽指令equ聲明的生蚁,意思是“等于”。本句意思是戏自,用標(biāo)號(hào) app_lba_start 來代表數(shù)值100邦投,今后,要用到100擅笔,不需要
mov al,100
而是
mov al,app_lba_start
常熟即程序運(yùn)行期間不變的數(shù)
和其他偽指令 db,dw,dd不同志衣,equ聲明的數(shù)值不占用任何匯編地址,也不在運(yùn)行時(shí)占用任何內(nèi)存位置猛们。僅僅代表一個(gè)數(shù)念脯。
加載用戶程序需確定一個(gè)內(nèi)存物理地址,這是偽指令dd聲明的弯淘,并初始化為 0x10000
phy_base dd 0x10000
要求:后邊的地址的最低四位必須是 0即加載的起始地址必須時(shí)16字節(jié)對(duì)齊的绿店。