簡體   English   中英

32位和64位處理器的堆棧有何不同

[英]how stack differs in 32 bit and 64 bit processors

我在gdb中為32位和64位intel處理器分解了以下代碼。

void main() {
5      char *args[2];
6   
7      args[0] = "/bin/sh";
8      args[1] = NULL;
9      execve(args[0],args,NULL);
10     exit(0);
11  }

以下是生成的匯編代碼。

對於64位

Dump of assembler code for function main:
   0x000000000040105e <+0>: push   %rbp
   0x000000000040105f <+1>: mov    %rsp,%rbp
   0x0000000000401062 <+4>: sub    $0x10,%rsp
   0x0000000000401066 <+8>: movq   $0x493564,-0x10(%rbp) ; <- this line
   0x000000000040106e <+16>:    movq   $0x0,-0x8(%rbp)
   0x0000000000401076 <+24>:    mov    -0x10(%rbp),%rax
   0x000000000040107a <+28>:    lea    -0x10(%rbp),%rcx
   0x000000000040107e <+32>:    mov    $0x0,%edx
   0x0000000000401083 <+37>:    mov    %rcx,%rsi
   0x0000000000401086 <+40>:    mov    %rax,%rdi
   0x0000000000401089 <+43>:    callq  0x433510 <execve>
   0x000000000040108e <+48>:    mov    $0x0,%edi
   0x0000000000401093 <+53>:    callq  0x407560 <exit>

對於32位

Dump of assembler code for function main:
0x8000130 <main>:       pushl  %ebp
0x8000131 <main+1>:     movl   %esp,%ebp
0x8000133 <main+3>:     subl   $0x8,%esp
0x8000136 <main+6>:     movl   $0x80027b8,0xfffffff8(%ebp) ; <- this line
0x800013d <main+13>:    movl   $0x0,0xfffffffc(%ebp)
0x8000144 <main+20>:    pushl  $0x0
0x8000146 <main+22>:    leal   0xfffffff8(%ebp),%eax
0x8000149 <main+25>:    pushl  %eax
0x800014a <main+26>:    movl   0xfffffff8(%ebp),%eax
0x800014d <main+29>:    pushl  %eax
0x800014e <main+30>:    call   0x80002bc <__execve>
0x8000153 <main+35>:    addl   $0xc,%esp
0x8000156 <main+38>:    movl   %ebp,%esp
0x8000158 <main+40>:    popl   %ebp
0x8000159 <main+41>:    ret
End of assembler dump.

在上面我標記的匯編代碼是我還沒有理解的地方。 64位系統聲明16位(我想學習的位,字節或字)從rbp偏移,而32位系統聲明從ebp偏移8位。 有人可以解釋堆棧指針在32位和64位系統中的進展以及它是什么單位(位,字節或字)的區別。

char * args[2];

是一個兩個指針的數組。 在32位機器上,指針(地址,但不一定)是32位寬,而在64位機器上,指針(和從不地址)是64位寬。

這意味着,當前堆棧幀中堆棧上的區域必須是2 * pointer_width ,這對於32位機器為8 ,對於64位機器為16

您可以在下面的代碼中看到

movl   $0x80027b8, -0x8(%ebp)
movl   $0x0, -0x4(%ebp)

...向指針移動32位雙字(字符串的一個地址,以及一個NULL )。

另一方面,64位代碼需要兩個雙字(8字節)來存儲地址。

movq   $0x0, -0x8(%rbp)
movq   $0x493564, -0x10(%rbp)

暫無
暫無

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

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