2011-11-22 28 views
6

Montaj dilinde bölümlemeyi öğreniyorum. Öğrendiğim kitaba göre, islami operasyonun sonucu eax ve geri kalanlar ise edx.Mod işleci montajda nasıl uygulanır

Kitapta bir uygulama, number = result % divisor montajını uygulamaktır.

Bunun, edx'in sonuç olması dışında normal bir bölme işlemine eşdeğer olacağını düşünürdüm. Bununla birlikte, bu işe yaramadı ve edx, görünüşte çöp olarak geri dönüyordu.

Neden? Yukarıdaki sözde kodu montajda nasıl uygularsınız?

+4

Küçük bir C işlevi kodlar ve oluşturulan derleme (örneğin, gcc -O -fverbose-asm -S tiny.c) ile) –

+2

Sorunuza benzer http://stackoverflow.com/questions/8021772/assembly-language-how-to-do-modulo/8022107 Belirli bir sorunla karşılaşıyorsanız gerçek kodunuzu gösterin (büyük olasılıkla, rdx'in üst üst kısmını temizlemiyorsunuzdur: rax, edx: eax veya dx: ax). – user786653

+0

Kodu görmeden tahmin etmek zor, ancak ortak bir kayma, sıfırdan önce sıfır edx'i unutuyor. –

cevap

15

Tamsayı modülo iki şekilde uygulanabilir : Öncelikle kalan EDX içine konacak DIV veya IDIV kullanarak

, ancak sıfır EDX birinciye veya alıntı intel gerekir:

İşlenen Boyutu ----------- | Temettü | Divizör | Bölüm Geri dönülmez

Dört kelimelik/çift sözcük | EDX: EAX | r/m32 | EAX | EDX.

örn:

eax = eax % 9 

imzasız dönüşür:

imzalı
XOR EDX,EDX ;clear the destinations for outputs. this stops the garbage remainder  
MOV ECX,9 
DIV ECX 
MOV EAX,EDX 

, öyle:

MOV ECX,9 
CDQ ;this will clear EDX due to the sign extension 
IDIV ECX 
MOV EAX,EDX 

İkinci yol, kullandığınız modulo kullanılan bir optimizasyon olduğunu iki güç, bu durumda AND o tarafından iki gücün altında ne olursa olsun, örneğin: eax = eax % 8, AND EAX,7 olur.

+0

imi sürüm imzalanmış olduğundan, CDQ edx'e değil mi? – harold

+0

Sorumu silmeyi denedim, ancak zaten yanıtladınız. Sadece bir kod örneği ekledikten sonra biraz değişebileceğini belirtmek isterim. –

+0

@harold: Evet, unut, iyi yakala :) – Necrolis