編程:調(diào)用BIOS int 16H進行字符串的輸入
編程:調(diào)用BIOS int 16H進行字符串的輸入
assume cs:code
code segment
start:
call getstr
mov ax,4c00H
int 21h
; 子程序: 字符串輸入
;(1)蒋譬、調(diào)用16H讀取鍵盤輸入
;(2)、如果是字符,進入字符棧氧映,顯示字符棧中的所有字符类垦;繼續(xù)執(zhí)行 (1)
;(3)、如果是退格鍵蹂匹,從字符棧中彈出一個字符碘菜,顯示字符棧中的所有字符來,繼續(xù)執(zhí)行(1)
;(4)限寞、如果是enter鍵忍啸,向字符棧中壓入一個0,返回履植。
getstr: push ax
getstrs: mov ah,0
int 16H
cmp al,20H
jb nochar ; ASCII碼小于20H计雌,說明不是字符
mov ah,0
call charstack ;字符入棧
mov ah,2
call charstack ;顯示棧中的字符
jmp getstrs
nochar: cmp ah,0eh ;退格鍵的掃描碼
je backspace
cmp ah,1ch ;Enter鍵的掃描碼
je enter2
jmp getstrs
backspace: mov ah,1
call charstack ;字符出棧
mov ah,2
call charstack ;顯示棧中的字符
jmp getstrs
enter2: mov al,0
mov ah,0
call charstack ;0 入棧
mov ah,2
call charstack ;顯示棧中的字符
pop ax
ret
; 字符棧的入棧、出棧和顯示
; 參數(shù): (ah)=功能號玫霎,0表示入棧凿滤,1表示出棧,2表示顯示
; ds:si 指向字符検空間
; 對于0號功能翁脆,(al)=入棧字符
; 對于1號功能,(al)=返回字符串
; 對于2號功能鼻种,(dh)反番、(dl)=字符串在屏幕上顯示的行、列位置
charstack: jmp short charstart
table dw charpush,charpop,charshow
top dw 0 ;棧頂
charstart: push bx
push dx
push di
push es
cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx]
charpush: mov bx,top
mov [si][bx],al
inc top
jmp sret
charpop: cmp top,0
je sret
dec top
mov bx,top
mov al,[si][bx]
jmp sret
charshow: mov bx,0B800H
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx ; di = 160 x 行 + 2 x 列
mov bx,0
charshows: cmp bx,top
jne noempty
mov byte ptr es:[di],' '
jmp sret
noempty: mov al,[si][bx] ; bx = 0 表示棧底
mov es:[di],al
mov al,02H
mov es:[di+1],al ; 設置顏色屬性 為綠色
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows
sret: pop es
pop di
pop dx
pop bx
ret
code ends
end start
代碼實現(xiàn)中的棧
代碼實現(xiàn)中的棧
BUG
- 有時候輸入完按下 Enter 可以正常退出程序,有時候會把DOSBOX卡死罢缸,不知道原因是什么校读?