;=======字符串的输入=========
;功能:
; 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