Asembler - program wykonujący proste obliczenia

0

Witam,
Mam do napisania prosty program wykonujący działanie d/(b-c)*(a+b). Niestety program zawiesza się po uruchomieniu nie wiem co może być przyczyną. Proszę o pomoc.

 .MODEL  SMALL
ASSUME   CS:Kod, DS:dane, SS:Stosik
Dane            SEGMENT

a               DW     2
b               DW     7
c               DW     5
d               DW     3




Dane            ENDS
Kod             SEGMENT

                

 Start:
     mov ax, SEG DANE
     mov ds,ax           
     mov bx, 0   
               
     mov     ax, d
     mov     bx,b
     sub     bx,c

     div     BYTE PTR bx
     mov     bl, byte PTR a
       
     add     bl, byte PTR b ;BL= a+b
     mul     bl ;AX=BL*AL
     mov dx,ax ;mov bl do dl)

         mov ax, 4Ch
     int 21h 

Kod             ENDS

Stosik          SEGMENT   

Stosik           ENDS

END    Start 

0

Odpal to pod emu8086 i rób krok po kroku aż zobaczysz gdzie jest błąd.

0
Stosik          SEGMENT   
 
Stosik           ENDS

i co, pusty ten stos?

Stosik          SEGMENT STACK
    db 4096 dup (?)
Stosik           ENDS
0

Niestety nic nie pomogło :(

0

Ale co nie pomogło? Odpaliłeś pod emu8086? Przeszedłeś program krok po kroku? I co?

0

Tak już wcześniej sprawdzałem program z wykorzystaniem Turbo Debbugera i przy linii:

 
      mov ax, 4Ch
     int 21h 

TD się zawiesza, a po chwili DosBOX się wyłącza.

0

Ale czemu nie zrobisz tego tak jak ci napisałem?
A co do podanej linii to jest poprawna i powinna zakończyć program.

0

Zrobiłem tak, odpaliłem program w DosBoxie

0

Nie mogę używać innych emulatorów.

0

Nie mogę używać innych emulatorów.
Stoi nad tobą terro bojownik o wolność z kałachem i pilnuje?

     div     BYTE PTR bx

Próbujesz podzielić wartość w rejestrze ax przez bajt w komórce pamięci o adresie bx. Tymczasem rejestr bx nie zawiera u ciebie sensownego wskaźnika, tylko wynik poprzednich obliczeń.

0

Skorzystałem z polecanego przez Was programu i wykazuje mi błąd już w jednej z pierwszych linii "wrong parameters mov ax, seg dane" (20)

0

Bo powinieneś tam mieć nazwę zmiennej/etykiety którą masz zadeklarowaną w tym segmencie a nie nazwę segmentu. Na przykład

mov ax, seg a

Poza tym ten twój div powinien wyglądać tak:

div bl

i zadziała tak jak chciałeś. Ale to nadal jest wszystko źle. Bo dzielisz liczby całkowite. W efekcie 3/2 = 1 plus 1 reszty. Po wykonaniu

div bl

w AH masz ax/bl
w AL masz ax modulo bl

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