標籤:
電腦是如何工作的進行一、實驗過程及分析
**指令先從main函數開始---eip所指向的位置 ** `
main:
pushl %ebp ;將ebp的值(0)壓入堆棧,esp指向下一個(編號1的位置)movl %esp, %ebp ;將esp賦給ebp,ebp的指向位置變了,也指向(編號2的位置)subl $4, %esp ;esp向下移動一個編號(2)的位置movl $18, (%esp) ;立即數18放到esp當前指向的位置(編號2)call zheng ;{對應兩條指令1.pushl eip 2.movl zheng eip} 執行call指令的時候,eip實際上指向下一條指令(程式碼數是23的代碼)將eip(23)壓棧,而 eip指向zheng 指令從zheng函數開始執行addl $1, %eax ;eax=24+1=25leave ;1.movl %ebp,%esp esp與ebp都指向編號1 2.popl %ebp ebp,esp都指向0,堆棧回到了最初的狀態ret` ;最後return是回到main函數之前的堆棧
zheng:
pushl %ebp ;ebp當前指向為編號1,將ebp(編號1)壓入棧,esp指向編號4movl %esp, %ebp ;ebp也指向編號4subl $4, %esp ;esp指向下一位置編號5movl 8(%ebp), %eax ;變址定址8,ebp向上+2個編號位置,值為18,將18賦給eaxmovl %eax, (%esp) ;eax=18,把18放到編號5的位置call wei ;1.pushl eip(esp移到編號6,eip為15行)2.eip指向wei函數的位置leave ;1.movl %ebp,%esp ebp指向4,esp也指向編號4 2.popl %ebp ebp指向編號1的位置,同時esp上移指向編號3ret ;popl eip,把esp上移指向編號2,eip指向行號23,main中call的下一條指令
wei:
pushl %ebp ;當前ebp指向編號4,esp指向編號7的位置movl %esp, %ebp ;把ebp也指向當前編號7的位置movl 8(%ebp), %eax ;ebp+8,即向上移動兩個編號的位置,eax=18addl $6, %eax ;eax=18+6=24popl %ebp ;將ebp(4)的內容放回ebp,效果是ebp指向原來4的位置,同樣,esp減4,指向編號6的位置ret ;return就是popl eip,esp指向編號5,同時eip指向了行號15的位置,執行zheng函數裡call指令的下一條。
此處的0-8是編號,實際上應是0-32, 4個位元組
二、總結部分:電腦大部分都是用馮諾依曼體繫結構,即儲存程式電腦。
兩個層面:
1.硬體 cpu(IP寄存器:指標,指向記憶體的某塊地區)——匯流排——記憶體(代碼與資料)
2.程式員 記憶體儲存指令與資料, CPU解釋執行指令
電腦在執行程式時須先將要執行的相關程式和資料放入記憶體儲器中,在執行程式時CPU根據當前程式指標寄存器的內容取出指令並執行指令,然後再取出下一條指令並執行,如此迴圈下去直到程式結束指令時才停止執行。其工作過程就是不斷地取指令和執行指令的過程,最後將計算的結果放入指令指定的儲存空間地址中。
註明: 姓名:鄭偉 + 原創作品轉載請註明出處 + 《Linux核心分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000
電腦是如何工作的進行