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
 
      
    
         
      