当前位置: 代码迷 >> 汇编语言 >> 急求!关于字符串有关问题
  详细解决方案

急求!关于字符串有关问题

热度:5188   发布时间:2013-02-26 00:00:00.0
急求!!关于字符串问题!
下面是一段字符串的查找与插入代码,求哪位大神改一下,实现字符串的查找与替换,感激不尽啊!

Data Segment 
; DICTIONARY    字典字符串,首两个字节为 16 位无符号二进制数,说明字符串长度。
Dictionary   DB 00,16H,"add an book dad egg "
     DB 100H Dup(20H)       ; 空的缓冲区。
EnterWord      DB "Input the Word to Search :  ","$"
Notfind DB "Not Found, Now Insert it . ",0Ah,0Dh,"$"
NewDict DB 0Ah,0Dh,"New Dictionary :  ","$"
Find DB 0Ah,0Dh,"Found Word in Dictionary :  ","$"
PoSition DB 0Ah,0Dh,"PoSition :       ","$" 
DictLength DB 0Ah,0Dh,"New Dictionary Length :  ","$"
Newline DB 0Ah,0Dh,"$"
Buffer DB 10H Dup(20H) ; Buffer 用于保存需要查询的单词。
Wordlength DB 0H
        Space        EQU 20H ;默认的单词间隔为空格。
Data ends
Code Segment
Assume Cs:Code, Ds:Data
Start:
Mov  Ax,Data
Mov  DS,Ax
Lea Bx,Buffer;把Buffer有效地址送Bx
Mov  Dx,Offset EnterWord ;把偏移地址送Dx通用寄存器
Mov  Ah,09H       ;调用9号中断,输出MSG_IntRO
Int  21H
Getword:
; 获取用户输入的需要查找的单词字符串。
Mov Ah,01H
Int 21H
Cmp AL,0Dh ; 输入以回车结束。
Je Inputfinish ;如果是回车,跳转输入结束
Mov [Bx],AL
Inc Bx         ;Bx加1,下一步修改字符长度
Inc Wordlength
Jmp Getword
Inputfinish:
Mov Dx,Offset Newline ;把偏移地址送Dx通用寄存器
Mov Ah,09H
Int 21H
Sub Bx,Word ptr Wordlength
Mov Cx,00H
Mov       Si,02H
Search:
Mov Dl,[Bx] ;把输入的字符放到Dl
Cmp Dl,Dictionary[Si]  ; 比较[Bx]和DICTIONARY[Si]内容是否匹配。
Je Match ; 结果匹配。
JNL Nextword ; 需要查找下一个单词。
Jl UnmatchInsert ; 找到了输入单词的插入位置,将要插入这个单词。
Match:
Mov Dl,Dictionary[Si+1]
Cmp Dl,Space ; 如果DICTIONARY下一位字符为空格,查找成功。
Jne Nofound
     Jmp      Found
Nofound:
Inc Bx ; 匹配了 1 位字符,继续比较下一位。
Inc Si
Inc Cx ; 匹配计数器增加一位。
Jmp Search
Nextword:
; 如果当前字典中的单词不匹配,Buffer 回到首地址,DICTIONARY[Si]到下一个单词。
Sub Bx,Cx ; 将 Bx 恢复初始位置。
Mov Cx,0H ; 匹配计数器 Cx 清零。
; 找到下一个单词的起始位置。
Toword:
Mov Dh,Dictionary[0]
Mov Dl,Dictionary[1]
Inc Dx
Cmp Dx,Si
Je InsertLast
Mov Dl,Dictionary[Si]
Inc Si
Cmp Dl,Space
Jne Toword
Jmp   Search ; 新的匹配查找。
; 已经到了字典字符串的最后。
UnmatchInsert:
; 字典中的下一个单词比输入查询的单词"小",将在这个单词前面插入新单词。
; 将DICTIONARY[Si-Cx]后面的单词向后移动WORD_LENGTH字节,为新的单词空出。
; 最后修改串的长度。
Mov Ax,Si
Sub Ax,Cx
Sub Bx,Cx
Mov Dh,Dictionary[0] ; 获得串长度。
Mov Dl,Dictionary[1]
Mov Si,Dx ; 从最后一个字符开始,向后移动字典字符串。
Rightmove:
Dec Si
Mov Dl,Dictionary[Si]
Add Si,Word ptr WorDlength
Inc Si
Mov Dictionary[Si],Dl
Sub Si,Word ptr WorDlength
Dec Si
Cmp Si,Ax
Jne Rightmove
Mov Si,Ax
Mov Cx,Word ptr Wordlength
; 在新的位置插入新单词。
Insert:
Mov Dl,[Bx]
Mov Dictionary[Si],Dl
Inc Bx
Inc Si
Loop Insert
; 在新添加的单词后面补充一个空格。
Mov Dictionary[Si],Space
; 修改字符串长度。
Mov Dh,Dictionary[0]
  相关解决方案