Aracılığıyla paylaş


x64 mimarisi

x64 mimarisi, x86'nın yeni bir 64 bit modu ve x86 ile aynı eski 32 bit modu sağlayan geriye dönük uyumlu bir uzantısıdır. Bu mimari, x86'nın sekiz genel amaçlı kaydını 64 bit'e genişletir, sekiz yeni kayıt ekler ve modern 64 bit programlama için gelişmiş çağrı kuralları ve adresleme modları sunar.

"x64" terimi hem AMD64 hem de Intel 64 içerir. Yönerge kümeleri neredeyse aynıdır.

Kayıtlar

x64, x86'nın sekiz genel amaçlı yazmaçını 64 bit olacak şekilde genişletir ve sekiz yeni 64 bit yazmaç ekler. 64 bit yazmaçların adları "r" ile başlar. Örneğin, eax'in 64 bit uzantısı rax olarak adlandırılır. Yeni yazmaçlar r8 ile r15 olarak adlandırılmıştır.

Her yazmaçtaki alt 32 bit, 16 bit ve 8 bit, işlemcilerde doğrudan adreslenebilir. Bu doğrudan adreslenebilirlik, önceden alt 8 biti adreslenemeyen esi gibi yazmaçları içerir. Aşağıdaki tabloda, 64 bit yazmaçların alt bölümleri için derleme dili adları belirtilmektedir.

64 bitlik yazmaç Daha düşük 32 bit Daha düşük 16 bit Alt 8 bit düzeltme
rax eax ax al
rbx ebx bx bl
rcx ecx cx cl
rdx edx dx dl
rsi esi si sil
rdi edi di dil
rbp ebp bp bpl
rsp esp sp spl
r8 r8d r8w r8b
r9 r9d r9w r9b
r10 r10d r10w r10b
r11 r11d r11w r11b
r12 r12d r12w r12b
r13 r13d r13w r13b
r14 r14d r14w r14b
r15 r15d r15w r15b

32-bit alt yazmacına çıkış yapan işlemler otomatik olarak sıfırlarla genişletilerek 64-bit yazmacın tamamına uygulanır. 8 bit veya 16 bit alt kayıtlara çıkış yapan işlemler sıfır genişletme yapmaz (bu davranış x86 ile uyumludur).

Yüksek 8 bit ax, bx, cx ve dx hala ah, bh, ch ve dh olarak adreslenebilir ancak tüm operand türleriyle kullanılamaz.

Komut işaretçisi eip ve bayrak yazmacı 64 bit'e genişletilir (sırasıyla rip ve rflags).

x64 işlemci ayrıca çeşitli kayan nokta yazmaç kümeleri de sağlar:

  • Sekiz adet 80 bit x87 yazmaç.

  • Sekiz 64 bit MMX yazmaç. (Bu yazmaçlar x87 yazmaçlarıyla çakışıyor.)

  • Sekiz 128 bit SSE yazmaçlarından oluşan özgün küme 16'ya yükseltilir.

Çağırma kuralları

x86 mimarisinden farklı olarak, C/C++ derleyicisi x64 üzerinde yalnızca bir çağrı kuralını destekler. Bu çağırma kuralı, x64'te kullanılabilir yazmaç sayısının artmasından yararlanır:

  • İlk dört tamsayı veya işaretçi parametresi rcx, rdx, r8 ve r9 yazmaçlarında geçirilir.

  • İlk dört kayan nokta parametresi, xmm0-xmm3 olan ilk dört SSE yazmacında geçirilir.

  • Çağıran, yazmaçlarda geçirilen bağımsız değişkenler için yığında yer ayırır. Çağrılan işlev, registerların içeriğini yığına aktarmak için bu alanı kullanabilir.

  • Yığındaki diğer bağımsız değişkenleri geçirirsiniz.

  • rax yazmacında bir tamsayı veya işaretçi dönüş değeri döndürülürken, xmm0'de kayan nokta dönüş değeri döndürülür.

  • rax, rcx, rdx, r8-r11 geçicidir.

  • rbx, rbp, rdi, rsi, r12-r15 kalıcı değildir.

C++ için çağırma kuralı benzerdir. Bu işaretçi örtük bir ilk parametre olarak geçirilir. Sonraki üç parametre kalan register'lara aktarılırken geri kalanı yığına aktarılır.

Adresleme modları

64 bit modundaki adresleme modları benzerdir ancak x86 ile aynı değildir.

  • 64 bit yazmaçlara başvuran yönergeler, otomatik olarak 64 bit hassasiyetle çalışır. Örneğin, mov rax, [rbx] rbx'te başlayan 8 baytı rax'a taşır.

  • 64 bit anlık sabitler veya sabit adresler için özel bir mov yönergesi biçimi vardır. Diğer tüm yönergeler için, anlık sabitler veya sabit adresler hala 32 bittir.

  • x64 yeni bir rip göreli adresleme modu sağlar. Tek bir sabit adrese ait direktifler rip kaydırmaları olarak kodlanır. Örneğin mov rax, [addr] yönergesi, addr + + rip adresinden başlayarak rax'e 8 bayt taşır.

Yönerge işaretçisine ve yığın işaretçisine örtük olarak başvuran jmp, call, push ve pop gibi yönergeler, x64 platformunda bunları 64 bitlik yazmaçlar olarak ele alır.