Assembler i8080 programozás
2018-03-03T20:19:04+01:00
2018-03-04T10:16:50+01:00
2022-08-18T20:30:34+02:00
kristof9678
Sziasztok,

új vagyok az assembler nyelvben. Adott egy program, ami végeredményben ki kellene irna, hogy hány szó felelt meg a követelményeknek, de bármit is csinálok állandóan nullát ir ki. Valaki tudna segiteni, hogy mit csinálok rosszul, hol rontom el? Az eredményt nyolcas számrendszerben kell megjeleniteni, tudni adni valaki valamilyen tanácsot, hogy azt hogyan valósithatnán meg?



Feladat: be kell olvasni stringet, ami egy új sor karakterrel végződik (LF, new line). A szavak egy vagy több szóközzel vannak elválasztva, és meg kell határozni azoknak a szavaknak a számát, amelyekre érvényes a következők: a szóban kis és nagy betűk váltakoznak, úgy, hogy a szó első betűje mindig kisbetű. Ha a szóban szerepel  egy szám, akkor a szám előtt és utána is egyforma nagyságúnak kell lennie a betűnek (tehát ha a szám előtt kisbetű van, akkor a szám útánninak is kisbetűnek kell lennie), és a szóban egy szám szerepelhet. Az eredményt pedig nyolcas számrendszerben kell kiírni.  

Helyes bemenet:

In: ab tEsT tE0St

Out: 003

Helytelen bemenet:

In: TeSt szavak Ab 0123 A

Out: 000



Forráskód:



;reg H jelenlegi karakter ; reg. L elozo. karakter ; reg. D helyes szo szamlalo ;lowercase (no number before) - 1 ;uppercase (no number before) - 2 ; number - 3 ;lowercase (number before) - 4 ; uppercase (number before) - 5 ; space - 6 ; not space, else - 7 org 2000 dcx sp lxi h,text1 call putstr ; kiirja a text1 mvi h, 0 mvi L, 0 mvi d,0 first_word: call getchar ; beolvassuk a karakter cpi 10 ; new line jz char_end cpi 13 ; carriage return jz char_end cpi 32 ; space jz first_word mov E,a call lowercase ; H=1 kisbetu, H=0 nem kisbetu mvi a, 0 cmp H jz first_word ; ha nem kisbetu mvi L, 1 ; L=1, az elozo karakter kisbetu jmp next_character next_character: call getchar ; beolvassuk a karakter cpi 10 ; new line jz char_end cpi 13 ; carriage return jz char_end cpi 32 ; space jz space mov E,a call lowercase ;H=1 kisbetu, H=0 nem kisbetu mov a, H ; az acc. bereakjuk a H erteket cmp L ;osszehasonlitjuk az L regiszterrel (elozo karakter erteke) jz if_space ; jelenlegi karakter = elozo karakter (elozo karakter kisbetu volt es a jelenlegi is kisbetu) call uppercase ;H=2 nagybetu , H=0 nem nagybetu mov a,H ; az acc. bereakjuk a H erteket cmp L ; osszehasonlitjuk az L regiszterrel (elozo karakter erteke) jz if_space ;jelenlegi karakter = elozo karakter (elozo karakter nagybetu volt es a jelenlegi is nagybetu) call number ;H=3 szam, H=0 nem szam mov a, H ; az acc. bereakjuk a H erteket cmp L ;osszehasonlitjuk az L regiszterrel (elozo karakter erteke) jz if_space ;jelenlegi karakter = elozo karakter (elozo karakter szam volt es a jelenlegi is szam) mvi a, 4 cmp L ; szam elott nem volt-e kisbetu jz must_be_lower ; ha igen, akkor a jelenleginek is annak kell lenni, amit a must_be_lower ellenorzi mvi a, 5 cmp L ; szam elott nem volt-e nagybetu jz must_be_upper ; ha igen, akkor a jelenleginek is annak kell lenni, amit a must_be_upper ellenorzi mvi a, 3 cmp H ; jelenlegi karakter szam-e jz is_digit ;L=3 call lowercase mvi a, 1 cmp H ; jelenlegi karakter kisbetu-e jz set_lowercase ; L=1 call uppercase mvi a, 2 cmp H ; jelenlegi karakter nagybetu-e jz set_uppercase ; L=2 jmp if_space char_end: lxi h, text2 call putstr mov a,D adi '0' ; erteke es az ascii alakja call putchar call newline hlt if_space: call getchar ; beolvassuk a karakter cpi 10 jz char_end cpi 13 jz char_end cpi 32 jz set_space ; L=6 mov E,a call lowercase ;H=1 kisbetu, H=0 nem kisbetu mvi a, 1 cmp H jz check_space mvi L, 7 ; L=7, barmi mas jmp if_space ; ismetlem amig az elozo karakter nem lesz szokoz es a jelenlegi nem lesz kisbetu set_space: mvi L,6 ; L=6 szokoz jmp if_space ret check_space: mvi a, 6 cmp L ; L=6, vagyis az elozo karakter szokoz jz set_lowercase ; a jelenlegi pedig kisbetu , set_lowercase: L=1 es ugrik a next_character ret space: mvi a, 1 cmp L ; az elozo kisbetu volt-e jz increment_counter mvi a, 2 cmp L ; az elozo nagy volt-e jz increment_counter jmp set_space increment_counter: inr d ; +1 jo szo ret set_lowercase: mvi L, 1 ; L=1 jmp next_character set_uppercase: mvi L, 2 ; L=2 jmp next_character is_digit: mvi a, 1 cmp L ; jz set_up_number_for_lowercase ; ha a szam elotti karakter kisbetu volt (L=1) akkor L=4 mvi a, 2 cmp L jz set_up_number_for_uppercase ; ; ha a szam elotti karakter nagybetu volt (L=1) akkor L=5 jmp if_space ; egyik sem set_up_number_for_lowercase: mvi L, 4 ; L=4 jmp next_character set_up_number_for_uppercase: mvi L, 5 ; L=5 jmp next_character must_be_lower: mvi L, 1 ; karakter a szam elott kisbetunek kellett lennie call lowercase ; H=1 kisbetu H=0 nem kisbetu mov a, H cmp L ; jz next_character ; jelenlegi karakter H=1 es a elozo karakter (a szam elotti) L=1, beolvashatjuk a kov. karakter jmp if_space ; nem kisbetu must_be_upper: mvi L, 2 ; karakter a szam elott nagybetu kellett lennie call uppercase ; H=2 nagybetu H=0 nem nagybetu mov a, H cmp L jz next_character ; jelenlegi karakter H=1 es a elozo karakter (a szam elotti) L=1 jmp if_space ; nem nagybetu uppercase: call is_uppercase ; alapbol nagybetu H=1 mov a,E ; elmentett ac. ertek getchar utan cpi 'A' jc not_uppercase ; H=0 mov a,E cpi 'Z'+1 jnc not_uppercase ; H=0 number: call is_number mov a,E cpi '0' jc not_number ; kisebb mint '0'? cpi '9'+1 jnc not_number ; nagyobb mint '9'+1? lowercase: call is_lowercase ; alapbol nagybetu H=1 mov a,E ; elmentett ac. ertek getchar utan cpi 'a' jc not_lowercase ; H=0 mov a,E cpi 'z'+1 jnc not_lowercase ; H=0 not_lowercase: mvi H, 0 ; H=0 is_lowercase: mvi H,1 ; H=1 not_uppercase: mvi H,0 ; H=0 is_uppercase: mvi H,2 ; H=2 not_number: mvi H, 0 ; H=0 is_number: mvi H, 3 ;H=3 include 'examples\8080\include\getchar.inc' include 'examples\8080\include\getline.inc' include 'examples\8080\include\putstr.inc' include 'examples\8080\include\putchar.inc' include 'examples\8080\include\newline.inc' text1: db 'Bemenet',10,13,'text: ',0 text2: db 10,13,'Helyes szo: ',0
Mutasd a teljes hozzászólást!

  • Futtasd szimulátorban, lépésenkénti módban.

    A programszerkezetet pedig át kell tervezni strukturált tipusúra.

    Vagy : először írd meg magasszintű nyelven, azt átteszed assemblyre...
    Mutasd a teljes hozzászólást!
  • Ez még mindig ASSEMBLY!
    A ret-eket csak a bemásolásnál hagytad le? Így az is csoda, hogy kiír egyáltalán valamit.
    Mutasd a teljes hozzászólást!
  • Először is, ahogy jambus írja, nézd át a szubrutinjaidat, mert a többségnél hiányzik a ret. Ha máshol nem hát az is_number végén tutira.

    A nyolcas számrendszerben kiírást úgy tudod megvalósítani, hogy az értéket betolod valamelyik regiszterbe maszkolod h07-tel, ez a legkisebb helyértékű szám. aztán eltolod jobbra 3 bittel a regisztert, újra maszkolod, ez a 2.szám, majd harmadszor is. Ez igy max 377 nyolcas rendszerben, azaz 255 10-esben. Ha kevés akkor  16 bites regiszteren is megcsinálhatod.  A számok sorrendje fordított lesz, ezt is kezelned kell.
    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