Asembler liczenie wartości wyrażenia.

Odpowiedz Nowy wątek
2016-03-12 18:10
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
edytowany 1x, ostatnio: Shalom, 2016-03-14 10:33

Pozostało 580 znaków

2016-03-14 10:40
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 ;]


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2016-03-14 10:40
a to jest EQU, czyli stała - nie adres w pamięci. - Azarien 2016-03-14 11:55
Faktycznie, nie popatrzyłem ze to nie są db ;] - Shalom 2016-03-14 13:18

Pozostało 580 znaków

2016-03-14 11:57
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`.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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