ufak bir hata

8086 asm ile ugrasmayali 30 yil oluyor.

Yanlis hatirlamiyorsam carpma isleminde sonuc DX icine yaziliyordu. (High word)

neyse diyelim ki senin yazimin dogru

o zaman soyle yapacaksin

; Kup hacmi hesaplama
mov ax, taban
mov bx, ax
imul ax, ax
imul ax, bx
mov kup_hacim, ax

Fakat soyle bir sorun var. 16x16 32 bit sonuc uretir. Bunu da 16 bit ile carpinca 48 bit gerekir.

Bu yuzden 32 bit registerlerle islem yapman dogru olacaktir.
 
Carpma isleminde operand memory olamiyor diye hatirliyorum.

Dolayisi ile imul ax, taban satirina hata alirsin.

; Kup hacmi hesaplama
mov ax, taban ; bu satira hata veriyor mu?
mov bx, ax
mul ax
mul bx
mov kup_hacim, ax ; bu satira hata veriyor mu?

Buna hata vermez ama bu yapi dogru degil.
Dene hata almiyorsan neden bu yapi isini gormez anlatayim.

Online derleyici tamam ama adim adim isletip registerleri gorebilecegim debugger da lazim.
 
Son düzenleme:
Yok ozel mesajini gordum.

Asagidaki kod bir kenari 0x10 olan kupun hacmini hesapliyor ve sonuc AX icinde olusuyor.

start:
mov ax, 0x10
mov bx, ax
mul ax ; ax in karesini aldik. Sonuc ax icinde
mul bx ; ax kare ile ax'i carptik sonuc ax icinde
exit:

Hacim isleminde sonuc 16 bit icinde kaliyorsa (tasmiyorsa) yukaridaki kod dogru calisir.
Bu da demektir ki kubun bir kenari en fazla 40 olabilir.

Senin kodundaki hata

imul ax, taban

Taban degiskenini carpma isleminde kullanamazsin. Yani memorydeki bir degiskeni carpma isleminde operand olarak kullanamazsin.
Hemen yukarida 0x10 un 3. kuvvetini nasil hesapladigima bak.

Eger kupun bir kenari 40 dan daha buyuk ise 16x16 ve 32x16 carpma rutinlerini yazmak zorunda ve hacimi 48 bit hesaplamak zorundasin.
 
Son düzenleme:
Memoryde MyVar adindaki degiskenin kupunu hesaplayip ardindan memorydeki Hacim degiskenine yazalim.

lea bx, MyVar ; MyVar degiskenin adresini bx icine oku
mov ax, [bx] ; ax'e MyVar degerini oku
mov bx, ax ; Myvar degerini bx de de saklayalim
mul ax ; ax in karesini aldik. Sonuc ax icinde
mul bx ; ax kare ile ax'i carptik sonuc ax icinde
lea bx, Hacim ; Hacim degiskenin adresini bx icine oku
mov [bx], ax ; ax icinde hesaplanmis hacim verisini Hacim degiskenine yaz,

Dedigim gibi bu sadece kenari 0...40 araliginda olan kuplerin hacmini hesaplayabilir.

Yapmaniz gereken 16x16 ve 32x16 carpma rutinlerini yazmaniz gerekiyor.

Cunku bir kenari 0...65535 araliginda olan sayinin karesi 32 bit sonuc uretir.
Bunu da tekrar 16 bit ile carparsaniz 48 bit sonuc cikar.

Dolayisi ile Hacim hesabindan sonra yapacaginiz tum islemler 48 bit matematik islem olmak zorunda.

Hocaniz fazla kasmis.
 
Son düzenleme:

Forum istatistikleri

Konular
5,975
Mesajlar
101,911
Üyeler
2,514
Son üye
evrenbasaran

Son kaynaklar

Son profil mesajları

deneyci wrote on hakan8470's profile.
Sibonge uNkulunkulu ngokuhlukahluka asinike kona.

Bu hangi dil? :)
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
Back
Top