- section
- vstart
- CPU的工作原理
- 通用寄存器介紹
- 實(shí)模式下CPU內(nèi)存尋址方式
- 實(shí)模式下的ret
- 實(shí)模式下的Call
- 實(shí)模式下的jmp
- Eflag寄存器標(biāo)志位
- CPU如何與外設(shè)通信--IO接口
- A32體系的in眠副, out指令
section
關(guān)鍵字section并沒(méi)有對(duì)程序中的地址產(chǎn)生任何影響笋颤,即在默認(rèn)的情況下谢谦,有沒(méi)有section是一樣的,section相當(dāng)于整個(gè)文件的順延聘萨,僅僅是邏輯上讓開(kāi)發(fā)人員梳理程序之用支示。
vstart
為section指定一個(gè)虛擬的起始地址宽档,根據(jù)此地址骄呼,在文件是找不到相關(guān)數(shù)據(jù)的菇夸,他被用來(lái)計(jì)算該section內(nèi)的所有內(nèi)存引用地dec琼富。整個(gè)虛擬地址與x86CPU中開(kāi)啟分頁(yè)后的虛擬地址是兩碼事。
CPU的工作原理
控制單元要取下一條待運(yùn)行的指令庄新,該指令的地址在程序計(jì)數(shù)器PC中鞠眉,在x86CPU上,程序計(jì)數(shù)器CS:IP择诈。于是讀取ip寄存器后械蹋,將該地址送入地址總線(xiàn),CPU根據(jù)此地址便得到了指令羞芍,并將其存入指令寄存器IR中哗戈,這時(shí)候輪到指令譯碼器上場(chǎng)了,它根據(jù)指令格式指令寄存器中的指令荷科,先確定操作碼是什么唯咬,再檢查操作數(shù)類(lèi)型,若在內(nèi)存中畏浆,就將相應(yīng)操作數(shù)從內(nèi)存中取回放入自己的存儲(chǔ)單元胆胰,若操作數(shù)是在寄存器中就直接用了,免了取操作數(shù)的過(guò)程刻获。操作碼有了蜀涨,操作數(shù)有了,操作控制器給運(yùn)算單元下令蝎毡,開(kāi)始執(zhí)行指令厚柳。ip寄存器被加上當(dāng)前指令的大小,于是ip又指向了下一條指令的地址沐兵。
通用寄存器介紹
寄存器 | 助記名稱(chēng) | 功能描述 |
---|---|---|
ax | 累加器accumulator | 使用頻度最高别垮,常用于算術(shù)運(yùn)算、邏輯運(yùn)算扎谎、保存與外設(shè)輸入輸出數(shù)據(jù) |
bx | 基址寄存器base | 常用于存儲(chǔ)內(nèi)存地址宰闰,用此地址作為基址,用來(lái)遍歷一片內(nèi)存區(qū)域 |
cx | 計(jì)數(shù)器 counter | 用于計(jì)數(shù)簿透,所以常用于循環(huán)指令中的循環(huán)次數(shù) |
dx | 數(shù)據(jù)寄存器 data | 可用于存放數(shù)據(jù),通常用于保存外設(shè)控制器的端口號(hào)地址 |
si | 源變址寄存器source index | 常用于字符串操作中的數(shù)據(jù)源地址解藻,即被傳送的數(shù)據(jù)在哪里老充。通常需要與其他指令配合使用,如批量數(shù)據(jù)傳送指令族 mov[bwd] |
di | 目的變址寄存器 destination index | 和si一樣螟左,常用于字符串操作啡浊。但di是用于數(shù)據(jù)的目的地址觅够,即數(shù)據(jù)被傳送到哪里 |
sp | 棧指針寄存器stack pointer | 其段基址是SS用于指向棧頂。隨著棧中數(shù)據(jù)的進(jìn)出巷嚣,push與pop這兩個(gè)對(duì)棧操作的指令會(huì)修改sp的值 |
bp | 基址指針寄存器base point | 訪(fǎng)問(wèn)棧的兩種方式喘先,一種是用push和pop指令操作棧,sp指針的值會(huì)自動(dòng)更新廷粒,但我們只能獲取棧頂sp指向的數(shù)據(jù)窘拯。很多時(shí)候,我們需要讀寫(xiě)在棧底與棧頂之間的數(shù)據(jù)坝茎,處理器為了讓開(kāi)發(fā)人員方便控制棧中的數(shù)據(jù)涤姊,還提供了把棧當(dāng)成數(shù)據(jù)段來(lái)訪(fǎng)問(wèn)的方式,即提供寄存器bp嗤放,所以bp默認(rèn)的段寄存器是SS思喊,可通過(guò)SS:bp的方式把棧中的數(shù)據(jù)當(dāng)成普通的數(shù)據(jù)段來(lái)訪(fǎng)問(wèn) |
實(shí)模式下CPU內(nèi)存尋址方式
從大方向上看,尋址方式可分為三類(lèi):
- 寄存器尋址
- 立即數(shù)尋址
- 內(nèi)存尋址
內(nèi)存尋址又分為: - 直接尋址
- 基址尋址
- 變址尋址
- 基址變址尋址
尋址說(shuō)明:
- 寄存器尋址
“數(shù)”在寄存器中次酌,直接從寄存器中獲取數(shù)據(jù)恨课。下面三條指令都是寄存器,其中前兩條岳服,因?yàn)樵床僮鲾?shù)是立即數(shù)剂公,所以也是立即數(shù)尋址。
mov ax, 0x10
mov dx, 0x9
mul dx
- 立即數(shù)尋址
立即數(shù)就是常數(shù)派阱。指令有操作碼與操作數(shù)組成诬留,如果立即數(shù)存在與指令中,凸顯了立即就可用贫母,為立即數(shù)尋址
mov ax,0x18 //立即數(shù)尋址
mov ds,ax //寄存器尋址
- 內(nèi)存尋址
操作數(shù)在內(nèi)存中的尋址方式成為內(nèi)存尋址文兑。- 直接尋址
就是直接在操作數(shù)中給出的數(shù)字作為內(nèi)存地址,通過(guò)中括號(hào)的形式告訴CPU腺劣,取此地址作為操作數(shù)绿贞。
- 直接尋址
mov ax, [0x1234]
mov ax, [fs:0x5678]
- 基址尋址
操作數(shù)中使用bx寄存器或bp寄存器作為地址的起始,地址的變化以它為基礎(chǔ)橘原。用寄存器作為內(nèi)存尋址籍铁。
mov [bx], 0x1234 //內(nèi)存基址尋址,立即數(shù)尋址
- 變址尋址
變址尋址起始和基址尋址類(lèi)似趾断,只是寄存器由bx拒名,bp換成了si和di。si是指源索引寄存器(source index)芋酌,di是指目的索引寄存器(destination index)增显。兩個(gè)寄存器的默認(rèn)段寄存器也是ds。
mov [di], ax //將寄存器ax的值放入ds:di指向的內(nèi)存 基于ds基址加上di變址指向的內(nèi)存
mov [si+0x1234], ax //變址中還可以加上個(gè)偏移量
變址尋址主要用于字符搬運(yùn)方面的指令脐帝,這兩個(gè)寄存器在很多指令中都要成對(duì)使用同云,如movsb糖权,movsw,movsd
- 基址變址尋址
即基址寄存器bx或bp加一個(gè)變址寄存器si或di炸站。
mov [bx + di], ax
mov [bx + si], ax
實(shí)模式下的ret
凡是調(diào)用call指令星澳,會(huì)把返回地址壓入棧中。然而保存的這個(gè)地址并不會(huì)給call指令使用旱易,call指令不會(huì)自動(dòng)回來(lái)禁偎。返回地址是給ret,retf使用的咒唆。
- ret : 在棧頂彈出2字節(jié)的內(nèi)容來(lái)替換IP寄存器届垫,ret指令不管里面的內(nèi)容如何,只負(fù)責(zé)彈出棧頂?shù)膬?nèi)容并為IP寄存器賦值全释。
- retf: 從棧頂彈出4字節(jié)的內(nèi)容装处,棧頂處的2字節(jié)來(lái)替換IP寄存器,另外的2字節(jié)來(lái)替換CS寄存器浸船。
實(shí)模式下的Call
- 16位實(shí)模式的相對(duì)近調(diào)用
“近”是指同一段內(nèi)妄迁,段基址不會(huì)變,給出段內(nèi)偏移地址就可以了李命。
“相對(duì)”是指在同一個(gè)代碼段中登淘,只要給出目標(biāo)函數(shù)的相對(duì)地址即可。
指令格式:call near 立即數(shù)地址
call near near_proc //相對(duì)近調(diào)用
jmp $
addr add 4
near_proc:
mov ax, 0x1234
ret
- 16位實(shí)模式間接絕對(duì)近調(diào)用
“間接”是指目標(biāo)函數(shù)地址沒(méi)有直接給出來(lái)封字。
“絕對(duì)”是指目標(biāo)函數(shù)的地址是絕對(duì)地址
格式:
call 寄存器尋址
call 內(nèi)存尋址
mov ax, near_proc
call ax
jmp $
addr dd 4
near_proc:
mov ax, 0x1234
ret
- 16位實(shí)模式直接絕對(duì)遠(yuǎn)調(diào)用
“直接”是指操作數(shù)直接在指令中給出黔州,是立即數(shù)。不需要經(jīng)過(guò)寄存器或內(nèi)存阔籽。
“遠(yuǎn)”是指跨段流妻,目標(biāo)函數(shù)與當(dāng)前指令不在一個(gè)段中。
格式:
call far 段基址(立即數(shù)):段內(nèi)偏移地址(立即數(shù))
如:
section call_test vstart=0x900
call 0: far_proc
jmp $
far_proc:
mov ax, 0x1234
retf
- 16位實(shí)模式間接絕對(duì)遠(yuǎn)調(diào)用
“間接”笆制,值目標(biāo)地址不是立即數(shù)绅这,而是在內(nèi)存或寄存器中。
格式
call far 內(nèi)存尋址
section call_test vstart=0x900
call far [addr]
jmp $
addr dw far_proc, 0
far_proc:
mov ax, 0x1234
retf
實(shí)模式下的jmp
無(wú)條件跳轉(zhuǎn)在辆,jmp通過(guò)改變段寄存器CS與IP的值來(lái)實(shí)現(xiàn)程序跳轉(zhuǎn)的证薇。
- 16位實(shí)模式相對(duì)短轉(zhuǎn)移
“相對(duì)”,意味著操作數(shù)是個(gè)相對(duì)的增量匆篓。跳轉(zhuǎn)后的地址是目標(biāo)地址減去當(dāng)前地址浑度,所得的差再減去jmp指令的2字節(jié),最終的結(jié)果就是操作數(shù)鸦概。操作數(shù)的返回在-128-127
“短轉(zhuǎn)移”俺泣,意味著只在段內(nèi)轉(zhuǎn)移,不需要跨段,所以只需要給出偏移地址就夠了伏钠。
格式:
jmp short 立即數(shù)地址
section call_test vstart=0x900
jmp short start
times 127 db 0
start:
mov ax, 0x1234
jmp $
- 16位實(shí)模式相對(duì)近轉(zhuǎn)移
相對(duì)近轉(zhuǎn)移與相對(duì)短轉(zhuǎn)移相比,操作數(shù)的范圍由8位寬度變?yōu)榱?6位寬度谨设,操作數(shù)依然是相對(duì)增量熟掂。操作數(shù)范圍是-32768-32767
格式
jmp near 立即數(shù)地址
section call_test vstart=0x900
jmp short start
times 128 db 0
start:
mov ax, 0x1234
jmp $
- 16位實(shí)模式間接絕對(duì)近轉(zhuǎn)移
格式:
jmp near 寄存器尋址
jmp near 內(nèi)存尋址
section call_test vstart=0x900
mov ax, start
jmp near ax
times 128 db 0
start:
mov ax, 0x1234
jmp $
- 16位實(shí)模式直接絕對(duì)遠(yuǎn)轉(zhuǎn)移
格式:
jmp 段基址:段偏移地址
section call_test vstart=0x900
jmp 0: start
times 128 db 0
start:
mov ax, 0x1234
jmp $
- 16位實(shí)模式間接絕對(duì)遠(yuǎn)轉(zhuǎn)移
需要在內(nèi)存中取四個(gè)字節(jié),前兩個(gè)字節(jié)是段內(nèi)偏移地址扎拣,后兩個(gè)字節(jié)是段基址赴肚。
格式:
jmp far 內(nèi)存尋址
section call_test vstart=0x900
jmp far [addr]
times 128 db 0
addr dw start, 0
start:
mov ax, 0x1234
jmp $
Eflag寄存器標(biāo)志位
-
CF Carray Flag
:,CF為1,表示進(jìn)位或借位 -
PF Parity Flag
:奇偶位二蓝,用來(lái)標(biāo)記低八位中1的個(gè)數(shù) -
AF Auxiliary carry Flag
:輔助進(jìn)位標(biāo)志誉券,用來(lái)記錄運(yùn)算結(jié)果低四位的進(jìn)借位情況苔严。 -
ZF Zero Flag
:零標(biāo)志位退个。若計(jì)算結(jié)果位0吃粒,此標(biāo)志為1 -
SF Sign Flag
:符號(hào)標(biāo)志位蛇摸。運(yùn)算結(jié)果為負(fù)荐虐,則SF位為1 -
TF Trap Flag
:陷阱標(biāo)志位炭臭。TF為1狂打,CPU進(jìn)入單步運(yùn)行模式伴栓。debug單步調(diào)試時(shí)牡借,原理是讓TF置一 -
IF Interrupt Flag
:中斷標(biāo)志位拳昌。IF為1,表示中斷開(kāi)啟钠龙,CPU可以響應(yīng)外部可屏蔽中斷炬藤。 -
DF Direction Flag
:方向標(biāo)志位。用于字符串操作指令中碴里,當(dāng)DF為1時(shí)沈矿,指令中的操作數(shù)地址會(huì)自動(dòng)減少一個(gè)單位,當(dāng)DF為0時(shí)并闲,指令中的操作數(shù)地址會(huì)自動(dòng)增加一個(gè)單位细睡。其中提到的這個(gè)單位的大小,取決于用什么指令帝火。 -
OF Overflow Flag
:溢出標(biāo)志位溜徙。表示計(jì)算結(jié)果是否超過(guò)了數(shù)據(jù)類(lèi)型可表示的大小。 -
IOPL Input Output Privilege Level
:用于特權(quán)級(jí)概念的CPU犀填。占用兩位表示4中特權(quán)級(jí) -
NT Nest Task
:任務(wù)嵌套標(biāo)志蠢壹。8088支持多任務(wù),一個(gè)任務(wù)就是一個(gè)進(jìn)程九巡。一個(gè)任務(wù)中又嵌套調(diào)用了另一個(gè)任務(wù)時(shí)图贸,此NT為1 -
RF Resume Flag
:恢復(fù)標(biāo)志位。該標(biāo)志位用于程序調(diào)試,指示是否接受調(diào)試故障疏日,它需要和調(diào)試寄存器一起使用 -
VM Virtual 8086 Model
:虛擬8086模式偿洁,這是實(shí)模式向保護(hù)模式過(guò)渡時(shí)的產(chǎn)物。此位為1沟优,可以在保護(hù)模式下運(yùn)行實(shí)模式的程序涕滋。在保護(hù)模式下運(yùn)行實(shí)模式程序,都要為其虛擬一個(gè)實(shí)模式環(huán)境挠阁,故稱(chēng)為虛擬模式宾肺。 -
AC Alignment Check
:對(duì)齊檢查。程序中的數(shù)據(jù)或指令其內(nèi)存地址是否是偶數(shù)侵俗,是否是16锨用,32的整數(shù)倍,沒(méi)有余數(shù)隘谣。 -
VIF Virtual Interrupt Flag
:虛擬中斷標(biāo)志位增拥,虛擬模式下的中斷標(biāo)志。 -
VIP Virtual Interrupt Pending
:虛擬中斷掛起標(biāo)志位洪橘。在多任務(wù)的情況下跪者,為操作系統(tǒng)提供虛擬中斷掛起信息。 -
ID Identification
:識(shí)別標(biāo)志位熄求。系統(tǒng)經(jīng)常需要判斷CPU型號(hào)渣玲,若ID為1,表示支持CPU id 指令 - ``
CPU如何與外設(shè)通信--IO接口
IO接口的功能:
- 設(shè)置數(shù)據(jù)緩沖弟晚,解決CPU與外設(shè)的速度不匹配忘衍。
- 設(shè)置信號(hào)電平轉(zhuǎn)換電路。CPU是TTL電平卿城,而外設(shè)大部分是機(jī)電設(shè)備枚钓。
- 設(shè)置數(shù)據(jù)格式轉(zhuǎn)換。外設(shè)輸出的信息可能是數(shù)字信息瑟押,模擬信號(hào)搀捷,而CPU只能處理數(shù)字信號(hào)
- 設(shè)置時(shí)序控制電路來(lái)同步CPU和外部設(shè)備。
- 提供地址譯碼
- 同一時(shí)間多望,CPU只能與一個(gè)IO接口通信嫩舟,仲裁IO接口的競(jìng)爭(zhēng),連接各種內(nèi)部總線(xiàn)怀偷,這就是輸入輸出控制中心(I/O control iub ICH)家厌,也就是
南橋芯片
。 -
南橋芯片一般用來(lái)來(lái)見(jiàn)pci椎工,pci-express饭于,AGP等低速設(shè)備蜀踏,北橋用于連接高速設(shè)備如內(nèi)存
IA32體系的in, out指令
-
in: 從端口中讀取數(shù)據(jù).
- in al, dx
- in ax, dx
其中al掰吕,ax用與存儲(chǔ)由端口獲取的數(shù)據(jù)果覆,可變。dx代表端口號(hào)
-
out: 向端口寫(xiě)入數(shù)據(jù)
- out dx, ax
- out dx al
- out 立即數(shù), al
- out 立即數(shù), ax
out指令的目的操作數(shù)是端口號(hào)殖熟。