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

我的博客

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

[2013-09-19 21:43] 第17章 字符栈

;程序名称:Char_pro
;任务:完成字符串的输入、删除和显示

assume cs:code

stack segment
   db 128 dup (0)
stack ends

code segment
                                
start: mov ax,stack
mov ds,ax
mov si,0             ;设置ds:si指向栈空间
                        
call getstr
 
mov ax,4c00h
int 21h

;- - - - - - - - - - - - - - - - - - - 
;getstr子程序
;任务:对int 16h接收到的键盘输入,进行字符、退格键、回车键的分类处理

getstr:
push ax
                        
getstrs: mov ah,0
int 16h
cmp al,20h
jb nochar          ;小于20h的ASCII码不是字符,则转去另行处理
mov ah,0
call charstack     ;字符入栈
mov ah,2
call charstack     ;显示栈中字符
jmp getstrs
            
nochar: cmp ah,0eh ;判断int 16h是否读到退格键扫描码
je backspace       ;读到,则转到backspace
cmp ah,1ch         ;判断int 16h是否读到回车键扫描码
je enter           ;读到,则转到enter
jmp getstrs        
            
backspace: mov ah,1
call charstack     ;字符出栈
mov ah,2
call charstack     ;显示栈中字符
jmp getstrs
            
enter: mov al,0
mov ah,0
call charstack     ;0入栈,字符串输入结束
mov ah,2
call charstack      ;显示栈中字符
pop ax
ret

;- - - - - - - - - - - - - - - - -         
;Charstack子程序(字符栈)
;任务:将键盘输入的字符入栈、出栈,并显示栈中字符
;参数:(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    ;将栈顶赋予bx
mov [si][bx],al         ;将入栈符号存于栈顶处
inc top                 ;将栈顶位置加1,完成入栈
jmp sret
             
charpop: cmp top,0    ;判断栈顶是否为0
je sret               ;为0则不可出栈,转到结束
dec top               ;不为0则栈顶位置减1
mov bx,top            ;将栈顶赋予bx
mov al,[si][bx]       ;将[si][bx]处的符号存于al,完成出栈
jmp sret
             
charshow: mov bx,0b800h    ;设置显示位置
mov es,bx
mov al,160
mov ah,0
mul dh                     ;乘数为行号
mov di,ax                  ;相乘结果存于di
add dl,dl                  ;1个字符占2字节
mov dh,0
add di,dx                  ;相加得首字符显示位置,存于di
             
mov bx,0
charshows: cmp bx,top      ;判断栈顶是否为0
jne noempty                ;不为0,则转到noempty(非空)
mov byte ptr es:[di],' '   ;为0,输一空格清除之前显示字符
jmp sret                   ;转到结束
noempty: mov al,[si][bx]   ;读取[si][bx]处字符,存于al
mov es:[di],al             ;在首位置显示读取的字符
mov byte ptr es:[di+2],' ' ;同时清除之前显示的字符
inc bx                     ;栈中寻址增1
add di,2                   ;显示位置增2
jmp charshows
             
sret: pop es
pop di
pop dx
pop bx
ret
             
code ends
end start
评论次数(0)  |  浏览次数(562)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码