加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

使用DOS中断字符串输入和显示输入MASM

发布时间:2020-12-14 02:08:06 所属栏目:Windows 来源:网络整理
导读:在MASM中,我创建了一个缓冲变量来保存键盘输入的用户字符串.我坚持如何将字符串输入保存到该缓冲区变量中.我没有任何像irvine那样链接的库,并希望用DOS中断来实现.到目前为止,我有一些东西 .model small .stack 100h .databuff db 25 dup(0),10,13lbuff EQU
在MASM中,我创建了一个缓冲变量来保存键盘输入的用户字符串.我坚持如何将字符串输入保存到该缓冲区变量中.我没有任何像irvine那样链接的库,并希望用DOS中断来实现.到目前为止,我有一些东西

.model small

            .stack 100h

            .data
buff        db  25 dup(0),10,13
lbuff       EQU ($- buff)              ; bytes in a string

            .code
main:
            mov ax,@data
            mov ds,ax              

            mov ah,0Ah         ; doesn't work
            mov buff,ah        ; doesn't seem right
            int 21h                 


            mov     ax,4000h       ; display to screen
            mov     bx,1           
            mov     cx,lbuff           
            mov     dx,OFFSET buff     
            int     21h 

            mov ah,4ch
            int 21h

            end main

我假设使用0Ah是正确的,因为它是用于读取缓冲字符的输入数组.

解决方法

我对您的代码进行了一些更改.首先,“buff”变量需要三级格式(允许的最大字符数,输入字符数的另一个字节,以及缓冲区本身),因为这是0AH所需的服务.为了使用服务0AH我添加了“偏移buff”(正如沃尔夫冈所说).这里是:

.model small

            .stack 100h

            .data

buff        db  26        ;MAX NUMBER OF CHARACTERS ALLOWED (25).
            db  ?         ;NUMBER OF CHARACTERS ENTERED BY USER.
            db  26 dup(0) ;CHARACTERS ENTERED BY USER.

            .code
main:
            mov ax,ax              

;CAPTURE STRING FROM KEYBOARD.                                    
            mov ah,0Ah ;SERVICE TO CAPTURE STRING FROM KEYBOARD.
            mov dx,offset buff
            int 21h                 

;CHANGE CHR(13) BY '$'.
            mov si,offset buff + 1 ;NUMBER OF CHARACTERS ENTERED.
            mov cl,[ si ] ;MOVE LENGTH TO CL.
            mov ch,0      ;CLEAR CH TO USE CX. 
            inc cx ;TO REACH CHR(13).
            add si,cx ;NOW SI POINTS TO CHR(13).
            mov al,'$'
            mov [ si ],al ;REPLACE CHR(13) BY '$'.            

;DISPLAY STRING.                   
            mov ah,9 ;SERVICE TO DISPLAY STRING.
            mov dx,offset buff + 2 ;MUST END WITH '$'.
            int 21h

            mov ah,4ch
            int 21h

            end main

当0AH从键盘捕获字符串时,它以ENTER(字符13)结束,这就是为什么,如果要捕获25个字符,则必须指定26.

要知道用户输入的字符数(长度),请访问第二个字节(偏移buff 1).不包括ENTER,因此,如果用户键入8个字符和ENTER,则第二个字节将包含数字8,而不是9.

输入的字符从偏移buff 2开始,当字符13出现时它们结束.我们使用它来增加buff 2 1的长度,用’$’代替chr(13).现在我们可以显示字符串了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读