首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

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

2012-12-14 
急求!!关于字符串问题!下面是一段字符串的查找与插入代码,求哪位大神改一下,实现字符串的查找与替换,感激

急求!!关于字符串问题!
下面是一段字符串的查找与插入代码,求哪位大神改一下,实现字符串的查找与替换,感激不尽啊!

Data Segment 
; DICTIONARY    字典字符串,首两个字节为 16 位无符号二进制数,说明字符串长度。
Dictionary DB00,16H,"add an book dad egg "
     DB100HDup(20H)      ; 空的缓冲区。
EnterWord     DB"Input the Word to Search :  ","$"
NotfindDB"Not Found, Now Insert it . ",0Ah,0Dh,"$"
NewDictDB0Ah,0Dh,"New Dictionary :  ","$"
FindDB0Ah,0Dh,"Found Word in Dictionary :  ","$"
PoSitionDB0Ah,0Dh,"PoSition :       ","$" 
DictLengthDB0Ah,0Dh,"New Dictionary Length :  ","$"
NewlineDB0Ah,0Dh,"$"
BufferDB10HDup(20H); Buffer 用于保存需要查询的单词。
WordlengthDB0H
        Space       EQU20H;默认的单词间隔为空格。
Data ends
Code Segment
AssumeCs:Code, Ds:Data
Start:
Mov Ax,Data
Mov DS,Ax
LeaBx,Buffer;把Buffer有效地址送Bx
Mov Dx,Offset EnterWord;把偏移地址送Dx通用寄存器
Mov Ah,09H       ;调用9号中断,输出MSG_IntRO
Int 21H
Getword:
; 获取用户输入的需要查找的单词字符串。
MovAh,01H
Int21H
CmpAL,0Dh; 输入以回车结束。
JeInputfinish;如果是回车,跳转输入结束
Mov[Bx],AL
IncBx        ;Bx加1,下一步修改字符长度
IncWordlength
JmpGetword
Inputfinish:
MovDx,Offset Newline;把偏移地址送Dx通用寄存器
MovAh,09H
Int21H
SubBx,Word ptr Wordlength
MovCx,00H
Mov      Si,02H
Search:
MovDl,[Bx];把输入的字符放到Dl
CmpDl,Dictionary[Si] ; 比较[Bx]和DICTIONARY[Si]内容是否匹配。
JeMatch; 结果匹配。
JNLNextword; 需要查找下一个单词。
JlUnmatchInsert; 找到了输入单词的插入位置,将要插入这个单词。
Match:
MovDl,Dictionary[Si+1]
CmpDl,Space; 如果DICTIONARY下一位字符为空格,查找成功。
JneNofound
     Jmp      Found
Nofound:
IncBx; 匹配了 1 位字符,继续比较下一位。
IncSi
IncCx; 匹配计数器增加一位。
JmpSearch
Nextword:
; 如果当前字典中的单词不匹配,Buffer 回到首地址,DICTIONARY[Si]到下一个单词。
SubBx,Cx; 将 Bx 恢复初始位置。
MovCx,0H; 匹配计数器 Cx 清零。
; 找到下一个单词的起始位置。
Toword:
MovDh,Dictionary[0]
MovDl,Dictionary[1]
IncDx
CmpDx,Si
JeInsertLast
MovDl,Dictionary[Si]
IncSi
CmpDl,Space
JneToword
Jmp Search; 新的匹配查找。
; 已经到了字典字符串的最后。
UnmatchInsert:
; 字典中的下一个单词比输入查询的单词"小",将在这个单词前面插入新单词。
; 将DICTIONARY[Si-Cx]后面的单词向后移动WORD_LENGTH字节,为新的单词空出。
; 最后修改串的长度。
MovAx,Si
SubAx,Cx
SubBx,Cx
MovDh,Dictionary[0]; 获得串长度。
MovDl,Dictionary[1]
MovSi,Dx; 从最后一个字符开始,向后移动字典字符串。
Rightmove:
DecSi
MovDl,Dictionary[Si]
AddSi,Word ptr WorDlength
IncSi
MovDictionary[Si],Dl
SubSi,Word ptr WorDlength
DecSi
CmpSi,Ax
JneRightmove
MovSi,Ax
MovCx,Word ptr Wordlength
; 在新的位置插入新单词。
Insert:
MovDl,[Bx]
MovDictionary[Si],Dl
IncBx
IncSi
LoopInsert
; 在新添加的单词后面补充一个空格。
MovDictionary[Si],Space
; 修改字符串长度。
MovDh,Dictionary[0]


MovDl,Dictionary[1]
AddDx,Word ptr Wordlength
MovDictionary[0],Dh
MovDictionary[1],Dl
ShowNewinsert:
; 显示插入新单词的位置和新的字符串。
MovDx,Offset Newline
MovAh,09H
Int21H
MovDx,Offset Notfind
MovAh,09H
Int21H
JmpShowDict
InsertLast:
; 在字典字符串的最后面插入新单词。
SubBx,Cx
DecSi
MovCx,Word ptr Wordlength
Insertword:
MovDl,[Bx]
MovDictionary[Si],Dl
IncBx
IncSi
LoopInsertword
; 在新添加的单词后面补充一个空格。
MovDictionary[Si],Space
; 修改字符串长度。
MovDh,Dictionary[0]
MovDl,Dictionary[1]
AddDx,WORD PTR Wordlength
MovDictionary[0],Dh
MovDictionary[1],Dl
JmpShownewinsert
Found:
; 如果新的单词和字典中的某一个单词前面部分相同,
; 新单词为: and ,字典里的单词为 an,则将新单词插入到 an 的后面。
MovDx,Word ptr Wordlength
DecDx
CmpCx,Dx
JeMatchNext
    Jmp       Nextword
; 显示找到的该单词在字典字符串中的位置。
MatchNext:
MovDx,Offset PoSition
MovAh,09H
Int21H
SubSi,Word ptr Wordlength
CallBINIDec
Mov Dx,Offset Find
Mov Ah,09H
Int 21H
MovCx,Word ptr Wordlength; Cx 用于循环输出匹配单元的信息计数器。
SubBx,Word ptr Wordlength; 循环 7 次,输出数据表中的信息。
Show:
IncBx
MovDl,[Bx]
Mov Ah,02H
Int21H
LoopShow
JmpQUIT
ShowDict:
; 显示新插入的单词在字典字符串中的位置。
MovDx,Offset PoSition
MovAh,09H
Int21H
SubSi,Word ptr Wordlength
DecSi
CallBINIDec
; 显示新的字典字符串长度。
MovDx,Offset DictLength
MovAh,09H
Int21H
MovDh,Dictionary[0]
MovDl,Dictionary[1]
SubDx,02H
MovSi,Dx
CallBiniDec
; 循环输出,显示新的字典字符串。
MovDx,Offset NewDict
MovAh,09H
Int21H
MovCH,Dictionary[0]
MovCL,Dictionary[1]
MovSi,02H
RT:
MovDl,Dictionary[Si]
IncSi
MovAh,02H
Int21H
LoopRT
Quit:
MovAh,4CH; Return to DOS.
Int21H
; BINIDec 子程序,将 Si 寄存器中的数据转化为十进制数字输出在屏幕上。
BiniDecProcNear
MovCx,100D
CallDecDiv
MovCx,10D
CallDecDiv
MovCx,1D
CallDecDiv
Ret
DecDivProcNear
MovAx,Si
MovDx,0
DivCx
MovSi,Dx
MovDl,AL
AddDl,30H
MovAh,2H
Int21H
Ret
DecDivEndp
BiniDecEndp
Code Ends
End  Start

[最优解释]


Data Segment 
; DICTIONARY    字典字符串,首两个字节为 16 位无符号二进制数,说明字符串长度。
Dictionary DB00,16H,"add an book dad egg "
     DB100HDup(20H)      ; 空的缓冲区。
EnterWord      DB"Input the Word to Search :  ","$"
Notfind DB"Not Found, Now Insert it . ",0Ah,0Dh,"$"
NewDict DB0Ah,0Dh,"New Dictionary :  ","$"
Find DB0Ah,0Dh,"Found Word in Dictionary :  ","$"
PoSition DB0Ah,0Dh,"PoSition :       ","$" 
DictLengthDB0Ah,0Dh,"New Dictionary Length :  ","$"
Newline DB0Ah,0Dh,"$"
Buffer DB10HDup(20H) ; Buffer 用于保存需要查询的单词。


Wordlength DB0H
        Space       EQU20H ;默认的单词间隔为空格。
Data ends
Code Segment
AssumeCs:Code, Ds:Data
Start:
Mov Ax,Data
Mov DS,Ax
LeaBx,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
LoopInsert
; 在新添加的单词后面补充一个空格。
Mov Dictionary[Si],Space
; 修改字符串长度。
Mov Dh,Dictionary[0]
Mov Dl,Dictionary[1]
Add Dx,Word ptr Wordlength
Mov Dictionary[0],Dh
Mov Dictionary[1],Dl
ShowNewinsert:
; 显示插入新单词的位置和新的字符串。
Mov Dx,Offset Newline
Mov Ah,09H
Int 21H
Mov Dx,Offset Notfind
Mov Ah,09H
Int 21H
Jmp ShowDict
InsertLast:
; 在字典字符串的最后面插入新单词。
Sub Bx,Cx
Dec Si
Mov Cx,Word ptr Wordlength
Insertword:
Mov Dl,[Bx]
Mov Dictionary[Si],Dl
Inc Bx
Inc Si
LoopInsertword
; 在新添加的单词后面补充一个空格。
Mov Dictionary[Si],Space
; 修改字符串长度。
Mov Dh,Dictionary[0]
Mov Dl,Dictionary[1]


Add Dx,WORD PTR Wordlength
Mov Dictionary[0],Dh
Mov Dictionary[1],Dl
Jmp ShowNewinsert
Found:
; 如果新的单词和字典中的某一个单词前面部分相同,
; 新单词为: and ,字典里的单词为 an,则将新单词插入到 an 的后面。
Mov Dx,Word ptr Wordlength
Dec Dx
Cmp Cx,Dx
Je MatchNext
    Jmp       Nextword
; 显示找到的该单词在字典字符串中的位置。
MatchNext:
Mov Dx,Offset PoSition
Mov Ah,09H
Int 21H
Sub Si,Word ptr Wordlength
CallBiniDec
Mov Dx,Offset Find
Mov Ah,09H
Int 21H
Mov Cx,Word ptr Wordlength; Cx 用于循环输出匹配单元的信息计数器。
Sub Bx,Word ptr Wordlength ; 循环 7 次,输出数据表中的信息。
Show:
Inc Bx
Mov Dl,[Bx]
Mov Ah,02H
Int 21H
LoopShow
Jmp Quit
ShowDict:
; 显示新插入的单词在字典字符串中的位置。
Mov Dx,Offset PoSition
Mov Ah,09H
Int 21H
Sub Si,Word ptr Wordlength
Dec Si
Call BiniDec
; 显示新的字典字符串长度。
Mov Dx,Offset DictLength
Mov Ah,09H
Int 21H
Mov Dh,Dictionary[0]
Mov Dl,Dictionary[1]
Sub Dx,02H
Mov Si,Dx
Call BiniDec
; 循环输出,显示新的字典字符串。
Mov Dx,Offset NewDict
Mov Ah,09H
Int 21H
Mov CH,Dictionary[0]
Mov CL,Dictionary[1]
Mov Si,02H
RT:
Mov Dl,Dictionary[Si]
Inc Si
Mov Ah,02H
Int 21H
LoopRT
Quit:
Mov Ah,4CH ; Return to DOS.
Int 21H
; BINIDec 子程序,将 Si 寄存器中的数据转化为十进制数字输出在屏幕上。
BiniDecProcNear
Mov Cx,100D
CallDecDiv
Mov Cx,10D
CallDecDiv
Mov Cx,1D
CallDecDiv
Ret
DecDivProcNear
Mov Ax,Si
Mov Dx,0
Div Cx
Mov Si,Dx
Mov Dl,AL
Add Dl,30H
Mov Ah,2H
Int 21H
Ret
DecDivEndp
BiniDecEndp
Code Ends
End  Start



是不是这个效果?
[其他解释]
?可以可以的
[其他解释]
你想要怎么替换法?

热点排行