天天看點

(彙編語言)17.3 字元串的輸入運作截圖

;子程式:字元串的入棧、出棧、顯示
;參數說明:(ah)=功能号,0表示入棧,1表示出棧,2表示顯示
;           ds:si指向字元棧空間
;           對于0号功能:(al)=入棧字元
;           對于1号功能:(al)=出棧字元
;           對于2号功能:(dh)、(dl)表示螢幕上的行和列
assume cs:code
code segment
start:
  
   
     mov ax, cs
     mov ds, ax
     mov si, 0
     mov dh, 12
     mov dl, 40
     call getstr
     mov ax,4c00h
     int 21h


;*******************************************************
 ;接收字元串輸入子程式
 getstr:
   push ax
   
getstr_s:
   mov ah, 0  
   int 16h
   cmp al, 20h            ;al中存放的是掃描碼對應的ASCII碼
   jb nochar              ;ASCII碼小于20h, 說明不是字元
   
   ;字元入棧
   mov ah, 0              ;ah: 0号功能 字元入棧、al:為入棧資料
   call charstack
   ;顯示棧中的字元
   mov ah, 2
   call charstack
   jmp short getstr_s
     
nochar:   
   cmp ah, 0eh  ;倒退鍵的掃描碼
   je backspace 
   cmp ah, 1ch  ;Enter鍵的掃描碼
   je enter  
   jmp short getstr_s  
   

backspace:
   mov ah, 1
   call charstack       ;字元出棧
   mov ah, 2
   call charstack       ;顯示棧中的字元
   jmp short getstr_s
 
enter:
   mov al, 0
   mov ah, 0  ;入棧0
   call charstack
   mov ah, 2
   call charstack ;顯示棧中的字元
   
   pop ax
   ret
;**************************************************
;子程式
charstack: 
   jmp short charstart
 table dw charpush, charpop, charshow
 top  dw 0 ;儲存棧頂  注意:始終指向棧頂有效字元的上一個

charstart:
   push bx
   push dx
   push di
   push si
   push es
   
   cmp ah, 2
   ja sret  ;ja高于則轉移
   mov bl, ah
   mov bh, 0
   add bx, bx ;功能号*2 = 對應的功能子程式在位址表中的偏移
   jmp word ptr table[bx]
   

;字元入棧
charpush:
   mov bx, top  ;取得棧頂
   mov [si][bx], al
   inc top   ;棧頂+1
   jmp short sret
;字元出棧
charpop:
   cmp top, 0 ;檢查棧是否為空
   je sret 
   dec top  ;棧頂-1  此時指向棧頂的有效字元
   mov bx, top
   mov al, [si][bx] ;把取出的字元儲存在al中
   jmp short sret

;字元顯示
charshow:
   mov bx, 0b800h
   mov es, bx
   mov al, 160
   mov ah, 0
   mul dh     ;ax=al*dh=160*行數
   mov di, ax
   add dl, dl  ;dl+dl = 偏移量
   mov dh, 0
   add di, dx  ;di=(160*行數)+2*列數
   
   mov bx, 0
 charshows:
   cmp bx, top  ;bx為 存放資料空間的偏移
   jne noempty  ;棧不為空 顯示
   mov byte ptr es:[di], ' ' 
   jmp short sret 
   
 noempty:
   mov al, [si][bx]
   mov es:[di], al
   mov byte ptr es:[di+2], ' ' ;如果是删除 就可以把删除的字元清空
   inc bx
   add di, 2
   jmp short charshows


sret:
   pop es
   pop si
   pop di
   pop dx
   pop bx
   ret
      
code ends
end start
           

運作截圖

(彙編語言)17.3 字元串的輸入運作截圖
(彙編語言)17.3 字元串的輸入運作截圖

但是程式依舊有bug,寫滿一行出現卡死,彈不出來 。。。

繼續閱讀