| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1172 人关注过本帖
标题:用汇编语言实现模式算法
只看楼主 加入收藏
nicmaters
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-12-29
收藏
 问题点数:0 回复次数:13 
用汇编语言实现模式算法
高手帮忙下啊

给个程序过来!!谢谢了

[此贴子已经被作者于2007-1-6 22:25:50编辑过]

搜索更多相关主题的帖子: 汇编语言 算法 模式 
2006-12-29 16:03
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
那你知道KMP算法吗?按照C语言的模式改成汇编就可以

2006-12-29 19:13
nicmaters
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-12-29
收藏
得分:0 
不会啊,大侠,我对这个不懂,但是要交的啊,你给我编个程序啊,谢谢了

2006-12-29 23:08
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
那给出KMP的C语言算法,我跟你改改

2006-12-30 12:13
nicmaters
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-12-29
收藏
得分:0 


#include "stdafx.h"
#include "iostream.h"
#include "stdio.h"
#define Null 0

//定义串的链存储结构
typedef struct Chuck{
char ch;
struct Chuck *next;
}Chuck;

typedef struct {
Chuck *head,*tail;
int length;
}Hstring;

void init_Hstring(Hstring &T);
//删除pos结点后面length长度的字符串
void delete_pos(Hstring &S,Chuck *pos,int length);
//pos结点后面插入length长度的字符串
void insert_pos(Hstring &S,Chuck *pos,int length);

//模式匹配
int Index_KMP(Hstring &S,Hstring &T,int pos);
void get_next(Hstring &T,int next[]);

void init_Hstring(Hstring &T){
T.head=T.tail =new Chuck;
T.head->next =Null;
T.length =0;
}

void delete_pos(Hstring &S,Chuck *pos,int length){
Chuck *p,*q;
p=S.head ;
while(p->next !=pos)
p=p->next;
q=p;
for(int i=0;i<length;i++)
p=p->next ;

S.length-=length;
}

int Index_KMP(Hstring &S,Hstring &T,int pos){
int i=pos,j=1;
int next[51];

get_next(T,next);
while(i<=S.length&&j<=T.length){
if(j==0||S.ch[i]==T.ch[j]){
++i;++j;
}
else
j=next[j];
}
if(j>T.length) return i-T.length;
else return 0;
}

void get_next(Hstring &T,int next[]){
int i=1,j=0;
next[1]=0;
while(i<T.length){
if(j==0||T.ch[i]==T.ch[j]){
++i;++j;next[i]=j;
}
else
j=next[j];
}
}

int main(int argc, char* argv[])
{
Hstring S,T;
char *p="Please Input ";
char *q="Error: S.length<T.length";
int pos=1,tag;
init_Hstring(S);
init_Hstring(T);
cout<<p<<"S:"<<endl; //endl,强制输出
for(int k=1;(S.ch[k]=getchar())!='\n';k++);
S.ch[k]='\0';
S.length=k-1;
cout<<p<<"T:"<<endl;
for(k=1;(T.ch[k]=getchar())!='\n';k++);
T.ch[k]='\0';
T.length=k-1;

if(S.length>=T.length)
while(pos<=S.length-T.length+1){
tag=Index_KMP(S,T,pos);
if(!tag)
break;
else
{delete_pos(S,tag,T.length);
pos=1;}
}

else
{cout<<q<<endl;return 0;}

//输出结果
for(k=1;S.ch[k]!='\0';k++)
cout<<S.ch[k]<<" ";
cout<<endl;
return 0;
}


2006-12-30 19:18
nicmaters
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-12-29
收藏
得分:0 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>

#define MAX_LEN_OF_STR 30 // 字符串的最大长度

typedef struct String // 这里需要的字符串数组,存放字符串及其长度
{
char str[MAX_LEN_OF_STR]; // 字符数组
int length; // 字符串的实际长度
}String, *PString;

// 得到字符串的next数组
void GetNextArray(PString pstr, int next[])
{
assert(NULL != pstr);
assert(NULL != next);
assert(pstr->length > 0);

// 第一个字符的next值是-1,因为C中的数组是从0开始的
next[0] = -1;
for (int i = 0, j = -1; i < pstr->length - 1; )
{
// i是主串的游标,j是模式串的游标
// 这里的主串和模式串都是同一个字符串
if (-1 == j || // 如果模式串游标已经回退到第一个字符
pstr->str[i] == pstr->str[j]) // 如果匹配成功
{
// 两个游标都向前走一步
++i;
++j;
// 存放当前的next值为此时模式串的游标值
next[i] = j;
}
else // 匹配不成功j就回退到上一个next值
{
j = next[j];
}
}
}

// KMP字符串模式匹配算法
// 输入: S是主串,T是模式串,pos是S中的起始位置
// 输出: 如果匹配成功返回起始位置,否则返回-1
int KMP(PString S, PString T, int pos)
{
assert(NULL != S);
assert(NULL != T);
assert(pos >= 0);
assert(pos < S->length);

if (S->length < T->length)
return -1;

printf("主串\t = %s\n", S->str);
printf("模式串\t = %s\n", T->str);

int *next = (int *)malloc(T->length * sizeof(int));
// 得到模式串的next数组
GetNextArray(T, next);

int i, j;
for (i = pos, j = 0; i < S->length && j < T->length; )
{
// i是主串游标,j是模式串游标
if (-1 == j || // 模式串游标已经回退到第一个位置
S->str[i] == T->str[j]) // 当前字符匹配成功
{
// 满足以上两种情况时两个游标都要向前进一步
++i;
++j;
}
else // 匹配不成功,模式串游标回退到当前字符的next值
{
j = next[j];
}
}

free(next);

if (j >= T->length)
{
// 匹配成功
return i - T->length;
}
else
{
// 匹配不成功
return -1;
}
}


2006-12-30 19:20
nicmaters
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-12-29
收藏
得分:0 
上面两个你觉得哪个好改就改改吧
谢谢啦

2006-12-30 19:21
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 

.model small
.386
option casemap:none

data segment
i dw 0
j dw -1
next dw 30 dup(0)
success db 'Success!$'
fail db 'Failed!$'
data ends

String struc
len dw 0
str db 30 dup('')
String ends

code segment use16 ;这里加上use16非常重要,如果不加则无法显示结果
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
String S <>
String T <>
call KMP
mov ah,4ch
int 21h

KMP proc far
push si
push di
push bx
push ax
push cx
push dx
cmp S.len,T.len
jl rettt
call GetNextArray
call getchar
mov byte ptr di,al
mov si,0
next1:
cmp di,S.len
jl loop4
jmp rettt
loop4:
cmp si,T.len
jl loop5
jmp rettt
loop5:
cmp si,-1
jnz loop6
loop6:
cmp S.str[di],T.str[si]
jnz loop7
jmp loop8
loop7:
mov si,next[si]
jmp next1
loop8:
inc di
inc si
jmp next1
rettt:
cmp si,T.len
jge ret1
mov dx,offset fail
mov ah,09h
int 21h
ret1:
mov dx,offset success
mov ah,09h
int 21h

pop si
pop di
pop bx
pop ax
pop cx
pop dx
ret
KMP endp

GetNextArray proc far
push si
push di
push bx
push ax
push cx
push dx
mov di,0
mov si,-1
mov next[di],-1
next:
cmp di,T.len-1
jge rett
cmp si,-1
jnz loop2
loop2:
cmp T.str[di],T.str[si]
jnz loop3
jmp loop1
loop3:
mov si,next[si]
jmp next
loop1:
inc di
inc si
mov next[di],si
jmp next
rett:
pop si
pop di
pop bx
pop ax
pop cx
pop dx
ret
GetNextArray endp

getchar proc
mov ah,02h
int 21h
sub 30h
ret
getchar endp
code ends
end start

按照第二个改了下,可能存在很多错误,可以编译通过,接下来的任务就是你自己去改了,输入字符串你自己弄吧


2006-12-30 21:19
nicmaters
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-12-29
收藏
得分:0 
[IMG]http://cn.pg.photos.yahoo.com/ph/ysnicmaters/detail_hires?.dir=/26c9&.dnm=3370cnb.jpg[/IMG]

没有办法啊,啥都不懂,一运行就成这样了,二十多个错,问同学都问不来,哎~~

2006-12-31 01:46
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
看不到什么错,如果编译器版本不同,可能会出错

2006-12-31 11:51
快速回复:用汇编语言实现模式算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

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