Soru:
Kayıt işlemleriyle AMD64 derleyici optimizasyonları
Modoc
2013-03-21 06:44:32 UTC
view on stackexchange narkive permalink

AMD64 (x86-64 veya x64 olarak da bilinir) kayıtlarına bir seferde 8, 16, 32 veya 64 bit erişilebilir. Bir sökme listesini okurken, hangi yazmaç işlemleri basit değildir?

Örneğin, bir talimat bir kaydın bir kısmına eriştiğinde, diğer bölümleri nasıl etkiler?

Hangi tipik talimatlar veya optimizasyon uzmanları tarafından kullanılan talimat dizileri, açık olmayan bir şeyi kodlayabilir (örneğin, bir kaydı sıfıra ayarlamak için kendi başına xoring)?

Bu soru çok geniş. Tam cevaplar yerine anekdotların bir listesine götürecektir. Çok daha fazla odaklanmalıdır, en azından belirli bir konuyla ve tercihen belirli bir derleyici veya platformla sınırlandırılmalıdır (örneğin, Visual C ++ 'da yığın manipülasyonları). Zaten [bir cevap] olduğu için (http://reverseengineering.stackexchange.com/a/111), bu cevabın konusuna odaklanan bir düzenleme önerdim: kayıt işlemleri.
@Gilles'yi düzenlediğiniz için teşekkürler. Sorduğumda sorunun çok geniş olduğunu biliyordum ama yine de istediğimi iletecek şekilde yeniden ifade edemedim.
Umarım soru hala ilgilendiğiniz şeye yaklaşır. VC ++ ile yığın manipülasyonları hakkında ayrı bir soru sormanızı tavsiye ederim, bu soruyu buna odaklanmak için düzenledim, ancak mevcut yanıtı yerleştirmenin daha yararlı olacağını düşündüm.
Bir cevap:
#1
+10
Igor Skochinsky
2013-03-21 08:15:42 UTC
view on stackexchange narkive permalink

Gerçekten bir optimizasyon değil, ancak x86'dan geldiğinizde bilmeniz gereken bir şey şudur:

32 bitlik bir kayıtta yapılan herhangi bir işlem 64 bitlik olanın üst yarısını sıfırlar

Örneğin, aşağıdaki:

  mov eax, 3  

Gerçekte şuna eşdeğerdir:

  mov rax, 3  

Bu aynı zamanda yeni kayıtlar r8 - r15 için de geçerlidir, ör.

  inc r8d  

ayrıca r8 öğesinin üst yarısını da sıfırlar.

Ancak , yazmaçların 8 bitlik ve 16 bitlik bölümleri bu şekilde çalışmaz, yani üzerlerindeki işlemler yazmacın yalnızca o bölümünü değiştirir.



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...