【汇编语言】by王爽 | 实验17.3:字符串的输入

前言:本实验为王爽老师的《汇编语言》第三版中的实验17.3(p304)

实验环境:DOSBox 0.74-3

基础知识:请先查看书中 17.3 节关于字符串输入的介绍

实验任务:

        编程,实现一个基本的字符串输入程序,具备以下功能:

        (1)在输入的同时需要显示这个字符串;

        (2)一般在输入回车后,字符串输入结束

        (3)能够删除已经输入的字符

程序代码:

assume cs:code

code segment 
start: ;程序开始即准备获取字符
       mov ah,0
       int 16h
       ;获取字符
       ;ah=扫描码,al=ascii码
       cmp al,20h  ;ascii码<20h说明非字符
       jb nochar
       ;ah=0,字符入栈
       mov ah,0
       call charstack
       ;ah=2,显示字符串
       mov ah,2
       mov dh,24  ;dh:行号
       mov dl,0  ;dl:列号
       call charstack

       jmp start  ;等待下一字符输入

nochar: ;非字符情况
        ;退格:0eh
        ;enter:1ch
        cmp ah,0eh
        je backspace
        cmp ah,1ch
        je enter

        jmp start  ;输入其它非字符:返回程序开始,准备再次获取字符

backspace:
        ;ah=1,字符出栈,即删除
        mov ah,1
        call charstack
        ;显示栈中字符串
        mov ah,2
        call charstack

        jmp start  ;操作执行完毕:返回程序开始,准备再次获取字符

enter: ;0入栈,字符串结束
       mov ah,0
       mov al,0
       call charstack  
       ;显示字符串
       mov ah,2
       call charstack  

       jmp start

;-----------------------------------子程序入口---------------------------------
charstack: 
       jmp short charstart
       table dw charpush,charpop,charshow
       top dw 0  ;栈顶top=字符串字符个数(利用数据标号“定义变量”)
charstart:
       push bx
       push es
       push ax
       push di
       push cx
       ;bx指向字符栈功能入口
       cmp ah,2
       ja sret  ;ah>2则退出子程序
       mov bh,0
       mov bl,ah
       add bx,bx
       jmp word ptr table[bx]  ;跳转至对应功能

;字符入栈
charpush:
       mov bx,top
       mov byte ptr [si+bx],al  ;ds:[si + (top)]指向字符串后一个字符位
       inc top  ;每入栈一个字符top+1

       jmp sret

;字符出栈-删除(从字符串最后一个字符开始)
charpop:
       cmp top,0
       je sret  ;top=0表示字符栈中没有字符
       dec top  ;字符个数-1
       mov bx,top
       mov al,[si+bx]  ;此时ds:[si + (top)]指向字符串最后一个字符(即被删除的字符)

       jmp sret

;显示字符:0 ~ top-1
charshow:
       mov bx,0b800h
       mov es,bx
       mov ah,0
       mov al,160  ;每行160 byte,dh-行号
       mul dh  ;结果存储在ax
       add dl,dl  ;列号x2(显示区域每个字符占2 byte)
       add al,dl
       adc ah,0
       mov di,ax  ;es:di指向显示位置

       cmp top,0
       jne noempty
       mov byte ptr es:[di],' '
       jmp sret

noempty:
       mov bx,0  ;此时ds:[si + bx]指向字符串第一个字符
       mov cx,top
    s: mov al,[si+bx]
       mov es:[di],al
       mov al,2  ;al存储样式
       mov es:[di+1],al
       inc bx  ;bx指向下一个字符
       add di,2  ;es:di指向下一个显示字节
       loop s
       mov byte ptr es:[di],' '  

       jmp sret
;----------------------------------------
 sret: pop cx
       pop di
       pop ax
       pop es
       pop bx
       ret   
  
code ends
end start

运行结果: 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值