汇编网首页登录博客注册
chinaljg的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈

[2011-02-11 08:09] 第17章:字符串的输入

图片载入中
assume cs:code
code segment
start:
        call getstr
        mov ax,4c00h
        int 21h

;完整的接收字符串输入的子程序
;21:03 2011-02-10 author:chinaljg
getstr:        push ax
getstrs:        mov ah,0
        int 16h        ;读取键盘缓冲区,ah=扫描码al=ascii码
        cmp al,20h
        jb nochar        ;ascii码小于20h,说明不是字符
        ;ascii码小于41h,能否说明不是字符?????????????????
        mov ah,0        ;ah=0,表示0号功能入栈,要入栈的字符在al中
        call charstack  ;字符入栈
        mov ah,2
        call charstack  ; 显示栈中的字符
        jmp getstrs

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

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

enter:        mov al,0 ;(al)=0入栈作为字符串的结束符
        mov ah,0  ;(ah)=0调用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        ;栈顶,或栈内元素数量(top)=0表示栈空,(top)=2表示栈内有2个元素。

charstart:        push bx
        push dx
        push di
        push es

        cmp ah,2 ;判断子程序的功能号
        ja sret      ;大于2返回
        mov bl,ah        ;通过bx计算功能号在table中的偏移地址
        mov bh,0
        add bx,bx ;一个偏移地址占2个字节,所以bx*2
        jmp word ptr table[bx]  ;跳转到子程序的相应功能:入栈 出栈 显示
        ;call word ptr table[bx]?

charpush:        mov bx,top  ;bx指向栈顶
        mov [si][bx],al ;将al内的字符入栈
        inc top        ;栈顶上移一个字节
        jmp sret        ;返回

charpop:        cmp top,0  ;出栈前判断字符栈是否为空
        je sret        ;字符栈为空,不用出栈,直接返回
        dec top        ;字符栈不空,栈指针top下移指向栈顶元素.top=0时,0不是栈顶元素,而是下一个要入栈的元素存放的位置
        mov bx,top  ;bx指向栈顶元素
        mov al,[si][bx]  ;(al)=返回的栈顶元素
        jmp sret        ;返回

charshow:        mov bx,0b800h
        mov es,bx ;es指向显存缓冲区
        mov al,160
        mov ah,0
        mul dh  ;计算行数160*dh,结果在ax中
        mov di,ax  ;保存到di中,es:[di]指向显示的位置
        add dl,dl        ;计算列数 dl*2
        mov dh,0
        add di,dx ;计算出字符要显示的位置:160*ah+al*2

        mov bx,0        ;bx用来表示字符在字符栈中的偏移量,bx=0时表示指向字符栈中的第一个字符(从0开始)
        ;也可以理解为bx指向栈底元素

charshows:
        cmp bx,top ;栈底和栈顶比较,用来判断字符栈是否为空,栈底=栈顶,栈空.
        jne noempty
        mov byte ptr es:[di],' ' ;栈空,显示空格相当于无任何显示.清除屏幕上上一次显示的内容
        jmp sret        ;返回
noempty:        mov al,[si][bx]        ;栈不空,(al)=栈底元素
        mov es:[di],al        ;将(al)显示
        mov byte ptr es:[di+2],' ' ;?把下一个要显示字符的位置清空?清除屏幕上上一次显示的内容
        inc bx        ;(bx)指向下一个栈底元素,栈底上移
        add di,2        ;ds:[di]指向下一个显示位置
        jmp charshows ;继续显示,直到栈空.

sret:        pop es
        pop di
        pop dx
        pop bx
        ret
        
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code ends
end start
;;;;;;;;;;向大家学习,QQ:1250609960;;;;;;;
评论次数(1)  |  浏览次数(1051)  |  类型(汇编作业) |  收藏此文  | 

[  chinaljg   发表于  2011-02-13 21:57  ]

字符串长度超过270时,程序不稳定,无法显示字符

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码