Assemblerben hogyan tudom kiíratni a stringből a legmagasabb ASCII kóddal rendelkező betűt?
Sziasztok! Most kezdem tanulni az Assemblert, de nagyon kezdő vagyok, és még nem igazán értem a logikáját. 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 nyelv pontosabban Altair8080, és eddig erre jutottam:
org 1000
dcx sp
lxi h,text1
call putstr ; vypis text1
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
vlozeny: ds 30
Hogyan lehetséges összehasonlítani az egyes megadott karaktereket, és a legnagyobbat kiíratni?
ASCII karakterek mndegyike egy byte-os szám.
Compare meg az összehasonlítást szolgálja.
Nem tudom, hogy jutott eszedbe éppen a 8080-as proci, de szerintem inkább felejtsd el.
Ha assembly-t akarsz tanulni, akkor inkább x86-ot tanulj, vagy ha vonzódsz a régi, 8 bites korszak gépeihez, akkor a legjobb választás a 6502 (ez volt a legendás commodore 64-esekben is, illetve ennek egy módosulata (6510)).
Ez a proci risc jellegű, egyszerű a felépítése és a programozása is könnyebben megérthető, mint az intel borzalmaival vergődni.
Szia.
Nem ismerem a nyelvet csak felületesen, igy csak az elvet tudom leirni.
Amikor beolvastad a karaktert ( call getchar ) akkor a beolvasott karaktert (ami az akumlátorban van, át kell rakni egy másik regiszterbe vagy egy memória pozicióra is, előtte azonban ennek a regiszternek/memóriapoziciónak be kell állitani egy értéket modjuk 0-t.
Aztán szerintem valahová ide a két ugrási utasitás közé :
jnc char_loop ; ha nagyobb értéku a karakter, mint 'z'+1, akkor getchar
jmp char_loop
Be kell szúrni egy összehasonlitást, a kiválasztott regiszterrel/memóriapozicióval, és ha az akumlátorban lévő érték kissebb mint a kiválasztotzt regiszter akkor lehet a következő karaktert olvasni, ha nem akkor az aktuális értéket kell a kiválasztott regiszterbe/memóriabozicióba rakni valahogy igy (Modjuk legyen a kiválasztott regiszter a B regiszter) :
jnc char_loop ; ha nagyobb értéku a karakter, mint 'z'+1, akkor getchar
cpi B ; összehasonlitjuk az akumlátorban lévő érétket a kiválasztot regiszterrel/memóriacimmel
jc char_loop ; ha az akumlátorban lévő érték kisseb mint a regiszterünkben lévő érték akkor a ugrás a gettchar-ra
mov B,A ; akumllátor tartalmát átrakjuk a kiválasztott regiszterbe/memóriacimre
jmp char_loop
A kiirás pediglen emlékeim szerint az int 21-es dos megszakitással müködtek, az hogy ebben a változatban hogyan müködik nem tudom, de valószinűleg erre is van valmiféle macró mint a programodban használt getchar (ami beolvas egy karaktert)
Sok sikert.
üdv.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!