函式棧以及資料記憶體段

2021-08-04 21:33:16 字數 2098 閱讀 5788

記憶體位址自下而上由低到高,資料和**都從低位址存放,而函式壓棧是從高位址壓棧,後進來的位址低,先出

(gdb) list

13#include

int global=0;

int rect (int a,int b)

14int quadrate(int a)

15(gdb)

2324

25int main()

2627

4142

(gdb) start

temporary breakpoint 1 at 0x78f: file main.c, line 27.

starting program: /home/yd

/workplace/pointer

/les2/a.out

temporary breakpoint 1, main () at main.c:27

27{(gdb) n //單條執行語句

29int a=3;

(gdb)

30int b=4;

(gdb)

31int

*pa=&a;

(gdb)

32int

*pb=&b;

(gdb)

33int

*pglobal=&global;

(gdb)

34int (*pquadrate)(int a)=&quadrate;

(gdb)

37int

s=quadrate(a);

(gdb) s//單條執行語句,若遇到函式則進入函式內部

quadrate (a=3) at main.c:18

18 count++;

(gdb) bt //檢視棧

#0 quadrate (a=3) at main.c:18

#1 0x00005555555547dc in main () at main.c:37

(gdb) n

19 global++;

(gdb)

20int

s=rect(a,a);

(gdb) p &s

$1 = (int

*)0x7fffffffddfc

(gdb) s

rect (a=3, b=3) at main.c:7

7 count++;

(gdb) n

8 global++;

(gdb)

9int

s=a*b;

(gdb) bt

#0 rect (a=3, b=3) at main.c:9

#1 0x000055555555477f in quadrate (a=3) at main.c:20

#2 0x00005555555547dc in main () at main.c:37

(gdb) p &s

$2 = (int

*)0x7fffffffddd4

(gdb) p &count

$3 = (int

*)0x555555755018

(gdb) f 1

#1 0x000055555555477f in quadrate (a=3) at main.c:20

20int

s=rect(a,a);

(gdb) p &count

$4 = (int

*)0x55555575501c

(gdb) p &global

$5 = (int

*)0x555555755014

(gdb) f 1

#1 0x000055555555477f in quadrate (a=3) at main.c:20

20int

s=rect(a,a);

(gdb) p &global

$6 = (int

*)0x555555755014

(gdb)

函式呼叫過程,資料段(棧幀)變化流程

int func2 int x,int y void func1 void push ebp mov ebp,esp sub esp 0cch lea edi edp 0cch mov ecx 033h mov eax 0cccccccch rep stos dword ptr es edi mov...

彙編的資料段和棧

1.ds和 address 例如 我們要讀取10000h單元的內容可以用如下程式進行 mov bx,1000h mov ds,bx mov al,0 上面的三條指令是將10000h 1000 0 中的資料讀到al中。表示乙個記憶體單元,中的0表示記憶體單元的偏移位址。我們知道只有偏移位址是不能定位乙...

記憶體反轉以及交換兩段連續 不連續 記憶體

在 程式設計珠璣,第二版 和 程式設計之美 中都有關於交換兩段連續的記憶體塊的題目,而且非常經典,交換兩段連續記憶體塊的問題又可以延伸到交換兩段不連續記憶體塊的問題,無論是哪種情況都需要乙個基本操作 反轉記憶體塊。當遇到系統網路傳輸出現大小端不一致時,拼資料幀或者解資料幀的時候需要對不同的資料型別進...