簡體   English   中英

英特爾x86-為什么-4(%ebp)什么都沒指?

[英]intel x86 - why does -4(%ebp) refers to nothing?

在許多示例中,當我編譯c函數(例如排序算法shell sort)時,堆棧地址(我猜它叫嗎?)ebp-4 / -4(%ebp)/ [ebp] -4或類似的值,據我了解,通常用於第一個局部變量,在我的情況下不使用。

所以我想知道是否有人知道它的用途,因為它不用於任何局部變量或其他任何事情。

此外,從堆棧指針中減去20來為區域設置變量分配堆棧空間-但隨后仍將值保存到-24(%ebp)-當僅騰出空間直到-20時,這怎么可能?

C函數看起來像這樣:

void shellsort(int a[], unsigned int n) {
    unsigned int gap, i, j;
for (gap = n / 2; gap > 0; gap = gap == 2 ? 1 : 5 * gap / 11) {
        for (i = gap; i < n; i++) {
            int tmp = a[i];
            for (j = i; j >= gap && tmp < a[j - gap]; j -= gap)
                a[j] = a[j - gap];
            a[j] = tmp;
        }
    }
}

這是我使用gcc -S 32位Ubuntu的堆棧

 12(%ebp)  = n
 8(%ebp)   = a[]
 -8(%ebp)  = tmp
 -12(%ebp) = j
 -16(%ebp) = i
 -20(%ebp) = gap
 -24(%ebp) = (gap * 4) + gap

提前致謝 :)

在x86上, ebp通常用作幀指針,而esp是堆棧指針。 在幀指針周圍,將保存調用者的幀指針和返回地址。 這可以解釋差距。 在我的程序-4(%ebp)實際上使用了-4(%ebp) ,因此也許我們正在尋找一個不同的ABI,但是對於堆棧管理來說應該始終存在空白。

從堆棧指針減去約-20仍訪問-24(%ebp) :可能在程序集中的movl %esp, %ebp之后進行了一次push ,這將占到另外4個字節。

您的問題分為兩部分。

據我了解,第一個與[EBP-4]的用途有關。 為此,我建議您在什么是組裝中的堆棧框架上閱讀x86堆棧框架的摘要

要正確回答問題的整個20/24部分,我們需要查看反匯編的代碼。 以下是您提供的C代碼反匯編的摘錄。

.LFB0:
        .cfi_startproc
        pushl   %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl    %esp, %ebp           /* (1) */
        .cfi_def_cfa_register 5
        pushl   %ebx                 /* (2) */
        subl    $20, %esp            /* (3) */
        movl    12(%ebp), %eax
        shrl    %eax
        movl    %eax, -20(%ebp)
        jmp     .L2
        .cfi_offset 3, -12

我已經在上面的反匯編輸出中確定了三(3)個關鍵行。

在(1),將基本指針設置為堆棧指針。 根據前面鏈接中提供的信息,這只是設置堆棧框架的一部分。

在(2),我們將EBX(非易失性寄存器)保存到堆棧中。 這將自動更新ESP(但不更新EBP),從當前值中減去4。 請注意,執行此操作后,EBP = ESP + 4。

在(3)處,我們從ESP中減去20。 執行此操作后,EBP = ESP + 24。

這就是為什么可以安全訪問[EBP-20]的原因。

希望這可以幫助。

暫無
暫無

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

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