一直存在比較模糊的概念,因此用一個例子強化記憶。
linux x86 gcc3.2.3 AT&T格式的彙編
程式碼如下:
void
fun()
{
int a = 'A';
}
void
main()
{
int b;
fun();
return;
}
開始除錯
[sanool@sanool ex2]$ gdb a.out
GNU gdb Red Hat Linux (6.0post-0.20031117.6rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...(no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) disas main
Dump of assembler code for function main:
0x08048323 <main+0>: push %ebp
0x08048324 <main+1>: mov %esp,%ebp
0x08048326 <main+3>: sub $0x8,%esp
0x08048329 <main+6>: and $0xfffffff0,%esp
0x0804832c <main+9>: mov $0x0,%eax
0x08048331 <main+14>: sub %eax,%esp
0x08048333 <main+16>: call 0x8048314 <fun>
0x08048338 <main+21>: leave
0x08048339 <main+22>: ret
0x0804833a <main+23>: nop
0x0804833b <main+24>: nop
End of assembler dump.
(gdb) disas fun
Dump of assembler code for function fun:
0x08048314 <fun+0>: push %ebp
0x08048315 <fun+1>: mov %esp,%ebp
0x08048317 <fun+3>: sub $0x4,%esp
0x0804831a <fun+6>: movl $0x41,0xfffffffc(%ebp)
0x08048321 <fun+13>: leave
0x08048322 <fun+14>: ret
End of assembler dump.
解釋如下:
**當程式下一步執行 0x08048333 <main+16>: call 0x8048314 <fun> 時
esp = 0xbfffe660 (執行時)
ebp = 0xbfffe668 (執行時)
eip = 0x08048333
**然後執行 call 0x8048314<fun> 也就是
push %eip ( 相當於 sub $4 %esp 再 mov %eip %esp )
movl $0x8048314, %eip
則0xbfffe65c 處為 eip = 0x08048338
且esp = 0xbfffe65c
eip = 0x8048314
ebp = 0xbfffe668
**執行0x08048314 <fun+0>: push %ebp後
esp = 0xbfffe658
ebp = 0xbfffe668
0xbfffe658處的值為 ebp = 0xbfffe668
**繼續0x08048315 <fun+1>: mov %esp,%ebp
將esp的值賦值給ebp
即 ebp = esp = 0xbfffe658
**開始執行 0x08048321 <fun+13>: leave 前
eip = 0x08048321
ebp = 0xbfffe658
esp = 0xbfffe654
**開始執行 0x08048321 <fun+13>: leave 時
即進行
movl %ebp, %esp ( 即 esp = ebp = 0xbfffe658)
pop %ebp ( 也就是 mov %esp,%ebp 再 add $4,%esp )
此時 ebp = 0xbfffe668 回到了原函式的ebp值,
**再執行 0x08048322 <fun+14>: ret
即 pop %eip
( 也就是 mov %esp,%eip 再 add $4,%esp )
此時 eip = 0x08048338
程式繼續執行 main 中的 leave
呼叫fun函式結束
呼叫函式時,暫存器到底發生了那些變化?
相關文章
- 函式呼叫暫存器及棧幀結構函式
- oracle 臨時表 解決 "表 *** 發生了變化,觸發器/函式不能讀"的問題Oracle觸發器函式
- Oracle 表 XXXXX 發生了變化, 觸發器/函式不能讀它.Oracle觸發器函式
- ES6走走看看—字元到底發生了什麼變化字元
- CS 暫存器 和 IP 暫存器
- 基於暫存器呼叫的軟體加速
- MySQL 儲存函式及呼叫MySql儲存函式
- 暫存器
- 【STM32】【暫存器】暫存器位讀寫方式配置系統時鐘
- 當 Redis 發生高延遲時,到底發生了什麼Redis
- 【圖文】函式呼叫過程中棧的變化函式
- 執行緒中呼叫fork函式,鎖的變化執行緒函式
- 暫時性死區以及函式作用域函式
- STM32暫存器的本質到底是什麼???
- 七、函式-儲存過程-觸發器函式儲存過程觸發器
- 暫存器定址和暫存器間接定址的區別
- 【C/C++】 C++暫存器優化C++優化
- 程式分析與優化 - 8 暫存器分配優化
- 暫存器,觸發器,三極體小結觸發器
- Android在橫豎屏切換時到底發生了什麼?Android
- 時間函式:與時間相關那些事。。。函式
- JavaScript之Arguments物件暫存函式引數與屬性JavaScript物件函式
- CUDA優化之執行配置和暫存器優化優化
- 淺析一個函式呼叫另一個函式的變數函式變數
- setInterval()呼叫其他函式時候報錯函式
- 為什麼Modbus的只讀暫存器被稱為“輸入暫存器(Input Registers)”而不是“輸出暫存器”
- 【05】瞭解C++默默編寫並呼叫那些函式C++函式
- 函式呼叫的代價與優化函式優化
- oracle 建立表,序列,索引,檢視,觸發器,函式,儲存過程,定時器,包體Oracle索引觸發器函式儲存過程定時器
- System.gc 之後到底發生了什麼 ?GC
- 溫故知新-輸入網址-顯示網頁-到底到底到底到底-發生了什麼?網頁
- 從建立程式到進入main函式,發生了什麼?AI函式
- JVM-執行時資料區之PC暫存器JVM
- CS、IP和PC暫存器
- Smali語法:Registers(暫存器)
- 教你如何檢視 Git 提交中發生了什麼變化Git
- 破解儲存過程,函式,檢視,觸發器解密儲存過程函式觸發器解密
- 子函式呼叫函式