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.
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.
Nie wiem, ale wydaje mi sie ze ten kod nie jest poprawy. Poza tym nie moge go skompilowac w AFD :/
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.
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
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?
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
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ą.
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 ?
Mówiłem coś o manualach intela? JBE - below or equal, jl - less.
Podziw za cierpliwosc...szczerze sie przyznam, ze sam nie korzystam z assemblera ale czsami warto by cos poczytac...