您的位置:首页 > 移动开发 > IOS开发

使用BIOS进行键盘输入【编程:字符串的输入】

2013-01-24 11:21 519 查看
;=======字符串的输入=========
;功能:
; 1、在输入的同时显示这个字符串
; 2、在输入回车符后,字符串输入结束
; 3、能够删除已经输入的字符
;
;字符串的入栈、出栈、显示
;参数说明:
; 1、(ah)=功能号,
; 0表示入栈
; 1表示出栈
; 2表示显示
; 2、ds:si指向字符栈空间
; 3、 对于0号功能:(al)=入栈字符
; 对于1号功能:(al)=返回的字符
; 对于2号功能:(dh)、(dl)=字符串在屏幕上显示的行、列位置

assume cs:code, ds:stack

stack segment
dd 128 dup(0)
stack ends

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

getstrs:
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 getstrs

nochar:
cmp ah, 0eh  ;退格键的扫描码
je backspace
cmp ah, 1ch  ;Enter键的扫描码
je enter
jmp short getstrs

;退格键
backspace:
mov ah, 1
call charstack ;字符出栈
mov ah, 2
call charstack ;显示栈中的字符
jmp short getstrs

;Enter键
enter:
mov al, 0
mov ah, 0  ;入栈0
call charstack
mov ah, 2
call charstack ;显示栈中的字符

pop ax
ret

;==========================================================
;字符串的入栈、出栈、显示
;参数说明:
;1、(ah)=功能号,
;   0表示入栈
;   1表示出栈
;   2表示显示
;2、ds:si指向字符栈空间
;3、对于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 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐