有一个程序请大家诊断一下!,谢谢

jxw1987628 2007-06-05 09:25:32
这是一个比较键盘输入的个个句子,前面一个是关键词,后面一个是句子.找到关键词就显示"Match"否则"NO match."
datarea segment
key db 10
string1 db 'Enter key word:',13,10,'$'
mess1 db 'Match.',13,10,'$'
mess2 db 'No match.',13,10,'$'
string2 db 'Enter Sentence:',13,10,'$'
;
str db 50
datarea ends
prognam segment
main proc far
assume cs:prognam,ds:datarea,es:datarea
start:
push ds
sub ax,ax
push ax
mov ax,datarea
mov ds,ax
mov es,ax

lea dx,string1
mov ah,09
int 21h

lea dx,key
mov ah,0ah
int 21h

lea dx,string2
mov ah,09
int 21h

lea dx, es:str
mov ah,0ah
int 21h
lea si,key
lea di,str
mov cx,17
cld
rep cmpsb
je matchmess
lea dx,mess2
mov ah,09
int 21h
ret
matchmess:
lea dx,mess1
mov ah,09
int 21h
ret
main endp
prognam ends
end start





...全文
303 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxw1987628 2007-06-13
  • 打赏
  • 举报
回复
谢谢!,问题已经解决了,
谢谢!!!!!!!!!
dongyi940333 2007-06-12
  • 打赏
  • 举报
回复
这个代码我是将前面的C代码改来的,觉得它的思路好一些.
程序中有几个问题没处理,(太懒了^-^)你看一下,可以输出位置



.model small
.stack 4096


data segment

maxKey db 10

actualKey db ?

stringKey db 10 dup(?)

maxSen db 20

actualSen db ?

stringSen db 20 dup(?)

intputkey db 'Enter key word:',0dh,0ah,'$'

inputSen db 'Enter Sentence:',0dh,0ah,'$'

msgFind db 'Match. The key position is: ',13,10,'$'

msgNoFind db 'No match.',13,10,'$'

newLine db 0dh, 0ah, '$'

j dw 0


data ends



code segment
assume cs:code,ds:data,es:data

start:

mov ax,data

mov ds,ax

mov es,ax ;必须初始化es寄存器


lea dx,intputkey ;输出输入关键字的提示字符

mov ah,09

int 21h



lea dx,maxkey ;输入关键字

mov ah,0ah

int 21h



lea dx, newLine ;输出换行

mov ah, 09

int 21h



lea dx,inputSen ;输出输入句子的提示字符

mov ah,09

int 21h



lea dx,maxSen ;输入句子

mov ah,0ah

int 21h



;开始查找

xor ch, ch

mov cl, actualSen

sub cl, actualKey ;计算变量endpsoition的值

cmp cl, 0 ;判断变量endpsoition的值是否小于0

jl NoFind ;cl值为负表示关键词比句子长



;开始循环

mov ax, 0; ;变量i初始化,用ax替代

OutSide:

cmp ax, cx ;判断i是否大于endpositon(其值在cl中)

jg NoFind ;i大于endpositon则循环结束,表示没有找到

mov j, ax ;变量j初始化



InSide:

mov si, j ;指向句子

mov di, j

sub di, ax ;计算j-i即关键词的偏移

mov bl, stringSen[si]

cmp bl, stringKey[di] ;比较关键词和句子的字符

jne InSideEnd ;不相等就结束内层循环

cmp stringKey[di + 1], 0DH ;相等的话判断子串是否结束(di的值就是表达式j-i的值,但不知道这种写法好不好,不想再算一次j-i的值)

je Find ;找到子串

inc j ;j的值加1

jmp InSide ;重复内层循环,继续下一个字符的比较




InSideEnd:

inc ax ;i的值加1

jmp OutSide ;重复外层循环



Find: ;找到字符串

inc ax

push ax ;保存关键词的位置



lea dx, newLine ;输出换行

mov ah, 09

int 21h

lea dx,msgFind

mov ah,09

int 21h



pop dx ;输出关键词的位置,这里有点问题如果关键词的位置大于9即两位数,则要进行处理分别输出每一位(这里假设小于9)

add dl, 30H

mov ah, 02

int 21h

jmp quit



NoFind: ;未发现字符串

lea dx, newLine ;输出换行

mov ah, 09

int 21h

lea dx,msgNoFind

mov ah,09

int 21h



quit:
mov ah, 4ch

int 21h

code ends

end start




jxw1987628 2007-06-11
  • 打赏
  • 举报
回复
你那个程序能把比较后如果匹配,那么句子中与关键词的最后一个字符相等的位置是不是当前的di啊?
能否把di减去关键词的长度是不是就可以得到关键词在句子中的位置了啊?
dongyi940333 2007-06-10
  • 打赏
  • 举报
回复
这是我在书上看到查找子字符串的C代码,它的思路比我们想得要简单,明了,把它改成汇编:

#include <stdio.h>

#include <string.h>



//Function declare

int Strstr( char *s1, char *s2 );



int main()
{

char string[ 100 ] = { 0 }; //声明字符串数组

char substring[ 100 ] = { 0 }; //声明子字符串数组

int final_result = 0; //比较的最终结果



printf( "\nPlease input string: " );

gets( string );



printf( "\nPlease input the finding substring: " );

gets( substring );



final_result = Strstr( string, substring );



if( final_result > 0 )

{

printf( "The start position of substring '%s' is [%d]\n", substring, final_result );

}

else

{

printf( "The substring '%s' is not in the string\n", substring );

}







}



int Strstr( char *s1, char *s2 )
{

int i = 0;

int j = 0;

int endposition = 0;



endposition = strlen( s1 ) - strlen( s2 );



if( endposition > 0 )

{

for( i = 0 ; i <= endposition; i++ )

{

for( j = i; s1[ j ] == s2[ j - i ]; j++ )

{

if( s2[ j - i + 1 ] == '\0' )//子字符串结束

{

return i + 1;//返回子字符串出现的位置

}

}

}

}

return -1; //没有找到该子字符串
}
jxw1987628 2007-06-10
  • 打赏
  • 举报
回复
哦,不好意思,看错了,那如果我要把句子中的关键字的位置输出,那怎么办了,恩你的程序没有问题.
我的QQ:462511021.加我请说明"汇编",谢谢!!!!!!!!,楼上的
dongyi940333 2007-06-10
  • 打赏
  • 举报
回复
1:你能把你改的程序发上来吗?

2:哦,不是,
应该把字符串1( 实际输入句子)的长度减去字符串2(关键词)的长度送到循环控制记数器CX中
没明白

3:
你那个程序还有点毛病啊 ,
输入:xyzok
输入:skdncfxyz.
这样还是显示:
match
有点问题.

没有呀,我在我的机子上输出的是no match

jxw1987628 2007-06-10
  • 打赏
  • 举报
回复
你那个程序还有点毛病啊 ,
输入:xyzok
输入:skdncfxyz.
这样还是显示:
match
有点问题.
jxw1987628 2007-06-10
  • 打赏
  • 举报
回复
哦,不是,
应该把字符串1( 实际输入句子)的长度减去字符串2(关键词)的长度送到循环控制记数器CX中
jxw1987628 2007-06-10
  • 打赏
  • 举报
回复
谢谢这位兄弟,你是自学吗?我也是初学者,我把我的程序稍微改了一下,我看了一下你的那个,似乎复杂了点
不是可以直接用
mov cx,(zifuchuan1的长度,zifuchuan2的长度)
cmp "zifuchan1",zifuchan2")
就可以比较判断的吗?
谢谢你了,楼上的.................
100分归你的,我的 QQ:462511021,来信,请说明:汇编
dongyi940333 2007-06-08
  • 打赏
  • 举报
回复
你看一下这个;

.model small
.stack 4096


data segment

maxKey db 10

actualKey db ?

stringKey db 10 dup(?)

maxSen db 20

actualSen db ?

stringSen db 20 dup(?)

intputkey db 'Enter key word:',0dh,0ah,'$'

inputSen db 'Enter Sentence:',0dh,0ah,'$'

newLine db 0dh, 0ah, '$'

msgFind db 'Match.',13,10,'$'

msgNoFind db 'No match.',13,10,'$'

findTime db 0

IsRepeat db 0


data ends



code segment
assume cs:code,ds:data,es:data

start:

mov ax,data

mov ds,ax

mov es,ax ;必须初始化es寄存器


lea dx,intputkey ;输出输入关键字的提示字符

mov ah,09

int 21h



lea dx,maxkey ;输入关键字

mov ah,0ah

int 21h



lea dx, newLine ;输出换行

mov ah, 09

int 21h



lea dx,inputSen ;输出输入句子的提示字符

mov ah,09

int 21h



lea dx,maxSen ;输入句子

mov ah,0ah

int 21h



;思路:从关键词的第一个字符开始,与句子的每个字符依次比较,如果相等,则关键词的字符下移一个,长度为句子的长度结束条件1:关键词全部找到.2:句子到未尾表示没有找到

lea si, stringKey

lea di, stringSen

xor ch, ch

mov cl, actualSen ;输入句子的实际长度

mov bl, actualKey ;关键词的实际长度


l1:

mov al, [si] ;依次取出关键词字符

cmp al, [di] ;与句子的字符相比较

je l2 ;相等

jmp l3 ;不相等


l2: ;找到关键词中的字符

inc findTime

cmp bl, findTime ;判断关键词是否找完

je Find ;只要关键词循环完就表示找到

inc IsRepeat ;表示找到了关键词中的字符

inc si ;相等则将SI加1指向关键词的下一个字符

jmp l4


l3:

or IsRepeat, 0 ;判断flag是否大于1, 大于1则将关键词从第一个字符重新开始

jz l4 ;大于1则ZF=0

lea si, stringKey ;重新从关键词的第一个字符判断



l4:
inc di ;指向句子中的下一个字符

loop l1

jmp NoFind ;没有找到



Find: ;找到字符串

lea dx, newLine ;输出换行

mov ah, 09

int 21h

lea dx,msgFind

mov ah,09

int 21h

jmp quit



NoFind: ;未发现字符串

lea dx, newLine ;输出换行

mov ah, 09

int 21h

lea dx,msgNoFind

mov ah,09

int 21h



quit:
mov ah, 4ch

int 21h

code ends

end start

可是我总觉得的这个方法不是最好的,初学,不对之处请
hkbyest 2007-06-06
  • 打赏
  • 举报
回复
呵呵,在这里看到一个类似的。
http://community.csdn.net/Expert/topic/5578/5578499.xml?temp=6.557643E-03
dongyi940333 2007-06-06
  • 打赏
  • 举报
回复
2:还有好象你那个程序有9个错误

这个程序我在我的机子上试了一下没有错,WINDOWSXP+MASM6.15,你是不是没有把有汉字的地方改成注释.

3:还有,你的程序和我一样也很复杂,能简单一点的吗?
你的题义是输入一段关键词和一段句子,然后在句子中查找是否关键词出现,如果有就显示"Match"否则"NO match."

输入的部分你调用INT 21H的0A功能解觉了,对于关键词的查找,我是这样想的,用scasb指令找到关键词中第一个字符在句子出现的位置,然后判断关键词后面的字符是不是紧挨着第一个字符后面出现在句子中,这样就判断出关键词是不是在句子中.可是我总觉得的这个方法不是最好的.

我也是初学不对之处请谅解!!!!!!




dongyi940333 2007-06-06
  • 打赏
  • 举报
回复
1:

KEYBOARD STRUCT

maxInput DB 80

inputCount DB ?

buffer DB 80 DUP(?)

KEYBOARD ENDS

是一个结构,INT 21h功能的0AH从标准输入读取一个以回车结尾的字符串,如果调用了该功能,必须传递一个上面格式的输入结构(这是INTER汇编语言那本书上说的).这里也可以不这样写,以下是MASM6.15帮助文件中关于INT 21H 0A功能举的一个例子:

;* GetStr - Gets a string of up to 128 characters from the user. Since
;* this function uses the DOS input mechanism, it can use the DOS editing
;* keys or the keys of a DOS command-line editor if one is loaded.
;*
;* Shows: DOS Function - 0Ah (Buffered Keyboard Input)
;* Directive - EQU
;*
;* Params: Strbuf - Pointer to area where input string will be placed
;* Maxlen - Maximum length (up to 128 characters) of string
;*
;* Return: 0 if successful, 1 if error (Maxlen is too long)

.DATA
MAXSTR EQU 128
max BYTE MAXSTR
actual BYTE ?
string BYTE MAXSTR DUP (?)

.CODE
GetStr PROC USES si di,
Strbuf:PBYTE,
Maxlen:WORD

mov ax, 1 ; Assume error
mov cx, Maxlen ; Copy length to register

.IF (cx != 0) && (cx <= MAXSTR) ; Error if 0 or too long
mov max, cl ; Load maximum length
mov ah, 0Ah ; Request DOS Function 0Ah
mov dx, OFFSET max ; Load offset of string
int 21h ; Buffered Keyboard Input

mov bl, actual ; Put number of characters read
sub bh, bh ; in BX
mov string[bx], 0 ; Null-terminate string
mov cx, bx ; Put count in CX
inc cx ; Plus one for the null terminator

LoadPtr es, di, Strbuf ; ES:DI points to destination buffer
mov si, OFFSET string ; DS:SI points to source string
rep movsb ; Copy source to destination
sub ax, ax ; Return 0 for success
.ENDIF

ret

GetStr ENDP

END
jxw1987628 2007-06-06
  • 打赏
  • 举报
回复
还 有好象你那个程序有9个错误
jxw1987628 2007-06-06
  • 打赏
  • 举报
回复
还有,你的程序和我一样也很复杂,能简单一点的吗?
jxw1987628 2007-06-06
  • 打赏
  • 举报
回复
KEYBOARD STRUCT

maxInput DB 80

inputCount DB ?

buffer DB 80 DUP(?)

KEYBOARD ENDS
这个怎么貌视结构体啊,好象我还没有学啊,不大懂,请那个初学者解释,谢了,,,,,,,
dongyi940333 2007-06-05
  • 打赏
  • 举报
回复
;1:调用INT 10从标准输入读取一个以回车结尾的字符串,如果调用了该功能必须传递一个下面格式的输入结构(count可以在0-128之间)

;KEYBOARD STRUCT
; maxInput DB 80
; inputCount DB ?
; buffer DB 80 DUP(?)
;KEYBOARD ENDS
;接收参数:
; AH = 0AH
; DS:DX=键盘输入结构的地址

;返回值 以输入的字符填充该结构




.model small
.stack 4096


datarea segment
;key db 10 dup(0)
;dong db 50 dup(0)

KEYBOARD STRUCT

maxInput DB 80

inputCount DB ?

buffer DB 80 DUP(?)

KEYBOARD ENDS

donging1 db 'Enter key word:',13,10,'$'
mess1 db 'Match.',13,10,'$'
mess2 db 'No match.',13,10,'$'
donging2 db 'Enter Sentence:',13,10,'$'

kyData KEYBOARD <>

kysData KEYBOARD <>

datarea ends

code segment
assume cs:code,ds:datarea,es:datarea
start:

mov ax,datarea
mov ds,ax


lea dx,donging1 ;输出输入关键字的提示字符
mov ah,09
int 21h

lea dx,kyData ;输入关键字
mov ah,0ah
int 21h

lea dx,donging2 ;输出输入句子的提示字符
mov ah,09
int 21h

lea dx,kysData ;输入句子
mov ah,0ah
int 21h

lea si,kyData

lea di,kysData

mov cx,sizeof kysData.inputCount

cld

repne scasb ;这里应该用SCASB找到kyData第一个字节在kysData中出现的位置

jne matchmess ;没有找到

;这里还要判断关键词后面的字符是否与句子后面授字答相等,如果都相等,才算找到.
;我的想法是从kyData的第二个字节开始,依次与kysData相比较(kysData开始比较的位置是从kyData第一个字节在kysData中出现的位置后一个开始)
;可是我总是觉得这个办法不是最好的,有那位大侠能够提供一个更快的,谢谢

lea dx,mess2

mov ah,09

int 21h

jmp L1

matchmess:

lea dx,mess1

mov ah,09

int 21h

L1:
mov ah, 4ch

int 21h

code ends
end start

初学,不对之处请原谅

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧