Hogy legyen valami új is, íme egy Microsoft Macro Assemblerben írt programocska. Bekér egy karakterláncot, majd azt utána kiírja a következő sorban. Ezt megtoldva azzal a funkcióval, hogy backspace hatására törlődik az előzőleg bekért karakter. Ez természetesnek tűnhet, de ez sem történik meg magától. Le kell programozni.
A programot masm 6.11 -el fordítottam. Ez egyben kódszerkesztő is, de mivel nem színezi a forrást, azt notepad++ -ban írtam.
De nem húzom az időt. Mutatom a forráskódot.
.stack ;szukseg lesz a veremre
.code ;kodszegmens. Innentol jon a program kodja
;konstansok felvetele
cr = 13 ;carrige return (kocsi vissza)
lf = 10 ;line feed (új sor)
bckspc = 8 ;backspace karakter
exit macro ;Program megszakítasa. Ez mindig kell a program vegen
mov ah, 04ch ;hexa 4C az AH regiszterben utasit a kilepesre
int 21h ;Megszakitas. dos funkciok hivasa
endm
clrscr macro ;DOS kepernyo torlese
push ax ;ax mentese
mov ax, 3 ;3-as bekerul ah-ba. Utasitas keperyno torlesere
int 10h ;hexa 10-es megszakitas. Kepernyo driver hivasara
pop ax
endm
write_char macro chr ;egy karakter kiirasa
push ax ;regiszterek mentese
push dx
mov dl, chr ;dl-be keruljon a karakter
mov ah, 2 ;2-es bekerul ah-ba. Utasitas karakter kiirasara
int 21h ;megszakitas hivas. DOS funkciok eleresere
pop dx ;regiszterek visszatoltese
pop ax
endm
linebreak macro ;sortores
write_char cr ;kocsivissza karakter
write_char lf ;uj sor karakter
endm
read_char proc ;egy karakter beolvasasa
push ax ;ax regiszter mentese
mov ah, 1 ;karakter bekeres kodja
int 21h ;hexa 21 -es megszakitas DOS-funkciok hivasahoz
;A karakter ekkor AL regiszterbe kerül
mov dl, al ;A karakter-t a DL regiszterbe tesszuk
pop ax ;ax visszatoltese
ret ;visszateres subrutinbol
read_char endp
readw proc
push dx ;regiszterek tartalmanak elmentese
push ax
push cx
xor cx, cx ;szamlalo register torlese
readw_r_start: ;karakterek olvasasanak kezdete
call read_char ;egy karakter beolvasasa. Eredmeny a dl regiszterbe kerul
cmp dl, cr ;Ha enter volt a karakter
je readw_r_end ;akkor fejezze be az olvasast
push dx ;egyebkent karakter mentese verembe
inc cx ;szamlalo register novelese (A loop ciklusvaltozoja)
cmp dl, bckspc ;ha nem backspace-t nyomtuk meg
jne readw_r_start ;akkor olvasas ciklus folytatasa
write_char ' ' ;egyebkent az elozo karakter torlese a kepernyon
write_char bckspc ;majd visszapozicionalas a torolt karakter helyere
pop dx ;backspace kivetele a verembol
pop dx ;torolt karakter kivetele a verembol
dec cx ;ciklusvaltozo csokentese kettovel
dec cx
jmp readw_r_start ;ciklus vege. Ha eddig eljut, kezdi elolrol
readw_r_end:
linebreak ;sortores a beolvasas utan
cmp cx, 0 ;Ha nincs megjelenitendo karakter
je readw_end ;akkor ugorjon az eljaras vegere. Kuondben a ciklusban
;cx 255 lesz dekrementalas utan, es kiir 255 karaktert
mov ax, cx ;cx -et elmentjuk ax-be, mert
readw_spc_start: ;space-ekkel hely előkészitese a szovegnek
write_char ' '
loop readw_spc_start
mov cx, ax ;cx most nulla, ezert ujra vissza kell
;adni neki a string hosszat
readw_w_start: ;szoveg kiirasa visszafele
write_char bckspc ;ugras a kovetkezo karakterre a szoveg vegetol szamitva
pop dx ;verembol a karakter kivetele
write_char dl ;majd kiiratasa
write_char bckspc ;ujra ra kell allni a kiirt karakterre
loop readw_w_start ;ciklus vege
readw_end:
pop cx ;regiszterek visszaallitasa a verembol
pop ax
pop dx
ret ;kilepes a subrutinbol
readw endp
main proc ;foprogram kezdete
clrscr ;kepernyo torlese
call readw ;karakterek beolvasasa. Enter utan kiirasa.
;kozben vissza lehet torolni backspace -el.
exit ;kilepes a programbol
main endp
end main ;A teljes program vege. Meg kell adni, hogy melyik
;eljaras lesz a foprogram