## 前言
最近在看一些關(guān)于linux startup的東西,對(duì)于其中使用到的AT&T的匯編語法有點(diǎn)陌生揩尸,所以寫下這篇文章來幫助自己和更多的人了解一些常見的AT&T匯編的語法所禀。
因?yàn)橹翱催^一段時(shí)間的匯編語法方面,所以并不會(huì)對(duì)其中的語法有過多的深入(主要是自己學(xué)的還不夠好放钦,大大的羞愧),僅針對(duì)自己感興趣的方面葡幸,如果有同學(xué)對(duì)其中的部分感興趣或者想給予擴(kuò)充最筒,非常歡迎!(你問我支不支持蔚叨,我是支持滴床蜘!)
## 學(xué)習(xí)環(huán)境
因?yàn)樽约浩綍r(shí)主要是使用Mac進(jìn)行編程,所以文章中如果出現(xiàn)部分示例蔑水,僅僅確保在Mac的環(huán)境中能夠正常運(yùn)行(周知~)邢锯。如果有熱心的同學(xué)能夠?qū)Σ煌沫h(huán)境下的運(yùn)行結(jié)果進(jìn)行反饋,也是歡迎的(我是認(rèn)真的~)搀别。
## 匯編常用的語法
### section directive
1. data section
用來聲明程序中用來存儲(chǔ)數(shù)據(jù)的內(nèi)存區(qū)域丹擎;這個(gè)區(qū)域在聲明之后不能被擴(kuò)充,在程序中全局為static歇父。
2. bss section
bss也是靜態(tài)內(nèi)存區(qū)域蒂培,包含在程序中定義的數(shù)據(jù)緩沖,這段內(nèi)存區(qū)域的獨(dú)特之處是使用了0進(jìn)行填充榜苫。
3. text section
這段內(nèi)存區(qū)域用來存儲(chǔ)指令代碼护戳,這段區(qū)域是固定的。
### register
1. EAX
累加器垂睬,用來進(jìn)行加法運(yùn)算媳荒,存儲(chǔ)結(jié)果。
2. EBX
指向數(shù)據(jù)內(nèi)存區(qū)域中的數(shù)據(jù)指針驹饺。
3. ECX
string和循環(huán)操作的計(jì)數(shù)器钳枕。
4. EDX
I/O指針。
5. EDI
指向string操作目的地址的數(shù)據(jù)指針赏壹。
6. ESI
指向string操作源地址的數(shù)據(jù)指針鱼炒。
7. ESP
棧指針。
8. EBP
棧數(shù)據(jù)指針蝌借。
### segment registers
1. CS
代碼段田柔,CS寄存器中包含了指向內(nèi)存中代碼段的指針,代碼段是內(nèi)存中指令代碼存儲(chǔ)的地方骨望。處理器基于CS寄存器的值從內(nèi)存中獲取指令代碼硬爆,而相關(guān)的偏移量則存儲(chǔ)在EIP指令指針寄存器當(dāng)中。
2. DS
數(shù)據(jù)段擎鸠,DS缀磕、ES、FS、GS均指向數(shù)據(jù)段袜蚕。使用這4種不同的數(shù)據(jù)段糟把,可以幫助程序分離不同的數(shù)據(jù)對(duì)象,使得他們直接沒有交集牲剃。
3. SS
堆棧段遣疯,SS寄存器當(dāng)中包含了指向內(nèi)存中堆棧段的指針。棧中包含了程序中傳遞給函數(shù)的數(shù)據(jù)凿傅。
4. ES
5. FS
6. GS
### instruction pointer register
Instruction pointer register(EIP, 指令指針寄存器)有時(shí)也被稱之為程序計(jì)數(shù)器缠犀,指向下一個(gè)要被執(zhí)行的指令代碼。通常情況下聪舒,不能直接去修改EIP中的值辨液,可以通過jump等指令的方式間接的修改EIP中的值,并將下一個(gè)指令代碼進(jìn)行cache箱残。
### control register
Control register在x86系列中包含CR0-7滔迈,在x86_64中則額外增加了EFER、CR8這兩個(gè)控制寄存器被辑。通過控制寄存器燎悍,可以決定處理器的操作模式、當(dāng)前執(zhí)行任務(wù)的特性等盼理。
在通常情況下谈山,不能夠直接獲取到控制寄存器的數(shù)值。需要將控制寄存器的數(shù)值轉(zhuǎn)到通用寄存器當(dāng)中榜揖,才能獲取到勾哩;如果希望對(duì)控制寄存器進(jìn)行賦值抗蠢,則需要將數(shù)值轉(zhuǎn)移到通用寄存器當(dāng)中举哟,然后將通用寄存器的值賦給控制寄存器。
### flags
通過flag來表明一個(gè)程序是否被正確執(zhí)行了迅矛。
按照功能妨猩,flag被分為以下幾種:
1. Status flags
被用來標(biāo)識(shí)算數(shù)操作的結(jié)果。
|flag? ? ? |bit? ? ? ? |name? ? ? ? ? ? |describe|
| -------------|:--------------:|:--------------:|:--------------:|
|CF|0|Carry flag|在算術(shù)運(yùn)算中秽褒,數(shù)字溢出時(shí)使用|
|PF|2|Parity flag|奇偶校驗(yàn)符|
|AF|4|Adjust flag|類似于十進(jìn)制加減法壶硅,在進(jìn)位或者借位的時(shí)候使用|
|ZF|6|Zero flag|當(dāng)一個(gè)操作的結(jié)果為0時(shí),此標(biāo)識(shí)位置為1|
|SF|7|Sign flag||
2. Control flags
3. System flags
## 未完待續(xù)~~