簡體   English   中英

堆棧框架在我的函數中的外觀如何?

[英]How does the stack frame look like in my function?

我是匯編的初學者,我很想知道堆棧框架的外觀,因此我可以通過理解而不是算法來訪問參數。

PS:組裝功能就是process

#include <stdio.h>
# define MAX_LEN 120     // Maximal line size

extern int process(char*);

int main(void) {
  char buf[MAX_LEN];   
  int str_len = 0;

  printf("Enter a string:");  
  fgets(buf, MAX_LEN, stdin);
  str_len = process(buf); 

因此,我知道當我要訪問匯編中的process函數的參數時,必須執行以下操作:

push ebp

mov ebp, esp ; now ebp is pointing to the same address as esp

pushad

mov ebx, dword [ebp+8]

現在我也希望有人在我認為正確的事情上糾正我:

  1. 首先,esp指向函數的返回地址,[esp + 8]是其下的堆棧中的插槽,它是函數的參數

  2. 由於函數過程只有一個參數,並且沒有內部聲明(不確定聲明),因此從高到低的堆棧幀是參數的8個字節,返回地址是8個字節。

謝謝。

除了通過調試器之外,沒有其他方法可以告知。 您使用的是ia32約定(ebp,esp)而不是x64(rbp,rsp),但是期望int /地址為64位。 有可能,但不可能。

編譯程序(gcc -O -g foo.c),然后使用gdb a.out運行

 #include <stdio.h>
 int process(char* a) {  printf("%p", (void*)a); }
 int main()
 {
      process((char *)0xabcd1234);
 }

中斷流程; 跑; 拆卸; 檢查寄存器值並轉儲堆棧。

- break process
- run
- disassemble
- info frame
- info args
- info registers
- x/32x $sp - 16   // to dump stack +-16 bytes in both side of stack pointer

然后添加更多參數,第二個子例程或具有已知值的局部變量。 一步到printf例程。 那里的堆棧看起來像什么?

您還可以將gdb用作計算器: sprax有什么區別?
如果您想知道,則print $sp - $rax

標記編譯器以產生匯編器輸出(在Unixy系統上,通常帶有-S標志)。 調試/非調試標志,調試器的額外提示可能有助於參考源。 不要給出優化標志,編譯器進行的重組可能導致徹底的混亂。 在代碼中添加一個簡單的函數調用,以查看其設置和拆卸方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM