標籤:處理器 電腦 frame 寄存器
申小寧 原創作品轉載請註明出處
《Linux核心分析》MOOC課程 http://mooc.study.163.com/course/USTC-1000029000
實驗:
c代碼:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5A/61/wKioL1T8V1CxnVmrAADs1Jxm3X0686.jpg" style="float:none;" title="B69C77B6-2AFE-4355-8DEF-1978FD66FE2D.jpg" alt="wKioL1T8V1CxnVmrAADs1Jxm3X0686.jpg" />
編譯命令:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/5A/65/wKiom1T8VmOCxTscAABYXJAWEn0319.jpg" title="4367ED69-A7F6-48E6-8AC7-7EB9C03C3F09.jpg" alt="wKiom1T8VmOCxTscAABYXJAWEn0319.jpg" />
彙編代碼:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/5A/61/wKioL1T8V1HBloEiAAKoslH1NIo055.jpg" style="float:none;" title="E5306AD5-5320-4629-9345-51D751AA053F.jpg" alt="wKioL1T8V1HBloEiAAKoslH1NIo055.jpg" />
基礎知識
寄存器
寄存器是中央處理器內的組成部分。寄存器是有限存貯容量的高速存貯組件,它們可用來暫存指令,資料和地址。
eip:儲存當前指令寄存器,每執行完一條指令,eip將指向下一條指令。
ebp:是"基址指標"(BASE POINTER), 它最經常被用作進階語言函數調用的"架構指標"(frame pointer). 在破解的時候,經常可以看見一個標準的函數起始程式碼:
esp:專門用作堆棧指標,被形象地稱為棧頂指標,堆棧的頂部是地址小的地區,壓入堆棧的資料越多,ESP也就越來越小。在32位平台上,ESP每次減少4位元組。
eax:是"累加器"(accumulator), 它是很多加法乘法指令的預設寄存器。
定址方式
寄存器定址 movl %eax,%ebx 把eax的值,賦給ebx
立即定址 movl $0x1234,%eax 把0x1234這個立即數,賦值給eax。
直接定址 movl 0x12345,%eax 把0x12345這個記憶體位址存放的資料賦值給eax。
間接定址 movl (%eax),%ebx eax上存放的一個記憶體位址,這個記憶體位址存放的值,賦值給ebx。
變址定址 movl 8(%eax),%ebx eax上存放的值,加上位移量8 後,所指向的位置存放的記憶體位址,這個記憶體位址存放的值,賦值給ebx
從main函數入手:
第一句:pushl %ebp
Pushl %ebp(表示把eax寄存器的內容壓倒棧頂):
等價於:
subl $4,%esp (堆棧的棧頂)
movl %ebp,(%esp)
第二句:movl %esp, %ebp
使得ebp指向esp指向的位置。
第三句:subl $4, %esp
棧頂向下位移4個位元組。
第四句:movl $99, (%esp)
將一個立即99存入棧頂。
第五句:call f 即調用函數f()
call 指令可分解成
pushl eip
movl f eip
f函數
pushl %ebp(儲存EBP位置,壓棧,esp加一)
movl %esp %ebp (esp 指向EBP)
...
movl %eax (%esp)
把esp儲存記憶體位址 指向 eax寄存器
call g執行函數g
g函數
ret 函數返回作用 返回執行gax內的指令。
總結:組合語言是電腦語言的基礎,想要深入理解linux核心或者學習一些其他語言,彙編都是基礎,小夥伴們加油了!!!
電腦是如何工作的?