Asembler liczenie wartości wyrażenia.

0

Mam problem bo mój program nie liczy idealnie wyniku, gdzieś jest błąd tyle że ja go nie widzę. Proszę o analize kodu i pomoc. (3a-b/a)(d+3)

                .MODEL SMALL
                 
;               SEGMENT DANYCH
 
Dane        SEGMENT
 
a               EQU   20
b               EQU   10
c               EQU   3
d               EQU   5
;Wynik      DB   ?
 
Dane        ENDS
 
;               SEGMENT KODU
 
Kod         SEGMENT
 
                ASSUME   CS:Kod, DS:Dane, SS:Stosik
                 
Start:      
                ;odtad
                jmp   poczatek
Wynik       DW   ?
 
poczatek:
                ;dotad - nie jestem pewny
                ;tutaj ma sie zaczac
                ;(3*a-b/a)*(d+3)
 
                mov   al, a                 ;al=a
                mov   bl, 03h               ;bl=3
                mul   bl                        ;ax=al*bl
                mov   dl, al                    ;dl=al
                 
                mov   ax, b                 ;ax=b
                mov   bl, a                 ;bl=a
                div   bl                            ;al=ax/bl
 
                sub   dl, al                    ;dl=dl-al
                mov   al, dl                    ;al=dl
                 
                mov   bl, d                 ;bl=d
                mov   cl, 03h               ;cl=3
                add   bl, cl                    ;bl=bl+cl
                 
                mul   bl                        ;ax=al*bl
                mov   Wynik, ax         ;Wynik=ax
 
                ;a tutaj sie skonczy
                mov   ax, 4C00h
                int   21h
                 
Kod         ENDS
 
;               SEGMENT STOSU
 
Stosik      SEGMENT   STACK
                Db   100h   DUP (?)
Stosik      ENDS
 
;               PUNKT STARTOWY
 
                END   Start
0

emu8086 w dłoń i debuguj ;] W szczególności:
mov al, a -> jesteś pewien ze to ci załaduje wartość a? Nie trzeba czasem jakiegoś [a] albo w ogóle ds:[a] (jeśli w ogóle wolno ci się tak odnieść bez użycia rejestru)
Analogicznie dla innych operacji na pamięci

Poza tym masz "zmienne" w dwóch różnych segmentach, adresu segmentu DS w ogóle nidzie nie ustawiasz, a potem odnosisz się do elementów z tych segmentów tak samo bez użycia ds: albo cs:. Jeśli to działa to tylko przypadkiem bo kompilator jest mądrzejszy od ciebie. Ale wątpie żeby działało. Jak robisz odwołania do pamieci to rób to porządnie tzn np.

mov ax, seg zmienna
mov ds, ax
mov bx, offset zmienna
mov al, 10
mov ds:[bx], al

i wtedy przynajmniej wiadomo co się dzieje ;]

0
Dane        SEGMENT
 
a               EQU   20
b               EQU   10
c               EQU   3
d               EQU   5
;Wynik      DB   ?
 
Dane        ENDS

Ten segment jest pusty. Jedyną daną w tym segmencie jest Wynik, zakomentowany.
EQU definiuje makro - stałą liczbową - wartość jest wstawiana bezpośrednio w miejscu użycia, czyli mov al,a to to samo co mov al,20.

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