2010-02-13 21 views
8

Montajda iki sayıyı bölmeye çalışıyorum. Irvine topluluğu bilgisayar kitapları için çalışıyorum ve hayatımın bölünmesi için iş yapamıyorum.masm bölme taşması

İşte WriteDec (bölme çağrısından sonra bölüm olarak ayarlanması gerekir) eax kayıtta ne olursa olsun sayı yazmalısınız kodum

.code 
main PROC 
    call division 
    exit 
main ENDP 

division PROC 
    mov eax, 4 
    mov ebx, 2 
    div ebx 
    call WriteDec 
    ret 
divison ENDP 

END main 

bu. Onun yerine her zaman görsel stüdyo çöküyor (program derleme yapar).

+1

çekilir misin? Her bir öğretime adım attığınızda ne kadar kazanıyorsunuz? –

+0

Project.exe'de 0x00401075'te işlenmeyen özel durum: 0xC0000095: Tamsayı taşması. Aramanın tamamlanmasından hemen sonra gerçekleşir. –

+0

2'ye bölerseniz ve performansla ilgileniyorsanız SHR'yi kullanmayı düşünebilirsiniz. –

cevap

13

Sen EDX bölünme yapmadan önce kayıt uzatmak sıfır gerekir:

mov eax, 4 
mov ebx, 2 
xor edx, edx   ;set edx to zero 
div ebx 
call WriteDec 

;set edx to zero MASM bir yorumdur. Ben bunu C satır içi montaj kullanıyorsanız çalışacağız bilmiyorum, bu yüzden u hem ebx'e tarafından eax bölmek zaman çünkü :)

+0

Evet! Bu konuda bana yardımcı olduğunuz için çok teşekkür ederim. –

+1

EDX açıklığını sıfırlamak yerine, tipik olarak EAX'i EDX'e uzatmak için CDQ komutunu kullanırdı. EAX negatif değilse, EDX sıfırlarla doldurulur; EAX negatif ise, EDX bir bit ile doldurulur. –

+0

Evet, bu açıdan haklısınız, fakat OP * un * imzalı bölüm yapıyor, bu yüzden cevabımı basit tuttum. – slugster

0

i yukarıda belirtilen gerekçe doğru olduğunu düşünüyorum eğer onu kopyalamayın 32 bit sayılar ama 64 bit bölen 32 bit olması gerekir ve böylece msx edx olarak edx 0 veya 3bx kullanımı yerine sadece bx... 16 bit'lik bir sayıya

3

tarafından numara Evet, sıfıra edx ayarlamanız gerekir.

Bunu yapmanın en kolay yoludur: Visual Studio ayıklayıcısında içinden

xor edx, edx