操作系統(tǒng)-匯編實(shí)現(xiàn)C語法01

寄存器的名稱(64位系統(tǒng)/32位系統(tǒng)兼容)

可以在64位系統(tǒng)上使用mov eax,xxx等指令
8086CPU寄存器
想想8086有14個(gè)16位(才2個(gè)字節(jié))寄存器
即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG(PSW), CS,DS,SS,ES. 這 14 個(gè)寄存器按照一定方式又分為了通用寄存器,控制寄存器和段寄存器.
詳細(xì)參考:https://blog.csdn.net/u010021014/article/details/116670289
x86寄存器
學(xué)習(xí)的時(shí)候可以裝個(gè)32bit的Ubuntu16.04,它的寄存器少一些, 配合sublime寫代碼,學(xué)原理相對容易些.

x86-64寄存器
x86-64有16個(gè)64位(4個(gè)字節(jié))寄存器,分別是: rax,rbx,rcx,rdx,esi,edi,rbp,rsp,r8,r9,r10,r11,r12,r13,r14,r15

- rax 作為函數(shù)返回值使用
- rsp 棧指針寄存器指向棧頂
- rbp 棧楨指針指向?;?/li>
- rdi rsi rdx rcx r8 r9 用作函數(shù)參數(shù)依次對應(yīng)第1參數(shù) 第2參數(shù)
- rbx r12 r13 r14 r15 用作數(shù)據(jù)存儲遵循被調(diào)用者使用規(guī)則簡單說就是隨便用調(diào)用子函數(shù)之前要備份它以防他被修改
- r10 r11 用作數(shù)據(jù)存儲遵循調(diào)用者使用規(guī)則簡單說就是使用之前要先保存原值
- rip: 相當(dāng)于PC指針指向當(dāng)前的指令地址指向下一條要執(zhí)行的指令
EFLAGS Register
EFLAGS 稱為標(biāo)志寄存器或程序狀態(tài)字(Program?Status?Word.?PSW).

- 6個(gè)狀態(tài)標(biāo)志(status flags)(CF, SF, AF, PF, OF, ZF)
- 3個(gè)(control flags)(IF, TF, DF)
- 系統(tǒng)標(biāo)志(system flags)
狀態(tài)標(biāo)志(status flags)
CF-進(jìn)位標(biāo)志算術(shù)運(yùn)算時(shí)有進(jìn)位CF=1,無進(jìn)位CF=0
這里針對的是最高位向前有沒有進(jìn)位,注意與AF區(qū)分
PF-奇偶標(biāo)志運(yùn)算結(jié)果中“1”的個(gè)數(shù)為偶數(shù)時(shí)PF=1,為奇數(shù)個(gè)則PF=0
但是如果運(yùn)算結(jié)果是16位數(shù)的話,PF標(biāo)志只關(guān)注運(yùn)算結(jié)果的低八位
AF-輔助進(jìn)位標(biāo)志第三位向第四位有進(jìn)位時(shí)AF=1
舉個(gè)例子
0101 0000+ 1000 1111=1101 1111
第三位分別是 0和1,相加并沒有進(jìn)位,所以AF=0
ZF-零標(biāo)志運(yùn)算結(jié)果為0,則ZF=1,否則ZF=0
SF-符號標(biāo)志運(yùn)算結(jié)果為負(fù)數(shù)時(shí),SF=1
對于符號數(shù),最高位是符號位,因此SF相當(dāng)于就是判別最高位是否為1,最高位是1表示是負(fù)數(shù),SF=1
OF-溢出標(biāo)志運(yùn)算結(jié)果是否超出規(guī)定范圍,超出范圍OF=1,未超出OF=0
很容易把OF標(biāo)志的判別方法和CF混淆,這里有一個(gè)簡便的方法就是看最高位
控制標(biāo)志(control flags)
IF-中斷允許標(biāo)志IF=1,中斷允許
DF-方向標(biāo)志用于在串操作指令中控制地址指針變化的方向,DF=0地址指針按增量變化,DF=1地址指針按減量變化
TF(trap flag)-跟蹤標(biāo)志TF=1,為單步工作方式,即CPU每執(zhí)行一條指令就產(chǎn)生一次中斷,此時(shí)程序員可以查看CPU內(nèi)部寄存器的內(nèi)容, 存儲單元的內(nèi)容和標(biāo)志寄存器的內(nèi)容等。這個(gè)中斷主要用于程序調(diào)試。