A legmagasabb ASCII kóddal rendelkező betű kiiratása

A legmagasabb ASCII kóddal rendelkező betű kiiratása
2018-02-17T20:10:46+01:00
2018-02-18T12:43:27+01:00
2022-10-15T21:35:43+02:00
HelloWorld
Sziasztok! Most kezdem tanulni az Assemblert, de nagyon kezdő vagyok, és még nem igazán értem a logikáját. A feladat a következő: Tetszés szerint megadok egy stringet, aminek a legnagyobb ASCII kóddal rendelkező betűjét ki kell iratni. PL. abca -> c
A feladatot el kezdtem oldani, de elakadtam az összehasonlítós résznél, meg magánál a végeredmény kiiratásánál is. A processzor nyelve Intel 8080, és eddig erre jutottam:

org 1000 dcx sp lxi h,text1 call putstr ; char_loop: call getchar;az akumulátorba menti az értéket cpi 10 ; sortörés karakter jz char_end cpi 13 ;CR karakter jz char_end cpi 'a' jc char_loop ; ha kisebb értéku a karakter,mint 'a', akkor getchar cpi 'z'+1 jnc char_loop ; ha nagyobb értéku a karakter, mint 'z'+1, akkor getchar jmp char_loop char_end: lxi h,text2 call putstr hlt include 'examples\8080\include\getline.inc' include 'examples\8080\include\putstr.inc' include 'examples\8080\include\putchar.inc' include 'examples\8080\include\getchar.inc' include 'examples\8080\include\newline.inc' text1: db 'A legnagyobb koddal rendelkezo karakter',10,13,'Szoveg: ',0 text2: db 10,13,'Legnagyobb karakter: ',0 bevitt: ds 30 Hogyan lehetséges összehasonlítani az egyes megadott karaktereket, és a legnagyobbat kiíratni?
Mutasd a teljes hozzászólást!
Szia! Nem rossz ez!
Majd később kicsit pontosíthatod, mert jelenlegi formában a legnagyobb kódú kisbetűt keresi meg - a kiírt szöveg karaktert mond.
Odáig rendben, hogy összehasonlítod a bekért karaktert a sorvégével (tipikusan csak a 13-as CR kód lehet billentyűzetről, de ez az óvatosság dicséretes!!!  )
Aztán kiválasztod az a-z tartományt, ez is helyes.
Utána (a jnc char_loop és jmp char_loop közé) hiányzik az, hogy a legnagyobb beírt betűt rögzítsed. Ehhez kell még egy regiszter, vagy memóriacím. Nem tudom, hogy a getchar rutin mely regisztereket változtatja, de tegyük fel, hogy a B regiszter szabad, nem módosul, használjuk ezt a regisztert a legnagyobb beírt karakter megőrzésére. Ekkor a char_loop ciklus elé kell egy mvi b,'-' utasítás - tehát ha nem írnak be semmilyen kisbetűt (bizony, erre is illik gondolni!!!), akkor egy kötőjelet fogunk kiírni. A ciklus fentebb említett végén pedig A-t és B-t kell összehasonlítani (cmp b) és ha az a értéke nagyobb, akkor azt áttenni B-be.
Végül a hlt előtt kell a B-ben levő karaktert kiíratni. Vagy van egy putchar rutin erre a célra, vagy megteheted, hogy a text2 kiírása előtt annak végére beilleszted a B regiszter értékét.

Sok sikert!! 
Mutasd a teljes hozzászólást!

  • Az assemblyt tanulod.
    A bekért karaktert folyamatosan összehasonlítod egy alapból 0 karakterű változóval (memória vagy regiszter), ha a bekért karakter a nagyobb, akkor a változó értékét frissíted, a végén meg ezt a karaktert íratod ki.
    Egyszerű lenne, ha ismerném a 8080 utasításkészletét :)
    Mutasd a teljes hozzászólást!
  • Hát ha most kezded, akkor talán érdemes lenne rögtön a Z80-nal kezdeni, az modernebb (1976 vs 1974).
    Mutasd a teljes hozzászólást!
  • Szia! Nem rossz ez!
    Majd később kicsit pontosíthatod, mert jelenlegi formában a legnagyobb kódú kisbetűt keresi meg - a kiírt szöveg karaktert mond.
    Odáig rendben, hogy összehasonlítod a bekért karaktert a sorvégével (tipikusan csak a 13-as CR kód lehet billentyűzetről, de ez az óvatosság dicséretes!!!  )
    Aztán kiválasztod az a-z tartományt, ez is helyes.
    Utána (a jnc char_loop és jmp char_loop közé) hiányzik az, hogy a legnagyobb beírt betűt rögzítsed. Ehhez kell még egy regiszter, vagy memóriacím. Nem tudom, hogy a getchar rutin mely regisztereket változtatja, de tegyük fel, hogy a B regiszter szabad, nem módosul, használjuk ezt a regisztert a legnagyobb beírt karakter megőrzésére. Ekkor a char_loop ciklus elé kell egy mvi b,'-' utasítás - tehát ha nem írnak be semmilyen kisbetűt (bizony, erre is illik gondolni!!!), akkor egy kötőjelet fogunk kiírni. A ciklus fentebb említett végén pedig A-t és B-t kell összehasonlítani (cmp b) és ha az a értéke nagyobb, akkor azt áttenni B-be.
    Végül a hlt előtt kell a B-ben levő karaktert kiíratni. Vagy van egy putchar rutin erre a célra, vagy megteheted, hogy a text2 kiírása előtt annak végére beilleszted a B regiszter értékét.

    Sok sikert!! 
    Mutasd a teljes hozzászólást!
  • Húha, ez nagy segítség volt! Köszönöm! :)

    org 1000 dcx sp lxi h,text1 call putstr ; mvi b,'-' ;kiválasztok egy legkisebb karaktert, elmentem b-be char_loop: call getchar;az akumulátorba menti az értéket cpi 10 ; sortörés karakter jz char_end cpi 13 ;CR karakter jz char_end cpi 'a' jc char_loop ; ha kisebb értéku a karakter,mint 'a', akkor getchar cpi 'z'+1 jnc char_loop ; ha nagyobb értéku a karakter, mint 'z'+1, akkor getchar cmp b ;osszehasonlítom a b-t az a-val jnc swap ;ha az a nagyobb mint b, akkor csere jmp char_loop char_end: swap: mov b,a ;elmenti a b-be az a-t jmp char_loop lxi h,text2 call putstr mov a,b call putchar hlt include 'examples\8080\include\getline.inc' include 'examples\8080\include\putstr.inc' include 'examples\8080\include\putchar.inc' include 'examples\8080\include\getchar.inc' include 'examples\8080\include\newline.inc' text1: db 'A legnagyobb koddal rendelkezo karakter',10,13,'Szoveg: ',0 text2: db 10,13,'Legnagyobb karakter: ',0 bevitt: ds 30
    Még annyi lenne a kérdésem, hogy a swapnál mit ronthattam el? Szeretnék visszaugrani a char_loopra, hogy bekérhessem sorban a többi karaktert, de futtatáskor az "enter" lenyomása után visszaugrik  a sor elejére, és nem adja ki a "Legnagyobb karakter: " feliratot, valamint a legnagyobb karaktert sem.
    Mutasd a teljes hozzászólást!
  • Ügyes vagy!
    Mindössze - ha végigköveted az ugrásokat - az ENTER esetén ugyebár a char_end címkére ugrik, azt viszont tévesen a swap elé tetted, pedig azon rész után kellene lennie, ahol a kiírás jön.
    De egyébként még egyszerűbb, ha a cmp b után jc char_loop jön, majd a mov b,a és ugrás vissza a ciklusra. Vagyis nem kell a swap címke és utána rész, hanem fordított vizsgálat, és belekerül a kódrész végébe. Na asszem ez így bonyi, leírom a kódot:

    cmp b ;osszehasonlitom a b-t az a-val jc char_loop ; nem talaltam uj legnagyobbat mov b,a ; jegyezzuk meg az ujat jmp char_loop char_end: ...stb...
    Mutasd a teljes hozzászólást!
  • Köszönöm, ez így tényleg egyszerűbb. :)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd