Karakterek bekérése, kiírása és törlése Microsoft Macro Assemblerben

instrdel logo

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.

        .model small            ;kozeli eljaras hivasok hasznalata (egy kodszegmens)
        .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

Kategóriák: 
Megosztás/Mentés