第27部分- Linux x86 64位彙編 寄存器
64位時候X86處理器的寄存器如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csUXOtNGaKdEZ2VjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3AzNwEjM0kDMwMTNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
《Computer Systems A Programmer's Perspective, 3rd Edition》檔案中有這圖。re
64和32位的差異是:
- 64位有16個寄存器,32位隻有8個。但是32位前8個都有不同的命名,分别是e開頭,而64位前8個使用了r代替e。e開頭的寄存器命名依然可以直接運用于相應寄存器的低32位。而剩下的寄存器名則是從r8 - r15,其低位分别用d,w,b指定長度。
- 32位使用棧幀來作為傳遞的參數的儲存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r9作為第1-6個參數。rax作為傳回值
- 64位沒有棧幀的指針,32位用ebp作為棧幀指針,64位取消了這個設定,rbp作為通用寄存器使用
- 64位支援一些形式的以PC相關的尋址,而32位隻有在jmp的時候才會用到這種尋址方式。