日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C的function call與stack frame心得

發布時間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C的function call與stack frame心得 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

[技術] C的function call與stack frame心得

Written on 12:00 上午 by Yu Lai

從大二的Program Language中學到stack對於C的function call的實做與功用的概念,
以及各個register的功用,但從未實際地深入了解其中register的變化.
剛好最近T40灌了Ubuntu Linux (x86),就直接寫了些C code,
配合objdump與gdb來trace其中register的變化,於是有了這篇的心得.

首先是複習一下register:
%eip:instruction pointer,用來指到下一個instruction的位置.
%esp:stack pointer,用來指到目前stack的top.
%ebp:Frame pointer,用來指到目前stack frame的開頭.

這次所使用的source code:

#include <stdio.h> void hi(int a, int b) {int i = 3;return; } int main(int argc, char *argv[]) {hi(1, 2);return 0; }


我們先透過$ gcc -o test test.c編出test,
然後再透過objdump -d test來觀察disassemble出來的部份:

08048344 <hi>:8048344: 55 push %ebp8048345: 89 e5 mov %esp,%ebp8048347: 83 ec 10 sub $0x10,%esp804834a: c7 45 fc 03 00 00 00 movl $0x3,-0x4(%ebp)8048351: c9 leave 8048352: c3 ret 08048353 <main>:8048353: 8d 4c 24 04 lea 0x4(%esp),%ecx8048357: 83 e4 f0 and $0xfffffff0,%esp804835a: ff 71 fc pushl -0x4(%ecx)804835d: 55 push %ebp804835e: 89 e5 mov %esp,%ebp8048360: 51 push %ecx8048361: 83 ec 08 sub $0x8,%esp8048364: c7 44 24 04 02 00 00 movl $0x2,0x4(%esp)804836b: 00 804836c: c7 04 24 01 00 00 00 movl $0x1,(%esp)8048373: e8 cc ff ff ff call 8048344 <hi>8048378: b8 00 00 00 00 mov $0x0,%eax804837d: 83 c4 08 add $0x8,%esp8048380: 59 pop %ecx8048381: 5d pop %ebp8048382: 8d 61 fc lea -0x4(%ecx),%esp8048385: c3 ret 8048386: 90 nop


從0x0804835d開始,我們可以看到main()在呼叫hi()時的步驟,
首先先把ebp的值塞進stack中,然後把esp的值塞到ebp裡.
接著把esp減8(因為stack是由高位往低位),再分別把0x2和0x1塞入stack中,
這2個其實就是把hi()所需的變數放入stack中,最後就是call 8048344 <hi>.
接著透過gdb設好breakpoint把stack中的值給印出來.

$ gdb -q test (gdb) b hi Breakpoint 1 at 0x804834a (gdb) r Starting program: /home/lazyf/test Breakpoint 1, 0x0804834a in hi () Current language: auto; currently asm (gdb) x/32xw $esp 0xbfb9a074: 0x0804953c 0xbfb9a088 0x08048280 0xb7f95ff4 0xbfb9a084: 0xbfb9a098 0x08048378 0x00000001 0x00000002 0xbfb9a094: 0xbfb9a0b0 0xbfb9a108 0xb7e61450 0xb7fc8ce0 0xbfb9a0a4: 0x080483a0 0xbfb9a108 0xb7e61450 0x00000001 0xbfb9a0b4: 0xbfb9a134 0xbfb9a13c 0xb7facb38 0x00000000 0xbfb9a0c4: 0x00000001 0x00000000 0x080481f5 0xb7f95ff4 0xbfb9a0d4: 0xb7fc8ce0 0x00000000 0xbfb9a108 0x67416081 0xbfb9a0e4: 0xd8282a91 0x00000000 0x00000000 0x00000000 (gdb)


從stack內的值我們可以觀察到,其實call指令所做的動作就是把下一筆instruction的
address(eip)給push進stack裡(0x08048378被放入0xbfb9a088中),接著再把call的address
塞到eip再執行它.

接著到了hi()中,和main()一樣的先把ebp塞入stack中,然後把把esp的值塞到ebp裡.
從這裡我們可以知道,一個function開始時,會先把上一個function的ebp放入stack中,
接著馬上設定自己的ebp.從這裡可以用來確保目前所在function的ebp的值的正確性,
以及保存之後要return時上一個function的ebp的值.

在hi()中把ebp設定好後,它先在stack中allocate了16個byte來使用,接著我們看到了
在ebp-4的位置上被填入了0x3的值,也就是我們在程式中宣告的變數int i = 3;的實做.

最後是leave指令和ret指令所實做出來的return;.在這裡leave指令的操作相當於
把ebp的值放到esp中,然後從stack中pop出值來放到ebp裡,而ret指令的操作則相當於從
stack中pop出值來放到eip裡.也就是說除了eip外,esp和ebp都回到呼叫hi()之前的狀況.
完成hi()的呼叫.

另外,如果hi()有值需要被return時,通常會透過eax register來傳遞.
也就是說在$lt;hi>中的leave指令前會加入mov xxx,%eax指令,
在<main>中call <hi>指令的下一個指令會是mov %eax,yyy指令讀出eax放入yyy中
和mov $0x0,%eax指令把eax清空.

以上就是我從gdb與objdump中所觀察到的一個C的function被呼叫的過程.
如內容有所錯誤,煩請有看到的人不吝賜教.Thanks.

轉載于:https://my.oschina.net/tsh/blog/1613642

總結

以上是生活随笔為你收集整理的C的function call與stack frame心得的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | 国产高清一区二区三区四区 | 有码中文| 国产色黄 | 久久久久久久久久久av | 中文字幕在线视频播放 | 久久精品色 | 欧美人体一区二区三区 | 亚洲美女视频在线观看 | aa成人| 99国产视频在线 | 色多多在线观看 | 色播在线播放 | 欧美综合在线观看 | av有声小说一区二区三区 | 国产黑丝在线播放 | 一级国产特黄bbbbb | 精品久久人人妻人人做人人 | 9i看片成人免费看片 | 视色视频在线观看 | 成人h视频 | 一个人在线免费观看www | 姐姐你真棒插曲快来救救我电影 | 日韩欧美一区二区三区四区五区 | 伊人青青久 | 欧美精品一区二区久久婷婷 | 无限资源日本好片 | 成人一二三区 | 午夜性色福利影院 | 国产淫视| 在办公室被c到呻吟的动态图 | 在线看中文字幕 | 日韩国产91| 樱花电影最新免费观看国语版 | 91超碰免费 | 亚洲av人人夜夜澡人人 | xiuxiuavnet| 欧美aaaaaaaaaa| 日韩成人性视频 | 97人妻精品一区二区三区软件 | 日韩三级在线观看 | 欧美日韩国产免费观看 | 午夜欧美激情 | 夜间福利在线观看 | 欧美久久久久久久久中文字幕 | 亚洲网在线观看 | 亚洲精品国产精品国自产观看 | 中国性老太hd大全69 | 中文字幕av一区二区三区 | 亚洲色图3p| 毛茸茸亚洲孕妇孕交片 | 亚洲不卡视频在线 | 男男全肉变态重口高h | 国产黄在线 | 中文字幕欧美一区 | 中文字幕免费一区二区 | 天天爽| 台湾少妇xxxx做受 | 亚洲一区二区三区色 | 午夜影视免费 | 国产成人av一区二区三区 | 中文字幕在线日韩 | 午夜精品福利一区二区蜜股av | 美女福利视频 | 国产精品美女在线 | 亚洲国产精品成人综合色在线婷婷 | 国产麻豆91视频 | 日本变态折磨凌虐bdsm在线 | 铠甲勇士猎铠 | 久久久亚洲综合 | 男人捅爽女人 | 亚洲春色在线观看 | 亚洲熟妇av日韩熟妇在线 | 相亲对象是问题学生动漫免费观看 | 日本激情在线 | 91女人18毛片水多国产 | 久草美女| 99热这里只有精品99 | 激情五月五月婷婷 | 青青草免费观看视频 | 亚洲男人的天堂网站 | 自拍一级片 | 青青在线视频 | 欧美日韩一区二区三区在线播放 | 欧美专区日韩专区 | 天堂视频网 | 日本色片网站 | 91网页入口 | 女人裸体无遮挡 | 天天爽夜夜爽夜夜爽 | 免费观看av| 黄色片大全 | 911色| 国产精品爽 | 亚洲欧美在线一区二区 | 欧美日韩一区在线播放 | 日韩在线视频免费看 | 性综合网| 亚洲色图40p|