| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付赛孚耐:软件保护加密专家
身份认证令牌USB KEY   
共有 900 人关注过本帖
标题:从键盘输入 字符串遇到的麻烦,寻求帮助
收藏  订阅  推荐  打印 
lizhijie
Rank: 2
等级:注册会员
帖子:60
积分:714
注册:2007-4-28
从键盘输入 字符串遇到的麻烦,寻求帮助

以下是我的程序中的一段:想从键盘输入一字符串

lea dx,keyboard    ;keyboard为预留的存放输入数据的区域
mov ah,0ah
int 21h

我不明白的是为什么我一执行这个程序就结束,电脑根本不给我输入数据的机会?
搜索更多相关主题的帖子: 字符  键盘  麻烦  输入  
2007-12-8 19:46
wolaixiazai
Rank: 1
等级:新手上路
帖子:14
积分:300
注册:2007-4-11

把代码贴上来看看
2007-12-8 20:24
lizhijie
Rank: 2
等级:注册会员
帖子:60
积分:714
注册:2007-4-28

原帖由 [bold][underline]wolaixiazai[/underline][/bold] 于 2007-12-8 20:24 发表 [url=http://bbs.bc-cn.net/redirect.php?goto=findpost&pid=1138718&ptid=191235][/url]
把代码贴上来看看
这是我的源程序,输入两个字符串,比较是否相同,相同输出MATCH,否则输出NOT MATCH。
data_seg segment
match db 'MATCH','$'
nmatch   db 'NOT MATCH','$'
str_one db 'please input your string:','$'
str_two db 'please input your string again:','$'
input_one db 50 dup(?)
input_two db 50 dup(?)
data_seg ends
stack_seg segment                                                  
db 20 dup(0)
stack_seg ends
code_seg segment            
assume cs:code_seg,ds:data_seg
   start:
mov ax,data_seg
mov ds,ax
lea dx,str_one
mov ah,9h                                                         
int 21h
mov dx,offset input_one
call input
;------------------------
lea dx,str_two
mov ah,9h
int 21h
lea dx,input_two
call input
;------------------------                                            
mov si,OFFSET input_one
mov di,OFFSET input_two
call str_cmps

  end_code:
mov ah,4ch
int 21h
                                                                  
;子程序功能:从键盘输入一字符串
;入口参数  :dx,存放缓冲区手地址
;出口参数  :无
input PROC near
push ax
mov ah,0ah
int 21h
pop ax
ret                                                            
input ENDP

;子程序功能:比较两字符串,相同输出MATCH,否则输出NOT MATCH
;入口参数  :si存放源字符串地址,di存放目标字符串地址(即第二次输入的字符串)
;出口参数  :无
str_cmps  proc near
push ax
push cx                                                        
push dx
cld
mov cx,50
repe cmpsb
jz success
jnz false
  last_thing:
pop dx
pop cx
pop ax                                                         
ret
  success:
mov dx,offset match
mov ah,9
int 21h
jmp last_thing
  false:
mov dx,offset nmatch
mov ah,9
int 21h                                                               
jmp last_thing
str_cmps endp
code_seg ENDS
END start

2007-12-8 20:38
永夜的极光
Rank: 12Rank: 12Rank: 12
等级:版主
威望:26
帖子:2710
积分:35264
注册:2007-10-9

输入缓冲区必须是如下格式
input_one db 50    ;这个表示可以接受的最大字符数,因为用户最后要按回车表示结束,
                              ;所以其实用户只能输入49个字符,最后一个字符是回车(0DH)
                 db ?       ;用户输入后,这个字节保存用户实际输入的字符数,不包括最后的回车符号
                 db 50 dup (0)    ;实际保存用户输入的缓冲区,用dup(0)或者dup(?)无所谓,
                                           ;只要注意前面的数字跟那个最大字符数相同就行.

从BFS(Breadth First Study)到DFS(Depth First Study)
学习VIM中,欢迎访问我的blog  http://hi.baidu.com/newkedison
严重鄙视一切把论坛当成作业生成器和人肉搜索引擎的人
2007-12-9 12:51
lihy114
Rank: 1
等级:新手上路
帖子:8
积分:196
注册:2007-5-15

在比较字符串的时候,源操作数的偏移地址是放在SI中的,目的操作数的偏移地址是放在DI中的;源操作数的段地址是放在DS中的,目的操作数的段地址放在了ES中,怎么没有看到程序中有设置段地址???

俺妈跟俺说:低调!!!!
2007-12-9 16:17
lihy114
Rank: 1
等级:新手上路
帖子:8
积分:196
注册:2007-5-15

我自己调了一下,可以这样改
input_one db 50 dup(?)
input_two db 50 dup(?)
改为
input_one db 50,?,50 dup(?)
input_two db 50,?,50 dup(?)
将mov ax,data_seg
mov ds,ax
改为mov ax,data_seg
mov ds,ax
mov es,ax
这样可以得到正确的结果

俺妈跟俺说:低调!!!!
2007-12-9 20:00
lizhijie
Rank: 2
等级:注册会员
帖子:60
积分:714
注册:2007-4-28

最近因为比较忙啊,好久没有来论坛了,今天忽然发现10天前放了一个问题在这,谢谢各位,问题已近得到解决。
不过这个程序还是有问题的,在判断的时候应该先判断两个字符串的长度是否相同,因为如果两个字符串的长度不一,可是短字符串和长字符串的前面相等个数的字符相同,这个程序就无能为力了。以下是改进版:
data_seg segment
match db 'MATCH','$'
nmatch   db 'NOT MATCH','$'
str_one db 'please input your string(end with ENTER):','$'
str_two db 'please input your string again:','$'
next_line db 0dh,0ah,'$'
input_one db 50,?,50 dup(?)
input_two db 50,?,50 dup(?)
char_num_1 db 0
char_num_2 db 0  ;-----------存放两次输入字符的个数,如果不等,可直接判断NOT MATCH
data_seg ends

stack_seg segment                                                  
db 256 dup(0)
stack_seg ends

code_seg segment            
assume cs:code_seg,ds:data_seg,ss:stack_seg
   start:
mov ax,data_seg
mov ds,ax
mov es,ax
lea dx,str_one
mov ah,9h                                                         
int 21h
lea bx,input_one
call input
lea bx,char_num_1
mov [bx],di
;------------------------
lea dx,next_line
mov ah,9h
int 21h
lea dx,str_two
mov ah,9h
int 21h
lea bx,input_two
call input
lea bx,char_num_2
mov [bx],di
lea dx,next_line
mov ah,9h
int 21h
;------------------------                                            
lea si,input_one
lea di,input_two
call str_cmps

mov ah,4ch
int 21h
                                                                  
;子程序功能:从键盘输入一字符串
;入口参数  :bx,存放缓冲区手地址 ,di寻址
;出口参数  :无
input PROC near
push ax
push bx

xor di,di
mov ah,01h
    input_char:   
int 21h
mov byte ptr [bx+di],al
inc di
cmp al,0dh
jnz input_char

pop bx
pop ax
ret                                                            
input ENDP

;子程序功能:比较两字符串,相同输出MATCH,否则输出NOT MATCH
;入口参数  :si存放源字符串地址,di存放目标字符串地址(即第二次输入的字符串)
;出口参数  :无
str_cmps  proc near
push ax
push cx                                                        
push dx

lea bx,char_num_1
mov cl,byte ptr [bx]
lea bx,char_num_2
mov ch,byte ptr [bx]
mov al,cl
cmp cl,ch
jnz false       ;-----------------------如果两次输入的字符数不相等,直接判断

mov cl,al
xor ch,ch
cld
repe cmpsb
jz success
jnz false

  last_thing:
pop dx
pop cx
pop ax                                                         
ret
  success:
mov dx,offset match
mov ah,9
int 21h
jmp last_thing
  false:
mov dx,offset nmatch
mov ah,9
int 21h                                                               
jmp last_thing
str_cmps endp

code_seg ENDS
END start

2007-12-20 23:00
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.081325 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved