現(xiàn)形式)
一、CPU 寄存器通用x86架構(gòu)寄存器是CPU內(nèi)部高速存儲單元比內(nèi)存快很多用來臨時(shí)存放指令、數(shù)據(jù)、地址。1. 通用寄存器存放運(yùn)算數(shù)據(jù)x86 32位EAX、EBX、ECX、EDXEAX累加器算術(shù)運(yùn)算、函數(shù)返回值EBX基址寄存器內(nèi)存尋址ECX計(jì)數(shù)寄存器循環(huán)計(jì)數(shù)EDX數(shù)據(jù)寄存器乘法/除法、IO操作可以拆分使用32位(EAX) → 低16位AX → AH(高8位)、AL(低8位)2. 變址/基址寄存器尋址用ESI源變址寄存器字符串源地址EDI目的變址寄存器字符串目標(biāo)地址EBP基址指針棧幀基地址函數(shù)棧ESP棧指針永遠(yuǎn)指向棧頂3. 控制寄存器 / 段寄存器16位CS代碼段存放指令DS數(shù)據(jù)段存放普通數(shù)據(jù)SS棧段??臻gES附加段額外數(shù)據(jù)段4. 標(biāo)志寄存器 EFLAGS保存運(yùn)算結(jié)果狀態(tài)ZF零標(biāo)志結(jié)果為0置1CF進(jìn)位標(biāo)志無符號數(shù)溢出SF符號標(biāo)志結(jié)果正負(fù)OF溢出標(biāo)志有符號數(shù)溢出簡單總結(jié)通用寄存器做計(jì)算指針寄存器找內(nèi)存地址段寄存器劃分內(nèi)存區(qū)域標(biāo)志寄存器記錄運(yùn)算狀態(tài)。二、匯編實(shí)現(xiàn)的幾種形式1. 純匯編完整匯編程序全部代碼都是匯編指令用匯編器NASM / MASM直接編譯成可執(zhí)行文件。 特點(diǎn)沒有C/C代碼手動寫入口、段定義直接調(diào)用系統(tǒng)中斷/系統(tǒng)調(diào)用 示例片段mov eax,1 mov ebx,0 int 0x802. C/C 內(nèi)嵌匯編inline asm內(nèi)聯(lián)匯編在C/C函數(shù)里面直接嵌入?yún)R編代碼C代碼和匯編混寫。GCCasm(匯編指令 :輸出 :輸入 :破壞寄存器);MSVC__asm { ... }示例GCCint a,b; asm(mov %1,%%eax; add %%eax,%%eax : r(a) : r(b));特點(diǎn)適合少量匯編直接操作寄存器和C變量交互。3. 匯編單獨(dú)文件 C/C鏈接模塊調(diào)用一部分代碼寫在.asm匯編文件匯編編譯成目標(biāo)文件.oC/C寫主程序聲明外部函數(shù)extern最后用鏈接器把C目標(biāo)文件和匯編目標(biāo)文件合并成程序C代碼extern int add(int a,int b); //聲明匯編里的函數(shù) int main(){ add(1,2); }asm文件global add add: push ebp mov ebp,esp mov eax,[ebp8] add eax,[ebp12] pop ebp ret特點(diǎn)大型項(xiàng)目分離匯編實(shí)現(xiàn)底層函數(shù)C做業(yè)務(wù)邏輯。