| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1538 人关注过本帖
标题:从键盘输入 字符串遇到的麻烦,寻求帮助
只看楼主 加入收藏
lizhijie
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-4-28
收藏
 问题点数:0 回复次数:6 
从键盘输入 字符串遇到的麻烦,寻求帮助
以下是我的程序中的一段:想从键盘输入一字符串

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

我不明白的是为什么我一执行这个程序就结束,电脑根本不给我输入数据的机会?
搜索更多相关主题的帖子: 字符 键盘 麻烦 输入 
2007-12-08 19:46
wolaixiazai
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-4-11
收藏
得分:0 
把代码贴上来看看
2007-12-08 20:24
lizhijie
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-4-28
收藏
得分:0 
原帖由 [bold][underline]wolaixiazai[/underline][/bold] 于 2007-12-8 20:24 发表 [url=http://bbs.][/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-08 20:38
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
输入缓冲区必须是如下格式
input_one db 50    ;这个表示可以接受的最大字符数,因为用户最后要按回车表示结束,
                              ;所以其实用户只能输入49个字符,最后一个字符是回车(0DH)
                 db ?       ;用户输入后,这个字节保存用户实际输入的字符数,不包括最后的回车符号
                 db 50 dup (0)    ;实际保存用户输入的缓冲区,用dup(0)或者dup(?)无所谓,
                                           ;只要注意前面的数字跟那个最大字符数相同就行.

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-12-09 12:51
lihy114
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-5-15
收藏
得分:0 
在比较字符串的时候,源操作数的偏移地址是放在SI中的,目的操作数的偏移地址是放在DI中的;源操作数的段地址是放在DS中的,目的操作数的段地址放在了ES中,怎么没有看到程序中有设置段地址???

俺妈跟俺说:低调!!!!
2007-12-09 16:17
lihy114
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-5-15
收藏
得分:0 
我自己调了一下,可以这样改
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-09 20:00
lizhijie
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-4-28
收藏
得分:0 
最近因为比较忙啊,好久没有来论坛了,今天忽然发现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 | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053296 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved