[ASM] problem z obliczeniami

0

Witam,

Mam problem z tym kodem, który w ax na samym końcu powinien umieścić wynik wzroru d/(b-c)*(a+b):

.MODEL  SMALL
ASSUME   DS:Dane, CS:Kod, SS:Stosik
Dane            SEGMENT
a               DB      20
b               DB      10
c               DB      5
d               DW      3
Dane            ENDS
Kod             SEGMENT 
Start:
                mov     	ax, Dane
                mov     	ds, ax

                
                mov	bx, WORD PTR b
                sub	bx, WORD PTR c
                mov	ax, WORD PTR d
                div		bl
                mov	bx, WORD PTR a
                add	bx, WORD PTR b
                mul	bx             
                               
                ; ax zawiera wynik

                mov     	ax, 4C00h
                int     	21h

Kod             ENDS
Stosik          SEGMENT  STACK
                DB      512 DUP (?)
Stosik          ENDS
END    Start

Może ktoś mi pomóc? Pewnie trzeba sobie jakoś sobie poradzić z resztą z dzielenia, ale nie mam pojęcia jak...

Pozdr.

0

No tak na pierwszy rzut oka to powinieneś robić np. nie
MOV BX, word ptr b
tylko
MOV BL, byte ptr b
a potem
SUB BL, c

...

ale rzucając okiem po raz drugi i trzeci można zauważyć, iż reszta powinna to wyglądać tak:

(...)
                mov        ax, WORD PTR d
                div                bl
                mov        bl, WORD PTR a
                add        bl, WORD PTR b
                mul        bl
(...)             

I w tym momencie w AX masz wynik a w BX: (a+b)
Powino działać - nie sprawdzałem.

Pozdrawiam

0

Dzięki za odezwę. ;)
Zmieniłem kod z obliczeniami na:

mov	bl, BYTE PTR b
                sub	bl, c
                mov	ax, WORD PTR d
                div		bl
                mov	bl, BYTE PTR a
                add	bl,  b
                mul	bl 

Nie bardzo dalej wiem w czym jest problem (bo dalej nie działa do końca).
Z tego co widzę: po dzieleniu w ax jest wartość 0300h. (wynikiem dzielenia z podanych liczb, 3/(10-5) jest oczywiście 3/5).
No i potem przy mnożeniu ax przez wynik dodawania (30) ax zeruje się, a wynik końcowy powinien wynosić 18... :(

0

może użyj koprocesora ;p

0

Wynik jest błędny, bo w zwykłych rejestrach nie zapiszesz takiej liczby jak 3/5 tylko 1 i reszta 2.
dla danych, które podałeś wystarczy przekształcić wzór:
d
----- * (a+b)
b-c

na:

d*(a+b)

b-c

wygląda to tak:

;[d*(a+b)]/(b-c)
XOR		AX, AX
MOV		AL, a
ADD		AL, b
MOV		BX, d
MUL		BX
XOR		BX, BX
MOV		BL, b
SUB		BL, c
DIV		BX

Ale nie obiecuje ci efektu dla innych danych.

A co do kooprocesora...

FILD		d
FILD		b
FISUB		c
FDIVP		ST(1), ST
FILD		a
FIADD		b
FMULP

Chyba będzie szybciej... :> i na pewno nie będzie takich problemów
Pozdrawiam
V-tec

PS Wydaje mi się, że ludzi piszących w asm na tym forum jest niewielu... kto to widział, żeby taki banalny problem leżał odłogiem przez kilka dni [???]
Ja niestety za często nie mogę tu zaglądać, bo mam modem :( :d

1 użytkowników online, w tym zalogowanych: 0, gości: 1