2015-12-16 9 views
5

Birisi aşağıdaki kodun ne yaptığını açıklayabilir mi?bu x86 montaj talimat ne yapar (addsd xmm0, ds: __ xmm 41f00000000000000000000000000000 @ [edx * 8])?

addsd xmm0, ds:[email protected][edx*8] 

bazı değer xmm0 kayıt yüzer eklenir düşündüm ama 41f00000000000000000000000000000 sabit @ __xmm anlamı nedir? Bu konuda okuyabileceğim bir belge var mı?

İşte anlamaya çalışıyorum kod tam parçası var:

cvtsi2sd xmm0, [ebp+var_2C8] 
mov  edx, [ebp+var_2C8] 
shr  edx, 1Fh 
addsd xmm0, ds:[email protected][edx*8] 

ebp + var_2C8 işaretsiz tamsayı değeridir.

  1. ebp + var_2C8 yüzer dönüştürülür ve
  2. ebp kayıt xmm0 taşınan + var_2C8 bu değişen türetilen
  3. şey 31 bit ile kaydırılır EDX ve sağa doğru hareket edilir xmm0 eklenir. Tam olarak xmm0 eklenir Ne

? Bu hesaplamanın olası bir amacı var mı?

Güncelleştirme.
İşte bu kodu için çiğ sökme var:

cvtsi2sd xmm0,dword ptr [ebp-2C8h] 
mov   edx,dword ptr [ebp-2C8h] 
shr   edx,1Fh 
addsd  xmm0,mmword ptr [edx*8+2685CC0h] 

sabitler diziden bazı çift değer gibi xmm0 eklenir benziyor ...

+2

Bir arama tablosu veya dizi bu. Aptal sabit, sadece sökücünüzün bir ürünüdür (ayrıca bir sembol de olabilir), gerçek adresi görmek için ham sökmeye bakın. – Jester

cevap

9

Bu iki katına işaretsiz tamsayı dönüşmesidir. Nasıl çalışır

ilk işaret biti ait -2 bir ağırlığa sahiptir, yani imzalı olarak dönüştürür, ama tepesi biraz +2 bir ağırlığa sahiptir nerede imzasız edilmelidir. Yani işareti ayarlanmışsa, bu telafi etmek (çift olarak 41f0000000000000) +2 = 4294967296,0 ekler. Bunu sağa kaydırarak, üst biti alt bitin içine koyarak ve diğer her şeyi temizleyerek yapar ve bunu 0 ve 4294967296.0 içeren bir tabloya tablo indeksi olarak kullanır.

+0

Bu ayrıntılı açıklama için size yeterince teşekkür edemem! – leo