Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Programowanie w Spim Assembler

vigorado89 17 Kwi 2012 21:06 4490 47
  • #1 17 Kwi 2012 21:06
    vigorado89
    Poziom 16  

    Witam, jestem na studiach informatycznych i z przedmiotu "architektura systemów komputerowych" dostałem zadanie: napisać program w asemblerze(dodam ze uczono nas c, c++ oraz c#)niestety nie dostałem zbytnich poradników tylko na zajęciach omawialiśmy jeden prosty program kory wyświetla "hello world" na konsoli

    treść zadania wygląda mniej więcej tak : program, który sprawdza czy występuje podany ciąg znaków - wzorzec w łańcuchu znaków. Zarówno wzorzec, jak i łańcuch mogą być dowolnym ciągiem znaków pisarskich. Program pracuje w dwóch wariantach: (1) z uwzględnieniem wielkości liter, (2) bez uwzględnienia wielkości liter. Poniżej menu oraz przykładowa interakcja użytkownika z programem:



    Menu:

    1. Sprawdzenie z uwzględnieniem wielkości liter

    2. Sprawdzenie bez uwzględnienia wielkości liter

    3. Koniec

    Sedze nad tym od 3 godzin i nie potrafię znaleźć kodu który odpowiada za wpisywanie z konsoli ciągu znaków do zmiennej a już nie wspomnę o zbudowaniu tego menu, błagam wręcz o pomoc w wytłumaczeniu i naprowadzeniu

    Dodano po 1 [godziny] 4 [minuty]:

    narazie co udalo mi sie sklecic to cos takiego:

    Kod: asm
    Zaloguj się, aby zobaczyć kod



    ale i tak nie dziala :(

    Proszę pamiętać o używaniu znaczników syntax. Opcja Listing kodu. - arnoldziq

    0 29
  • #2 18 Kwi 2012 17:46
    vigorado89
    Poziom 16  

    nikt nic nie pomoze ? :( chociaz jakies wskazowki moze tutorial ktory mi pomoze ? nie prosze o odwalenie roboty za mnie

    czy konieczne jest uzywanie przenoszen na rejestry i uzywania przerwan w moim programie ? mysle bardziej jezykiem c++ gdzie wrzucam cos z konsoli w zmienna i na tym dzialam a tutaj kompletnie nie wiem co z czym sie je

    http://pl.wikipedia.org/wiki/Architektura_MIPS czy ta tabelka mi sie przyda ?

    http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs17.htm w tym poradniku znalazlem pobieranie tekstu z konsoli ale jak tego uzyc w programie ?

    boze jak ludzie mogli w tym pisac :|

    0
  • #3 18 Kwi 2012 21:22
    _alfred_
    Poziom 16  

    Ten link powinien Ci pomóc. W "External links" są bardzo ciekawe linki. W pół godziny udało mi się pobrać, zainstalować ten symulator (SPIM, a dokładnie QtSpim) i uruchomić pierwszy program, który poprosił o moje imię, a następnie go wyświetlił

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Wyświetlenie menu też jest proste. Poniższy program będzie wyświetlał menu w pętli, aż jako wybór opcji z menu nie zostanie podane 3, czyli koniec
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Koniecznie zerknij do pomocy tego symulatora QtSpim (Help -> View Help), tam jest wszystko ładnie opisane z fragmentami kodów :)

    vigorado89 napisał:
    http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs17.htm w tym poradniku znalazlem pobieranie tekstu z konsoli ale jak tego uzyc w programie ?
    Podałeś link do kursu asemblera dla DOSa (na procesory CISC), a w temacie się pytasz o symulator procesorów MISP (RISC), czyli właśnie SPIM ;)

    vigorado89 napisał:
    ale i tak nie dziala :(
    Bo masz błąd, literówkę w linii 19, zamiast $al powinno być $a1 i program działa :)

    0
  • #4 19 Kwi 2012 06:19
    vigorado89
    Poziom 16  

    oo dzięki ;) po południu popracuje nad tym, dla mnie assembler jest kosmosem, nie ogarniam za bardzo który assembler jest jaki i w którym ja pracuje :P , w c czy c++ czy C# nie miałbym problemu coś takiego napisać

    0
  • #5 19 Kwi 2012 16:31
    vigorado89
    Poziom 16  

    juz troche podzialalem porobilem opcje i wszystko tak jak mi potrzeba ale mam jeden problem, nie wiem czemu ale ktorej kolwiek opcji bym nie wybral to program leci od 1 punktu do 3 albo czasem i pojawia sie linijka powitalna, wiem ze moglbym zatrzymac program po kazdym punkcie ale planuje zrobic powrot do samego menu ale kompletnie nie wiem jak to zrobic :\

    nie mam za bardzo pomyslu jak zrobic to porownywanie ciagow znakow przy if ?
    ale czy przy if nie bedzie porownywal calej zawartosci wrzuconej do zmiennej ?

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #6 19 Kwi 2012 17:13
    _alfred_
    Poziom 16  

    vigorado89 napisał:
    nie wiem czemu ale ktorej kolwiek opcji bym nie wybral to program leci od 1 punktu do 3 albo czasem i pojawia sie linijka powitalna,
    Bo nie masz żadnych warunków ("if"ów) w programie oprócz tego, który ja wstawiłem dla przykładu jak zapętlić menu. W ogóle nie sprawdzasz jaka opcja została wybrana w menu.

    Kod: asm
    Zaloguj się, aby zobaczyć kod
    W tym kodzie to bne sprawdza czy podano 3 (jako opcja wyjścia z programu), jeśli nie to wykonuje skok do loop. Takich instrukcji jest w pomocy QtSpim więcej ;) Zwróć też uwagę jak dalekie skoki mogą wykonywać.

    A loop: możesz przenieść po wyświetleniu strstart, przed wyświetleniem menu. Wystarczy jednokrotne wyświetlenie powitania, a nie z każdym wyświetleniem menu ;)

    Poza tym niewiedzę też żadnych instrukcji, które miałyby realizować punkt 1 i 2 z menu, czyli wyszukiwanie znaków w podanym tekście i dlatego zawsze jako odpowiedź jest wyświetlane "Wzorzec wystepujeWzorzec nie wystepuje".

    0
  • #7 19 Kwi 2012 17:26
    vigorado89
    Poziom 16  

    czyli jesli ekran powitalny zrobie w maine a menu od loopa to erkan powitalny bede mial z glowy... ok a teraz if

    The routine then begins execution by testing if y < x. If not, it branches to label L1, which is below.

    bge $s1, $s0, L1 # if (y < x)

    czyli wynika z tego ze moge to wsadzic o tu:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    i w tym przypadku y to $s1 a x $s0, ? dobrze rozumiem ? tylko ze jak mam wpisywac w $s1, $s0 dane ?

    np:

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • #8 19 Kwi 2012 17:46
    _alfred_
    Poziom 16  

    Możesz wstawić wszędzie, gdzie potrzebujesz sprawdzić taki warunek ;) Nie wiem które to y a które x, sprawdź :) Ja nie znam tego asemblera, tylko sprawdzam co piszą w pomocy programu i w Internecie i sprawdzam kod w QtSpim.

    Jednak do sprawdzenia menu będziesz potrzebował coś takiego jak "==" z C/C++ i raczej będziesz musiał wstawić takich instrukcji więcej niż jedną, choć zależy w jaki sposób sobie to zrealizujesz.

    Ten drugi kod jest bez sensu. Nic nie wpisujesz do rejestru $s0 który porównujesz z $s1, nie masz nigdzie tej etykiety L1 do której program ma skoczyć jeśli zostanie spełniony warunek. Po co też jakieś instrukcje po wywołaniu zakończenia programu? Przecież one się nie wykonają.

    Dane do $s1 czy innego rejestru wpisujesz różnymi poleceniami, zależy co chcesz wpisać, masz już przykłady w programie.

    0
  • #9 19 Kwi 2012 18:22
    vigorado89
    Poziom 16  

    Kurcze program mi zwariowal, cokolwiek nie wcisne to program leci od punktu 1 nawet przy 3 czy 9999 if mi nie dziala mimo ze wydaje mi sie ze chyba dobrze to zrobilem opieralem sie mozliwie o pomoc z programu i rowniez o wszystko co mozliwe z internetu, juz powoli trace sily...

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    chyba jednak zostawie te if'y i zrobie tak zeby po wykonaniu zadania wracal do menu.

    Tylko teraz najwazniejsze jak zrobic to porownywanie ciagow ? w c++ chyba sa juz stworzone biblioteki do tego zadania.

    0
  • #10 19 Kwi 2012 18:44
    _alfred_
    Poziom 16  

    Albo nie czytasz tego co piszę, albo nie rozumiesz co piszę, bo robisz dalej te błędy na które zwróciłem Ci uwagę :| Po co dwie etykiety jedna pod drugą (loop i L1)? Nadal nie sprawdzasz jak opcja z menu została podana itd.

    Chcesz już pisać porównywanie ciągów? Wątpię czy dasz radę (choć jak najbardziej życzę powodzenia) skoro nie udało Ci się uporać z wyświetlaniem menu i sprawdzaniem jakiego wyboru dokonał użytkownik.

    Sugeruję zacząć od początku, od algorytmu działania programu, może na początek bez wgłębiania się w poszukiwania ciągów znaków w tekście. Narysuj schemat blokowy tego co ma robić program, czyli start - stop, wyświetlenie menu (z "pętlą"), podejmowanie akcji w zależności od wyboru opcji z menu. Myślę, że to powinno wyjaśnić sprawę i pokaże w czym problem.

    0
  • #11 19 Kwi 2012 18:57
    vigorado89
    Poziom 16  

    Nie rozumiem po prostu tego języka, nie do końca widzę co za co odpowiada. A niestety muszę szybko go liznąć i niezbyt mam czas na zagłębienie się w tutoriale i poradniki (kończę już semestr i mam mnóstwo innej pracy) ale staram się jak mogę.

    ale może rzeczywiście zacznę od schematu:

    Menu:

    1. Sprawdzenie z uwzględnieniem wielkości liter

    2. Sprawdzenie bez uwzględnienia wielkości liter

    3. Koniec

    Twój wybór: [użytkownik wpisuje 1]

    Podaj łańcuch znaków: [użytkownik wpisuje np. k2hbcdab]

    Podaj wzorzec: [użytkownik wpisuje np. 2hb]

    Wzorzec występuje

    Menu:

    1. Sprawdzenie z uwzględnieniem wielkości liter

    2. Sprawdzenie bez uwzględnienia wielkości liter

    3. Koniec

    Twój wybór: [użytkownik wpisuje 1]

    Podaj łańcuch znaków: [użytkownik wpisuje np. k2hbcdab]

    Podaj wzorzec: [użytkownik wpisuje np. 2hc]

    Wzorzec nie występuje

    Menu:

    1. Sprawdzenie z uwzględnieniem wielkości liter

    2. Sprawdzenie bez uwzględnienia wielkości liter

    3. Koniec

    Twój wybór: [użytkownik wpisuje 2]

    Podaj łańcuch znaków: [użytkownik wpisuje np. f4fDsd56Ab]

    Podaj wzorzec: [użytkownik wpisuje np. 4fdsd56a]

    Wzorzec występuje

    Menu:

    1. Sprawdzenie z uwzględnieniem wielkości liter

    2. Sprawdzenie bez uwzględnienia wielkości liter

    3. Koniec

    Twój wybór: [użytkownik wpisuje 3]

    [Program kończy działanie]


    tak mniej więcej mam to rozpisane w zeszycie jak to ma działać i po uzgodnieniu z wykładowca jednak tylko i tylko wtedy wybranie opcji numer 3 ma kończyć program wiec tego if'a wywalam.

    0
  • #12 19 Kwi 2012 19:59
    _alfred_
    Poziom 16  

    To nie jest algorytm ani schemat blokowy działania programu.

    W ogóle jest to dziwne działanie programu, z góry narzucanie wyboru opcji (dwa razy opcja 1, raz opcja 2 i koniec działania - opcja 3), po co w takim razie wyświetlać menu? Menu się wyświetla wtedy kiedy użytkownik ma mieć wybór opcji, np. może chcieć od razu zakończyć program, albo tylko raz uruchomić "Sprawdzenie z uwzględnieniem wielkości liter" i po tym zakończyć program itp.

    Na pewno tak ma działać program? Jeśli tak to potrzebujesz zrobić te "if"y, żeby sprawdzać czy użytkownik wybrał tę opcję, którą mu narzucasz.

    0
  • #13 19 Kwi 2012 20:08
    vigorado89
    Poziom 16  

    może mój schemat jest mało jasny(jutro postaram sie o dokladniejszy aby byla jasnosc), ale użytkownik może mieć dowolny, może w kolko pracować w opcji nr 1 albo w ogolę nic nie robić i zakończyć od razu program,

    siedze ciagle nad zrozumieniem moich bledow ciagle nie rozumiem:

    Kod: asm
    Zaloguj się, aby zobaczyć kod
    Program w takiej postaci działa idealnie, ale jeśli dodam chociaż jedna linijkę wyboru opcji to juz koniec, próbowałem juz rożnych rzeczy, bne $t0, $t1, loop przed ta linijka wpisywałem do $t0 liczbe 0 aby mógł wrócić do loopa kiedy wykryje ze jest inna cyfra niz 1-3 ale to i tak nie działało może dziś już powinienem sobie odpuścić prace nad tym i wrócić jutro ale na moja logikę już powinno działać .

    0
  • #14 19 Kwi 2012 20:35
    _alfred_
    Poziom 16  

    To co teraz wstawiłeś to już Ci podałem na samym początku (mój pierwszy post, Ty tylko dodałeś wyświetlenie dwóch tekstów, na początku i końcu), działa, to jest zwykłe zapętlenie wyświetlania menu do momentu aż użytkownik wybierze 3.

    Teraz dodaj sprawdzenie czy użytkownik wybrał opcję 1, jeśli wpisze 1 to tylko wyświetl taki komunikat i wróć do wyświetlenia menu.

    A algorytm tego programu, według mnie, powinien wyglądać jakoś tak
    Programowanie w Spim Assembler

    0
  • #15 19 Kwi 2012 20:37
    vigorado89
    Poziom 16  

    tak zgadza się tak to ma wyglądać, wybacz za moja wersje siedzę Jeszce dodatkowo nad innymi pracami

    0
  • #16 19 Kwi 2012 20:51
    _alfred_
    Poziom 16  

    A to już powinno załatwić sprawę algorytmu i wyjaśnić jak pisze się tego typu programy w asemblerze

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Teraz tylko trzeba dobrać odpowiednie instrukcje i program gotowy.

    0
  • #17 19 Kwi 2012 20:53
    vigorado89
    Poziom 16  

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Udalo mi sie cos takiego wytrzozyc, działa tylko szkoda ze jak dorzuce jeszcze 3koniec i 2 to juz tylko ten jeden dziala

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    ulozylem w kolejnosc zgodna z algorytmem i dziala tylko opcja 3

    kiedy testuje kazdy oddzielnie (pozostawiajac tylko ten kod z jedna opcja) wtedy dziala wszystko jak nalezy, gdy zlacze wszystkie kody do jednego programu albo dziala tylko jedna opcja

    0
  • #18 19 Kwi 2012 21:52
    _alfred_
    Poziom 16  

    Lepiej jakbyś wrzucił kod w jednym kawałku, kompletny, żeby było wiadomo, gdzie znajduje się choćby np. loop. Poza tym na początku (w drugim kodzie) masz wywołanie zakończenia programu, więc nic co jest w dalszej części się nie wykona (większość kodu)...

    Coś wydaje mi się, że nie rozumiesz działania instrukcji, głównie chyba bne, musisz doczytać. Wrzucasz chaotyczne kody, nie stosujesz się do moich wskazówek, a ja już praktycznie wszystko Ci napisałem. Zwłaszcza mój ostatni post wszystko wyjaśnia. Problemów z nauką nie będę rozwiązywał, a gotowca też nie wstawię. Pisz program po kawałku i pytaj jak czegoś nie rozumiesz albo nie wiesz.

    0
  • #19 19 Kwi 2012 22:03
    vigorado89
    Poziom 16  

    no wlasnie porobilem po kawałku a on widzi tylko jedna opcje a instrukcje bne $t0, $t1, loop rozumiem tak: jesli $t0 jest rozne od $t1 to idz do loop

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    i rozumiem ze idzie to tak gdy wcisne 1 :

    lw $t0, choice # w choice bylo 1 bo wcisnalem 1
    li $t1, 1 # w $t1 jest wartosc 1
    bne $t0, $t1, loop # i porownanie jesli $t0 = 1 (a wcisnalem 1) jest rozne od $t1 (a jest w nim 1) to idz do loop (w tym przypadku idz az do kolejnego porownania)
    ...
    ...
    li $t1, 99 # ktore tak skonstruowalem ze wpisuje do $t1 99 aby zawsze bylo rozne od $t0
    bne $t0, $t1, loop

    no i tak samo w przypadku 2 no wiec czemu za boga to dzialac nie chce :| albo tego nie da sie zrobic albo to ja jestem taki ułomny

    \\edit:

    :D :D :D :D :D Wkoncu sie udalo, czytalem linijke po linijce i sie zastanawialem do ktorego miejsca bym skoczyl :D

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #20 19 Kwi 2012 22:53
    _alfred_
    Poziom 16  

    vigorado89 napisał:
    a instrukcje bne $t0, $t1, loop rozumiem tak: jesli $t0 jest rozne od $t1 to idz do loop
    Dobrze.

    vigorado89 napisał:
    i rozumiem ze idzie to tak gdy wcisne 1 :

    lw $t0, choice # w choice bylo 1 bo wcisnalem 1
    li $t1, 1 # w $t1 jest wartosc 1
    bne $t0, $t1, loop # i porownanie jesli $t0 = 1 (a wcisnalem 1) jest rozne od $t1 (a jest w nim 1) to idz do loop (w tym przypadku idz az do kolejnego porownania)
    Prawie dobrze, bo w Twoim kodzie i w tym przypadku w dalszej kolejności nie jest kolejne porównanie tylko najpierw wyświetlasz komunikat (test1).

    vigorado89 napisał:
    li $t1, 99 # ktore tak skonstruowalem ze wpisuje do $t1 99 aby zawsze bylo rozne od $t0
    bne $t0, $t1, loop
    Niepotrzebne, a nawet złe, bo co jeśli wpiszę 99? Do takich skoków bezwarunkowych są inne instrukcje. Po co sobie komplikować?

    vigorado89 napisał:
    no i tak samo w przypadku 2 no wiec czemu za boga to dzialac nie chce albo tego nie da sie zrobic albo to ja jestem taki ułomny
    Bo nie stosujesz się do mojego tego postu. Zrób sprawdzanie podanej opcji jedna po drugie i skacz, jeśli jest spełniony warunek, do dalszej części kodu, gdzie stworzysz etykiety, np opcja1:.

    Widzę, że dodałeś drugi kod w czasie gdy odpisywałem. Sprawdziłem i ciekawie to zrobiłeś, bardzo dobrze, alternatywnie niż sugerowałem, dobrze :) Zrobiłeś coś takiego
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    A zamiast czegoś takiego
    Kod: asm
    Zaloguj się, aby zobaczyć kod
    użyj
    Kod: asm
    Zaloguj się, aby zobaczyć kod
    czyli skok bez sprawdzania jakiegokolwiek warunku ;)

    0
  • #21 20 Kwi 2012 17:43
    vigorado89
    Poziom 16  

    to już zostało stworzyć "porównywarkę znaków" zastanawiam się czego użyć ? również if'ow ? ale czy w tym przypadku nie będzie mi porównywał całości ? chce aby to po wpisaniu np abcdefghijk sprawdzi czy występuje ijk i wtedy TAK występuje? czy wtedy również IF zadziała ? jest na tyle inteligentny w assemblerze ? wiem ze w c istnieje cos jak strcmp.

    udalo mi sie znalesc taki kod w internecie, odpalilem rzeczywiscie porownuje ale tylko cale ciagi np wpisujac qwerty i rty mowi ze wprowadzone znaki nie sa takei same

    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Niestety malo rozumiem co tutaj zachodzi

    0
  • #22 20 Kwi 2012 18:43
    _alfred_
    Poziom 16  

    1. Tylko, że strcmp (z C) porównuje Ci całe teksty, więc i tak by się tu nie nadawał.
    2. Zamiast b loop lepiej będzie chyba jednak użyć j loop
    3. Ten kod, który wstawiłeś, to bardzo dobra baza do realizacji wymaganego szukania ciągu znaków w tekście. Zacznij go analizować "znak po znaku" to będziesz wiedział jak działa (instrukcje są opisane w pomocy QtSpim) ;) A pisanie proponuję zacząć od prostszego przypadku - bez rozróżniania wielkości liter.

    Zerknij jeszcze tutaj, bo nie wiem czy sprawdzałeś. Powodzenia, czekam na jakieś rezultaty, Twój kod, który będę mógł przetestować ;)

    0
  • #23 20 Kwi 2012 20:49
    vigorado89
    Poziom 16  

    kurcze zrobilem tak jak poradziles, znak po znaku linijka po linijce, mimo to nie rozumiem co sie dzieje w strcmp: czy tam jest stworzona petla for ktora sprawdza znak po znaku w stringu ? w QtSpim jest opcja puszczania programu linijka po linijce i wlasnie w tym miejscu po wpisaniu jednego znaku on przez strcmp jedzie 2 razy, rozumiem te porownania przyrownania beq oraz slt ale nie jestem pewien czy on tam jedzie znak po znaku czy widzi rozmiar hmmm troche rozumiem o co tu chodzi ale wciaz nie wiem jak moge to wykorzystac

    Dodano po 26 [minuty]:

    widze to tak : wpisalem na poczatku "a" i do porownania "b"

    Kod: asm
    Zaloguj się, aby zobaczyć kod
    koncowki tez nie rozumiem za bardzo, widzie dodawanie do rejestru i inne zabiegi. Petla powtarzana jest dwa razy a porownaniu samych znakow to on sprawdza adres w ASCII ? i wartosci adresow ze soba porownuje ? jesli nie sa rowne to skacze do ? no wlasnie nei wiem jak on skacze do tych wiadomosci "same " i "not same" no ale to malo istotne u siebie moge zrobc to tak ze bede rozumial

    0
  • Pomocny post
    #24 20 Kwi 2012 22:39
    _alfred_
    Poziom 16  

    A skąd jest ten drugi kod? Bo jest bardziej rozbudowany od pierwszego i nie nadążam za Tobą ;)

    vigorado89 napisał:
    no wlasnie nei wiem jak on skacze do tych wiadomosci "same " i "not same"
    Jak to jak, strcmp jest wywoływane przez polecenie jal, a później program wraca tam skąd zostało wywołane strcmp i wtedy jest sprawdzany wynik porównania i wyświetlany odpowiedni komunikat.

    Jak już napisałem nie znam tego języka, jak będę miał chwilę to się przyjrzę i coś napiszę, bo jeszcze nie przyglądałem się tej "funkcji" strcmp (ani z pierwszego ani z drugiego kodu).

    A teraz najlepsze :D
    Napisałem działającą wersję, gdzie program rozróżnia wielkość liter. Jest to wersja prostsza (niż ta która nie ma rozróżniać wielkości liter). Napisanie tego nie zajęło mi dużo czasu. W tym temacie podano już wszystko co potrzeba do napisania tego programu.
    Kod: asm
    Zaloguj się, aby zobaczyć kod

    Żeby temat miał działanie dydaktyczne wstawiam tylko jedną wersję (łatwiejszą, rozróżniającą wielkość liter), w dodatku bez komentarzy w najważniejszych miejscach (jeszcze nieomówionych w tym temacie). Komentarzy brak głównie w funkcji szukającej wzorca w tekście ;) :D

    Uważam, że rozpracowanie działania tego programu, mając do dyspozycji w QtSpim debugowanie (ręczne uruchamianie pojedynczych kolejnych kroków oraz podgląd na zawartość wszystkich rejestrów i obszarów pamięci), jest już dość łatwą sprawą.

    PS Może jeszcze pomyślę jak skrócić funkcję wyszukującą, bo myślę, że się da.
    PPS Myślę, że program działa dobrze. Starałem się w miarę dokładnie przetestować różne przypadki ;)

    0
  • #25 21 Kwi 2012 10:51
    vigorado89
    Poziom 16  

    _alfred_ napisał:
    A skąd jest ten drugi kod? Bo jest bardziej rozbudowany od pierwszego i nie nadążam za Tobą ;)


    to byl ten sam kod co wczesniej podalem tylko wycialem sam fragment po strcmp i w komentarzach rozpisywalem jak kazda linijke rozumiem

    _alfred_ napisał:

    vigorado89 napisał:
    no wlasnie nei wiem jak on skacze do tych wiadomosci "same " i "not same"
    Jak to jak, strcmp jest wywoływane przez polecenie jal, a później program wraca tam skąd zostało wywołane strcmp i wtedy jest sprawdzany wynik porównania i wyświetlany odpowiedni komunikat.


    a tak juz to widze nie moglem jakos polaczyc wzrokowo wywolania jal z jr $ra

    _alfred_ napisał:

    Jak już napisałem nie znam tego języka,


    ja niestety jeszce nie mam takiej wiedzy programisty zeby obcy jezyk ogarnac na szybko, mysle ze w c++ napisanie samego " porownywania" znaku po znaku i calych ciagow to byloby dla mnie niezle wyzwanie i sporym problem.


    Ale wrocmy do obecnego problemu przeanalizowalem linijka po linijce (moze musze to zrobic jeszce pare razy) widze gdzie moje wprowadzone znaki sa porownywane (widze glownie if $t0 = $t1 dodawanie bitow oraz ładowanie ) ale nie widze tego kryterium rozmiaru znakow, wroce do analizy wieczorem.

    0
  • #26 21 Kwi 2012 17:45
    _alfred_
    Poziom 16  

    vigorado89 napisał:
    _alfred_ napisał:
    A skąd jest ten drugi kod? Bo jest bardziej rozbudowany od pierwszego i nie nadążam za Tobą

    to byl ten sam kod co wczesniej podalem tylko wycialem sam fragment po strcmp i w komentarzach rozpisywalem jak kazda linijke rozumiem
    Oj, raczej nie, w tym drugim kodzie jest więcej porównań/warunków i skoków, ale go nie analizowałem, więc nie wiem jak działa ani co robi, jest niekompletny.

    vigorado89 napisał:
    ja niestety jeszce nie mam takiej wiedzy programisty zeby obcy jezyk ogarnac na szybko, mysle ze w c++ napisanie samego " porownywania" znaku po znaku i calych ciagow to byloby dla mnie niezle wyzwanie i sporym problem.
    Trochę to dziwne... Ogarniasz programowanie obiektowe w C++ (polimorfizm, dziedziczenia, przestrzenie nazw itd.), a nie potrafisz napisać porównywania dwóch tekstów (ciągów znaków)...

    vigorado89 napisał:
    (widze glownie if $t0 = $t1 dodawanie bitow oraz ładowanie )
    A gdzie masz jakieś "dodawanie bitów" i w ogóle co to znaczy? Na pewno znasz C++? Jeśli tak to byś wiedział jakie są operacje bitowe i że nie ma czegoś takiego jak "dodawanie bitowe".

    vigorado89 napisał:
    ale nie widze tego kryterium rozmiaru znakow,
    Bo jako takiego nie ma, wystarczy porównanie znaków i wiadomo, że "A" jest różne od "a" - prawda? "Trudniej" będzie, żeby nie zwracać uwagi na wielkość liter, wtedy będziesz musiał wszystkie litery w tekście oraz we wzorcu zamieniać na wielkie lub małe, przed porównaniem.

    Radzę poczytać jak działają wszystkie do tej pory użyte rozkazy, jak przekazuje się argumenty do funkcji, jak się zwraca wynik, do czego służą poszczególne rejestry itp. Bez takiej wiedzy ciężko będzie dalej dyskutować, a przecież nie będę tutaj kopiował dokumentacji, żeby to wyjaśniać ;) A gdybyś już zerknął do dokumentacji to byś zwrócił mi uwagę choćby na ten tekst
    _alfred_ napisał:
    Kod: asm
    Zaloguj się, aby zobaczyć kod
    czyli skok bez sprawdzania jakiegokolwiek warunku
    i napisałbyś, że się mylę, że b wykonuje pewne porównanie (jest to faktycznie inny rozkaz, który sprawdza 2 rejestry przed wykonaniem skoku), jednak nie ma ono dla nas znaczenia, dlatego można go używać zamiennie dla j Label (w tym przykładzie Label to nasze loop).

    0
  • #27 21 Kwi 2012 18:12
    vigorado89
    Poziom 16  

    _alfred_ napisał:
    Trochę to dziwne... Ogarniasz programowanie obiektowe w C++ (polimorfizm, dziedziczenia, przestrzenie nazw itd.), a nie potrafisz napisać porównywania dwóch tekstów (ciągów znaków)...


    Niestety wlasnie tak teraz ucza na studiach, wszystkiemu samemu sie trzeba uczyc, np w 1 semestrze skonczylismy programowanie bez wiedzy o klasach a od 2 semestru bez slowa juz mielismy plynnie poslugiwac sie klasami i wszyscy prowadzacy zdziwieni jak to mozliwe ze my klas nie znamy...

    Dodano po 3 [minuty]:

    _alfred_ napisał:
    Radzę poczytać jak działają wszystkie do tej pory użyte rozkazy, jak przekazuje się argumenty do funkcji, jak się zwraca wynik, do czego służą poszczególne rejestry itp. Bez takiej wiedzy ciężko będzie dalej dyskutować, a przecież nie będę tutaj kopiował dokumentacji, żeby to wyjaśniać :wink: A gdybyś już zerknął do dokumentacji to byś zwrócił mi uwagę choćby na ten tekst
    _alfred_ napisał:

    Kod ASM - [rozwiń]
    b loop

    czyli skok bez sprawdzania jakiegokolwiek warunku
    i napisałbyś, że się mylę, że b wykonuje pewne porównanie (jest to faktycznie inny rozkaz, który sprawdza 2 rejestry przed wykonaniem skoku), jednak nie ma ono dla nas znaczenia, dlatego można go używać zamiennie dla j Label (w tym przykładzie Label to nasze loop).


    rzeczywiscie znalazlem b jako operacja if(R[rs]==R[rt]) PC=Label, mam kilka stron otwartych z roznymi rozkazami nawet sobie ściągę tabelkę zrobiłem

    Dodano po 2 [minuty]:

    po calym dniu z architektura systemow komputerowych zabieram sie dalej do pracy ;)

    a co do dodawania bitow to mialem bardziej na mysli przesuwanie ;)

    0
  • #28 21 Kwi 2012 18:35
    _alfred_
    Poziom 16  

    vigorado89 napisał:
    Niestety wlasnie tak teraz ucza na studiach, wszystkiemu samemu sie trzeba uczyc, np w 1 semestrze skonczylismy programowanie bez wiedzy o klasach a od 2 semestru bez slowa juz mielismy plynnie poslugiwac sie klasami i wszyscy prowadzacy zdziwieni jak to mozliwe ze my klas nie znamy...
    Normalne, to nie podstawówka czy gimnazjum.

    vigorado89 napisał:
    rzeczywiscie znalazlem b jako operacja if(R[rs]==R[rt]) PC=Label,
    Lepiej by było napisać, że "b Label" w rzeczywistości to "beq $zero,$zero,Label", teraz jeszcze trzeba sprawdzić co znaczy rozkaz "beq" oraz co to za rejstr "$zero" i wiadomo o co chodzi i dlaczego to to samo co "j Label" ;)

    0
  • #29 21 Kwi 2012 18:47
    vigorado89
    Poziom 16  

    Żeby zrobic ostatni punkt czyli porownanie bez uwzglednienia rozmiarow znakow wystarczyloby wstawic przed porownaniem zamiana znakow (to juz wiem ) troche pokombinowalem (nawet cos juz sprowalem napisac) znalazlem rozkaz przesuwajacy bity a wiec "A" (65) ,a male "a" to 97 a wiec 32 bity roznicy okragle 2^5 tylko co jesli wprowadzilem male a ? to wtedy rozkaz przesunie z 97 na 130 bit to w ogole wyjdzie poza skale ASCII, a wiec najpierw bym musial sprawdzic co wprowadzilem do lancuha znakow i do wzorca i wtedy poprzez if'y poprzesuwac bity o 2^5

    0
  • #30 21 Kwi 2012 19:40
    _alfred_
    Poziom 16  

    vigorado89 napisał:
    znalazlem rozkaz przesuwajacy bity a wiec "A" (65) ,a male "a" to 97 a wiec 32 bity roznicy okragle 2^5
    Jakie przesuwanie?! To jest bez sensu... i zaniżanie poziomu forum. 97-65=32 i tyle, przecież to są liczby w układzie dziesiętnym.

    Jeśli przyjąć, że będziemy zamieniać litery na małe to wystarczy sprawdzać czy litera z tekstu jest w przedziale dużych liter (w ASCII od 65 do 90 dziesiętnie), jeśli tak to dodajemy do niej (rejestru) 32 i już mamy małą literę (97 do 122). Tak samo trzeba zrobić dla wzorca, którego będziemy szukać w tekście. Można też odejmować, jeśli chcesz porównywać duże litery.

    A jak już będziesz miał coś konkretnego, jakiś algorytm, schemat blokowy, pseudokod albo jeszcze lepiej sam kod to wstaw i wtedy możemy dalej dyskutować.

    0