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.

  1.         .model small            ;kozeli eljaras hivasok hasznalata (egy kodszegmens)
  2.         .stack                  ;szukseg lesz a veremre
  3.         .code                   ;kodszegmens. Innentol jon a program kodja
  4.         ;konstansok felvetele
  5.         cr              = 13    ;carrige return (kocsi vissza)
  6.         lf              = 10    ;line feed (új sor)
  7.         bckspc  = 8             ;backspace karakter
  8.  
  9. exit macro                      ;Program megszakítasa. Ez mindig kell a program vegen
  10.         mov ah, 04ch            ;hexa 4C az AH regiszterben utasit a kilepesre
  11.         int 21h                 ;Megszakitas. dos funkciok hivasa
  12. endm
  13.  
  14. clrscr macro                    ;DOS kepernyo torlese
  15.         push ax                 ;ax mentese
  16.         mov ax, 3               ;3-as bekerul ah-ba. Utasitas keperyno torlesere
  17.         int 10h                 ;hexa 10-es megszakitas. Kepernyo driver hivasara
  18.         pop ax
  19. endm
  20.  
  21. write_char macro chr            ;egy karakter kiirasa
  22.         push ax                 ;regiszterek mentese
  23.         push dx
  24.  
  25.         mov dl, chr             ;dl-be keruljon a karakter
  26.         mov ah, 2               ;2-es bekerul ah-ba. Utasitas karakter kiirasara
  27.         int 21h                 ;megszakitas hivas. DOS funkciok eleresere
  28.  
  29.         pop dx                  ;regiszterek visszatoltese
  30.         pop ax
  31. endm
  32.  
  33. linebreak macro                 ;sortores
  34.         write_char cr           ;kocsivissza karakter
  35.         write_char lf           ;uj sor karakter
  36. endm
  37.  
  38. read_char proc                  ;egy karakter beolvasasa
  39.         push ax                 ;ax regiszter mentese
  40.        
  41.         mov ah, 1               ;karakter bekeres kodja
  42.         int 21h                 ;hexa 21 -es megszakitas DOS-funkciok hivasahoz
  43.                                 ;A karakter ekkor AL regiszterbe kerül
  44.        
  45.         mov dl, al              ;A karakter-t a DL regiszterbe tesszuk
  46.  
  47.         pop ax                  ;ax visszatoltese
  48.         ret                     ;visszateres subrutinbol
  49. read_char endp
  50.  
  51. readw proc
  52.         push dx                 ;regiszterek tartalmanak elmentese
  53.         push ax
  54.         push cx
  55.  
  56.         xor cx, cx              ;szamlalo register torlese
  57.   readw_r_start:                ;karakterek olvasasanak kezdete
  58.         call read_char          ;egy karakter beolvasasa. Eredmeny a dl regiszterbe kerul
  59.  
  60.         cmp dl, cr              ;Ha enter volt a karakter
  61.         je readw_r_end          ;akkor fejezze be az olvasast
  62.         push dx                 ;egyebkent karakter mentese verembe
  63.         inc cx                  ;szamlalo register novelese (A loop ciklusvaltozoja)
  64.         cmp dl, bckspc          ;ha nem backspace-t nyomtuk meg
  65.         jne readw_r_start       ;akkor olvasas ciklus folytatasa
  66.         write_char ' '          ;egyebkent az elozo karakter torlese a kepernyon
  67.         write_char bckspc       ;majd visszapozicionalas a torolt karakter helyere
  68.         pop dx                  ;backspace kivetele a verembol
  69.         pop dx                  ;torolt karakter kivetele a verembol
  70.         dec cx                  ;ciklusvaltozo csokentese kettovel
  71.         dec cx
  72.  
  73.         jmp readw_r_start       ;ciklus vege. Ha eddig eljut, kezdi elolrol
  74.  
  75.   readw_r_end:
  76.         linebreak               ;sortores a beolvasas utan
  77.        
  78.         cmp cx, 0               ;Ha nincs megjelenitendo karakter
  79.         je readw_end            ;akkor ugorjon az eljaras vegere. Kuondben a ciklusban
  80.                                 ;cx 255 lesz dekrementalas utan, es kiir 255 karaktert
  81.        
  82.         mov ax, cx              ;cx -et elmentjuk ax-be, mert
  83.        
  84.   readw_spc_start:              ;space-ekkel hely előkészitese a szovegnek
  85.         write_char ' '
  86.         loop readw_spc_start   
  87.        
  88.         mov cx, ax              ;cx most nulla, ezert ujra vissza kell
  89.                                 ;adni neki a string hosszat
  90.        
  91.   readw_w_start:                ;szoveg kiirasa visszafele
  92.         write_char bckspc       ;ugras a kovetkezo karakterre a szoveg vegetol szamitva
  93.         pop dx                  ;verembol a karakter kivetele
  94.         write_char dl           ;majd kiiratasa
  95.         write_char bckspc       ;ujra ra kell allni a kiirt karakterre
  96.         loop readw_w_start      ;ciklus vege
  97.        
  98.   readw_end:
  99.        
  100.         pop cx                  ;regiszterek visszaallitasa a verembol
  101.         pop ax
  102.         pop dx
  103.        
  104.         ret                     ;kilepes a subrutinbol
  105. readw endp
  106.  
  107. main proc                       ;foprogram kezdete
  108.         clrscr                  ;kepernyo torlese
  109.         call readw              ;karakterek beolvasasa. Enter utan kiirasa.
  110.                                 ;kozben vissza lehet torolni backspace -el.
  111.         exit                    ;kilepes a programbol
  112. main endp
  113.  
  114.  
  115. end main                        ;A teljes program vege. Meg kell adni, hogy melyik
  116.                                 ;eljaras lesz a foprogram
Kategóriák: 
Megosztás/Mentés

Új hozzászólás