[080][汇编语言]编程:调用BIOS int 16H进行字符串的输入

编程:调用BIOS int 16H进行字符串的输入

[080][汇编语言]编程:调用BIOS int 16H进行字符串的输入_第1张图片
编程:调用BIOS int 16H进行字符串的输入
assume cs:code
code segment
start:
        call getstr
        
        mov ax,4c00H
        int 21h




; 子程序: 字符串输入
;(1)、调用16H读取键盘输入
;(2)、如果是字符,进入字符栈,显示字符栈中的所有字符;继续执行 (1)
;(3)、如果是退格键,从字符栈中弹出一个字符,显示字符栈中的所有字符来,继续执行(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


;   字符栈的入栈、出栈和显示
;   参数: (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

代码实现中的栈

[080][汇编语言]编程:调用BIOS int 16H进行字符串的输入_第2张图片
代码实现中的栈

BUG

  • 有时候输入完按下 Enter 可以正常退出程序,有时候会把DOSBOX卡死,不知道原因是什么?

你可能感兴趣的:([080][汇编语言]编程:调用BIOS int 16H进行字符串的输入)