1. 程式人生 > >從一段x86彙編程式看計算機是如何工作

從一段x86彙編程式看計算機是如何工作

3. 完整彙編程式執行過程分析
在開始分析之前,先對幾個特殊的暫存器說明一下:
eip:從main開始執行一條指令並自加一,遇到call會改變eip的值。
ebp:棧底
esp:棧頂
eax:函式的返回預設使用eax暫存器儲存,返回給上一級函式。

所以有彙編程式碼都是從main開始執行的:
17 mian:
18 pushl %ebp
19 movl %esp, %ebp
這兩行程式碼個人理解,就是為每一個函式建立一個邏輯上的堆疊。不管ebp之前的值是多少,先把ebp入棧,再把esp的值賦給,ebp實際效果如下圖:

 20     subl    $4, %esp
 21     movl    $12, (%esp)
這兩條指令是將12入棧。
22     call    f 
call指令是呼叫函式,執行過程是,將eip(當前指令的下一行指令地址)入棧,將f代表的地址放入eip中,結果如下圖:

跳轉至f執行,9,10行指令和剛才的一樣,直接結果就是是esp和ebp指向圖中堆疊標號為4的地方。接下來的指令,
 11     subl    $4, %esp       
 12     movl    8(%ebp), %eax
 13     movl    %eax, (%esp) 
將esp指標向下移一位;再將%ebp+8地址的值,也就是12放入eax暫存器;最後將eax中的值放入棧,執行後的結果如下圖:

 14     call    g  
call又呼叫g函式,執行過程和剛才一樣,直接看結果:

跳轉到第2行,開始執行,
  2     pushl   %ebp
  3     movl    %esp, %ebp
  4     movl    8(%ebp), %eax
  5     addl    $4, %eax
2,3行指令看著是不是很熟悉?對,就是很熟悉,函式一開始執行的就是它,關於堆疊的操作。4,5行指令,就是將%ebp+8地址的值,也就是12放入eax暫存器中;最後將eax中的值加4。執行結果如下圖所示:

  6     popl    %ebp
  7     ret
popl %ebp將當前esp中的值賦給ebp同時esp指標向上移一位。ret指令等於:popl %eip。兩條指令執行後,效果如下:

eip當前的值是指向15行的,然後從15行開始執行指令,
 15     leave                                                           
leave指令將ebp的值給esp,然後將ebp出棧,直接看棧的變化:

 16     ret  
函式返回,eip出棧,釋放形參佔用的棧資源:

跳到23行執行,
 23     addl    $1, %eax  
 24     leave                                                           
 25     ret  
將eax中的值加1,之後eax中的值應該是17,它將作為main函式的返回值。最後,退出。

可以到看到,程式執行完畢,堆疊是恢復原狀的,釋放了所有佔用的資源。

相關推薦

x86彙編程式計算機是如何工作

3. 完整彙編程式執行過程分析 在開始分析之前,先對幾個特殊的暫存器說明一下: eip:從main開始執行一條指令並自加一,遇到call會改變eip的值。 ebp:棧底 esp:棧頂 eax:函式的返回預設使用eax暫存器儲存,返回給上一級函式。 所以有彙編程式碼都是從main開始執行的: 17 mian

視頻中按幀提取圖片

imp book ima open HA image %d 數據 使用 這裏實現的是從一段視頻中每10幀讀取第10幀圖片,代碼如下: # -*- coding:utf-8 -*- #視頻中按序列提取幀,獲得訓練數據 import cv2 import os

代碼談GetPrivateProfileString的深坑

WinAPI ini讀取**總結:GetPrivateProfileString註意文件是否存在, 文件不存在或不具有r讀權限會在運行時報內存錯誤。** 失敗源代碼如下: string programDir = GetOcxPath(file);//得到ini配置文件路徑 ret = GetPrivateP

Rest framework——json資料來學rest_framework

一、用 Django 來返回一段 json 資料列表 import json from .models import Product from django.http import HttpRespon

網友:有沒有程式碼,起來簡單,實則威力無窮,程式設計師:有啊

話不多說,直接上圖 程式碼:System.exit(0); 這句程式碼,很簡單,但是也非常暴力。就是結束整個程式。 1、下面先演示下不加上這個語句: 然後控制檯輸出兩個println; 2、現在加這句程式碼放在中間 然後執行的效果就是: 3、現在把語句放在開頭

.html程式碼說起談談AngularJs中的雙向資料繫結

<!DOCTYPE html> <html lang="en" ng-app> <--省略head部分程式碼—> <body> input1: <input type="text" ng-model='message'

Java正則字串中取email地址

public static void ParseEmail(String line) { String regex = "\\[email protected]\\w+\\.(

Dubbo 原始碼到 CPU 分支預測的次探險之旅

> 每個時代,都不會虧待會學習的人。 大家好,我是 yes。 這次本來是打算寫一篇 RocketMQ 相關文章的,但是被插隊了,我也是沒想到的。 說來也是巧最近在看 Dubbo 原始碼,然後發現了一處很奇怪的程式碼,於是就有了這篇文章,讓我們來看一下這段程式碼,它屬於 `ChannelEventRunn

張圖清世界上最大的數據中心分布區域

內蒙古 項目 ace net 監控 現場 萬維網 居住 為我 原文地址 去年年底,全球網站總數估計約970864745個,以每秒約2個網站的速度遞增。據互聯網研究公司Netcraft聲稱,活躍網站大約有1.77億個,使用數億個現有的主機名。 去年年底,全球網站總數估計

組集合中獲取,分多次取集合中的每數據中的最大值,重組成一個新的集合。

clas pub 處理 oat private color andro sublist roi 一個項目中偶遇的簡單算法,個人覺得還不錯,雖不常用,也記錄在此吧。 1 package huolongluo.qihuo.util; 2 3 import androi

轉://條巨慢SQL基於Oracle的SQL優化

查看 針對性 map 分區 有關 需要 fix pts 大局觀 http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的內容是基於Oracle的SQL優化,以一條巨慢的SQL為例,從快速解讀SQL執行計劃、如何從執行計劃中

HR 到SBP其實還有很長的路要走

工作群 發生 角色 員工 str 人力 差距 作用 挖掘 戰略性業務夥伴 Strategic business partners 關於這本書,一般是因為好奇,從HR到BP的角色,再到這個SBP,其實是一段沒有走過的很虛的過程,不過總歸是需要燈塔,即使偶爾只是海

CVPR2013計算機視覺研究的三個趨勢

 申明:本文非筆者原創,原文轉載自:http://www.bfcat.com/index.php/2013/07/compute-visioni-trends/ tombone‘s blog 最近一直在update關於CVPR2013的感受,今天,他在部

程式碼懂Java類的載入和初始化

先貼程式碼 class Base { int a = numa(); private static int c = numc(); static int b = numb(); static { System.out.println("Base:static code b

java使用正則表示式長串字元中獲取特徵字串

只能說String工具類太強大,導致一直以來,幾乎沒怎麼用到過正則表示式,現在突然要用到,參考正則表示式語法,摸索一上午才搞出來。記錄分享一下,以免忘記 從一長串字元中,截取出邀請碼,我想很多人都遇到過。 String s = "邀請您加入隨心購,自動搜尋淘寶天貓優惠券!先領券,再購

輸出話,開始都是*,兩邊逐漸向中間展開(結果為動態,不要錯過)

列印“Welcome to my blog!!!”這句話,但是要先輸出一串“ ********************** ”,然後由兩邊向中間逐漸展開 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <

.背景 先說下windbg使用場景.各位coder在工作中或多或少都會遇到下面四種情況 1.原生代碼好好的,放伺服器上執行時間後,IIS服務突然佔用 w3wp.exe CPU突然100% ,

一.背景 先說下windbg使用場景.各位coder在工作中或多或少都會遇到下面四種情況 1.原生代碼好好的,放伺服器上執行一段時間後,IIS服務突然佔用 w3wp.exe CPU突然100% ,不得不回收應用程式池,如果哪次回收晚了,被客戶發現,後果很痛苦~ 2.你的w3wp.

C語言入門到精通,篇就夠了

影響 內容 當前 位置 replace 雙精度 下標 寄存器變量 一個 No.1 計算機與程序設計語言的關系 計算機系統由硬件系統和軟件系統構成,硬件相當於人類的肉體,而軟件相當於人類的靈魂,如果脫離了靈魂,人類就是一具行屍走肉 No.2 C語言的特點 代碼簡潔,靈活性高

近期在JS(誰能看出我想實現什麼功能)

示例程式碼: <script type="text/javascript"> !function(){ var e=/([http|https]:\/\/[a-zA-Z0-9\_\.]+\.baidu\.com)/gi, r=window.location.href,

.控制檯任意輸入長度大於20的字串

1.從控制檯任意輸入一段長度大於20的字串,若長度不符合, #則提醒使用者重新輸入,直到輸入成功為止。 #然後對字串進行操作,把字串去掉左右的空格。 #讓使用者輸入一個字元,並且以使用者輸入的字元進行切片, #對切片後的字串處理掉空的字串, #列印切片後每個字串的長度, #並且使所有字串居中