;子程式:字元串的入棧、出棧、顯示
;參數說明:(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
運作截圖
但是程式依舊有bug,寫滿一行出現卡死,彈不出來 。。。