計算機是如何工作的?

作者:申小寧 原創作品轉載請註明出處
《Linux內核分析》MOOC課程 http://mooc.study.163.com/course/USTC-1000029000 

實驗截圖:


c代碼:


wKioL1T8V1CxnVmrAADs1Jxm3X0686.jpg


編譯命令:

wKiom1T8VmOCxTscAABYXJAWEn0319.jpg


彙編代碼:

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內核或者學習一些其他語言,彙編都是基礎,小夥伴們加油了!!!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章