AMD onlar 64 bit x86 uzantıları geliştirdi zaman REX
önekleri ve diğer bazı yeni yönergeler için yeni opcodes eklemek için bazı oda gerekli. Bazı opcodes'ların anlamını bu yeni talimatlara değiştirdiler. Talimatların Çeşitli
basitçe mevcut talimatların kısa formları edildi ya da başka gerekli değildi.
PUSHA
kurbanlardan biriydi.
PUSHA
'u neden yasakladıkları açık değil, ancak yeni talimat opcodes'larının üstesinden gelmiyor. Belki de bunlar tamamen kullanıldıklarından ve daha hızlı olmayacaklarından ve kod için yeterli miktarda kod bulunmadıklarından dolayı
PUSHA
ve
POPA
opcodes'leri daha sonra kullanmak üzere rezerve etmişlerdir.
eax
,
ecx
,
edx
,
ebx
,
esp
,
ebp
,
esi
,
edi
:
PUSHA
sırası
kullanıcı kodlama sırası oldu. O gereksiz yere
esp
itti unutmayın! İçe aktardığı verileri bulmak için
esp
'u bilmeniz gerekir!
64-bit kod dönüştürme yapıyorsanız PUSHA
kod zaten hiç iyi değil, bunu r15
aracılığıyla yeni sicillerdir r8
itmek güncellemeniz gerekir.Ayrıca, çok daha büyük bir SSE durumu, xmm8
ve xmm15
'u kaydetmeniz ve geri yüklemeniz gerekir. Onları clobber edeceğini varsayarsak. kesme işleyici kodu basitçe C koduna ileten bir saplama ise
, sen kayıtları tüm kaydetmek gerek yoktur. C derleyicisinin, rbx
, rbp
, rsi
, rdi
ve r12
'u r15
aracılığıyla koruyacak kod üreteceğini varsayabilirsiniz. Yalnızca kaydedip rax
, rcx
, rdx
ve r8
r11
aracılığıyla geri gerekir gerekir. : - (Not Linux veya diğer Sistemi V ABI platformlarında, derleyici rbx
, rbp
, r12
koruyarak olacak r15
, sen rsi
ve clobbered rdi
bekleyebilirsiniz). (Kesintili iplik 32-bit uyumluluk modunda çalışıyorsa sayesinde ughoavgfhw, segmentlere kayıtları korumalıdır)
kademeli kayıt uzun kipinde değer tutun. Aslında, uzun modda segmentasyonun çoğundan kurtuldular, ancak FS
hala iş parçacığı yerel verileri için bir temel adres olarak kullanmak için işletim sistemleri için ayrılmıştır. kendisi önemli değil kayıt değeri, FS
ve GS
taban MSR'ler 0xC0000100
ve 0xC0000101
aracılığıyla ayarlanır. FS
kullanamayacağınızı varsayarak, bunun için endişelenmenize gerek yok, sadece C kodu tarafından erişilen herhangi bir iş parçacığı yerel verilerin herhangi rastgele bir iş parçacığının TLS kullanarak olabileceğini unutmayın. Bunun için dikkatli olun çünkü C çalışma zamanı kitaplıkları bazı işlevler için TLS kullanır (örnek: strtok genellikle TLS kullanır). (Hatta kullanıcı modunda) FS
veya GS
içine bir değer yüklüyor
FSBASE
veya GSBASE
MSR'yi üzerine yazılır. Bazı işletim sistemleri, "işlemci yerel" depolama alanı olarak GS
'u kullandıklarından (her CPU için bir yapıya işaretçinin olması için bir yönteme ihtiyaç duyuyorlar), kullanıcı modunda GS
yüklendikten sonra bir yere ulaşamayacakları bir yerde tutmaları gerekir. Bu sorunu çözmek için, GSBASE
kayıt için ayrılmış iki MSR vardır: biri aktif bir ve bir gizli olan. Çekirdek modunda, çekirdek en GSBASE
zamanki GSBASE
MAB'nde tutulur ve kullanıcı modu tabanı diğer (gizli) GSBASE
MAB'nde olduğunu. İçerik kernel modundan bir kullanıcı kipine geçtiğinde ve bir kullanıcı kipi bağlamı kaydederken ve kernel kipini girerken, içerik anahtar kodu, görünür ve gizli GSBASE
MSR değerlerini değiştiren SWAPGS komutunu yürütmelidir. Çekirdek en GSBASE
güvenle kullanıcı modunda diğer MAB'nde gizlenmiş olduğundan, kullanıcı modu kodu GS
içine bir değer yükleyerek çekirdek en GSBASE
clobber olamaz. İşlemci çekirdek modunu tekrar bağladığında, içerik kaydetme kodu SWAPGS
'u çalıştıracak ve kernel'in GSBASE
sürümünü geri yükleyecektir.
[wiki makalesi] (http://en.wikipedia.org/wiki/X86-64) x86-64'ün x86 ile geriye dönük olarak uyumlu olduğunu okurum. Bir talimatı kaldırmak uyumsuzluk olmaz mı? –