;=======字符串的输入========= ;功能: ; 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
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/110224.html原文链接:https://javaforall.cn