[英]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]
現在我也希望有人在我認為正確的事情上糾正我:
首先,esp指向函數的返回地址,[esp + 8]是其下的堆棧中的插槽,它是函數的參數
由於函數過程只有一個參數,並且沒有內部聲明(不確定聲明),因此從高到低的堆棧幀是參數的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用作計算器: sp和rax有什么區別?
如果您想知道,則print $sp - $rax
。
標記編譯器以產生匯編器輸出(在Unixy系統上,通常帶有-S
標志)。 調試/非調試標志,調試器的額外提示可能有助於參考源。 不要給出優化標志,編譯器進行的重組可能導致徹底的混亂。 在代碼中添加一個簡單的函數調用,以查看其設置和拆卸方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.