eax ebx ecx edx 這些是cpu里面的暫存器
ebp esp 存放地址的暫存器,用來維護函式的堆疊幀,
c語言代碼如下
#include<stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 10;
int b = 20;
int c = 0;
c=Add(a, b);
return 0;
}
首先我們要知道main函式也是被其他函式呼叫的

所以在程式執行之前,記憶體中已經開辟了空間,
而在記憶體中的地址使用是由高地址到低地址,每次開辟空間放置新的元素叫壓堆疊,洗掉元素叫出堆疊,剛開始我們看到的記憶體是這樣的

將程式轉到匯編,我們可以看到很多指令,這些指令都非常精細,考慮非常周到,

push是壓堆疊的意思,第一條指令創建一個新的元素存放ebp的地址,因為從上往下,所以叫壓堆疊,每次壓進新的元素,esp的位置也跟著變化,

mov是移動的意思,第二條指令將ebp指向的位置變為esp
執行之前

執行之后

可以看到,ebp的位置確實變為esp的位置,

sub是相減,這條指令讓esp-0E4h(這里是十六進制) 也就是228.

執行指令后esp的位置發生變化,從高地址變為低地址
在完成上面倆條指令后,esp和ebp的位置發生變化,如圖


前三條指令都是壓堆疊,將ebx 、esi、edi壓進去,可以看到esp的位置也跟著變化,
lea是load effective address 加載有效地址,將ebp-24h的地址放入edi,

這三條指令執行完畢后會將ebp-24h到ebp之間的記憶體全部初始化為cccccccc



在將0Ah、14h、0分別賦給a和b與c之后,a和b和c之間倆倆相空倆個元素(vs2019,不同的編譯器不太一樣,這里博主就不展示了)
準備呼叫Add函式,在呼叫之前要進行傳參,call是下一條指令的地址

在將b和a的值分別賦給eax和ecx之后并入堆疊,
呼叫函式之后,重新開辟空間,


最后運算完畢銷毀變數和所開辟的空間,因為要銷毀變數,所以在回傳值的時候將z的將存入eax中,最后賦給c,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292388.html
標籤:其他
