Asembler - wyszukiwanie najmniejszej wartosci

0

Witam
Musze napisac program w asemblerze, ktory wyszukuje z 16 wartosci podanych przeze mnie najmniejsza. Robie to w programie AFD ale nie wiem jak to wykonac. Wartości maja zawierac sie w rejestrze od 2000 do 200F, a wynik ma byc w rejestrze 3000.

0

Coś w tym rodzaju?

        mov     bx, 0x200e
        mov     al, [bx+1]
  _petla:
        cmp     al, [bx]
        jl      _warunek
        mov     al, [bx]
  _warunek:
        dec     bl
        jns     _petla
        mov     [0x3000], al 

Wartości maja zawierac sie w rejestrze od 2000 do 200F, a wynik ma byc w rejestrze 3000.
Rejestrze? Rejestry to masz w procesorze, to są komórki pamięci.

0

Nie wiem, ale wydaje mi sie ze ten kod nie jest poprawy. Poza tym nie moge go skompilowac w AFD :/

0

Kod jest poprawny w sensie działa. Od kiedy AFD to kompilator? Nigdy tym szmelcem się nie bawiłem ale poczytałbyś chociaż troche o używanej składni... Pewnie o etykiety chodzi bądź liczby hex zapisane jako 0x69 zamiast 69h.

0

Zrobiłem coś takiego. Kod programu działa jak należy, bo wyszukuje najmniejszą wartość z wpisanych liczb od rejestru 100 do 10F. Ale nie wiem jak zrobić, żeby program wykonał przerwanie operacji po 10F, aby nie szukał dalej najmniejszej wartości.

MOV DI,2000                             # przypisuje wartość 2000 do DI (licznik)
MOV BL,[DI]                             # przypisz wartość DI do BL
MOV AL,BL                               # kopiuj BL do AL
INC DI                                  # zwiększ DI
MOV CL,[DI]                             # przypisz wartość DI do CL
CMP AL,CL                               # porównaj AL,CL
JNA 107                                 # jeśli AL nie jest większe od CL to zostaw AL bez zmian, w przeciwnym        
                                          wypadku idź dalej
MOV AL,CL                               # skopiuj CL do AL i przejdź pętlą do porównania
JMP 10A
0

Zamiast jmp'a

        cmp     di, 200F
        jl      107
        mov     [3000], al

?
Po pierwsze, komentarze w assemblerze są po ';', nie po '#'... Swoją drogą mocno nielogiczny ten Twój kod...na kij ładować do bl żeby przenieść do al? Di nie robi za licznik a za rejestr adresujący, w sumie to wedle prawideł 8086 to powinieneś użyć nie di a bx. Trzeba było sobie offsety przeliczyć z mojego kodu albo chociaż przeanalizować jego działanie... Popatrzmy na offsety w Twoim kodzie:

0100                 mov     di, 2000
0103                 mov     bl, [di]
0105                 mov     al, bl
0107                 inc     di
0108                 mov     cl, [di]
010A                 cmp     al, cl
010C                 jbe     110
010E                 mov     al, cl
0110                 cmp     di, 200F
0114                 jl      107
0116                 mov     [3000], al

Co z tego teraz wynika? W Twojej wersji Jeżeli al jest mniejsze niż cl to al = cl, ponowne porównanie al z cl i dopiero skok do inc di... to ma jakiś sens? Poprawiłem skok przy jbe - teraz skacze do dodanego sprawdzenia warunku zakończenia.

Na pamięci /jako jeden z operandów/ możesz wykonywać wszystkie operacje proste, nie tylko przenoszenie. Weź może poczytaj manuale Intela, co? Tryb rzeczywisty nawet w najnowszych procesorach jest zachowany dla kompatybilności, jest taki sam jak w 8086.
Hm, mój kod to 8 instrukcji, Twój 9 - 1 do wymiany na 2 + 1 na wynik = 11... kiepsko. Masz ten mój... widać różnicę?

0100                 mov     bx, 200E
0103                 mov     al, [bx+1]
0106                 cmp     al, [bx]
0108                 jl      10C
010A                 mov     al, [bx]
010C                 dec     bl
010E                 jns     106
0110                 mov     [3000], al

Kod programu działa jak należy, bo wyszukuje najmniejszą wartość z wpisanych liczb od rejestru 100 do 10F.

Ekhm... sam chyba nie wiesz co napisałeś, kod programu jest pod 0x100, a wartości szukasz pod 0x2000... i jakiego, k**** rejestru?!

A tak btw. jaka uczelnia i kierunek?

0

ja zajmuje się asemblerem od kilku dni! Nie umiem jeszcze wiele, praktycznie nic nie umiem :/ Nasz wykładowca poda nam kilka poleceń a do wykonania programu potrzeba o wiele więcej. Cały czas szukam jakiś materiałów o asemblerze. Czy te manuale Intela są PL? My działamy niby w tym AFD na rejestrach processora, tak mi się wydaje. A poza tym jestem na informie na wydziale elektrycznym na politechnice poznanskiej

0

http://pl.wikipedia.org/wiki/Rejestr_procesora
Manuale Intela są wyłącznie w języku angielskim ale przecież w tych czasach dla studenta nie powinno być to przeszkodą.
http://rudy.mif.pg.gda.pl/~bogdro/
Kurs dla DOSa dotyczy trybu rzeczywistego, co prawda część z przedstawionych tam instrukcji nie występuje w 8086 ale... jakieś podstawy będą.

0
0100                 mov     di, 2000
0103                 mov     bl, [di]
0105                 mov     al, bl
0107                 inc     di
0108                 mov     cl, [di]
010A                 cmp     al, cl
010C                 jbe     110
010E                 mov     al, cl
0110                 cmp     di, 200F
0114                 jl      107
0116                 mov     [3000], al

Słuchaj możesz mi powiedzieć co oznacza jbe i jl ?

0

Mówiłem coś o manualach intela? JBE - below or equal, jl - less.

0

Podziw za cierpliwosc...szczerze sie przyznam, ze sam nie korzystam z assemblera ale czsami warto by cos poczytac...

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