字符串的查找与替换汇编实现
- 格式:doc
- 大小:227.50 KB
- 文档页数:16
VBA中常用的字符串匹配和替换方法在VBA中,字符串匹配和替换是常见的操作,可以帮助我们实现对文本的处理和转换。
本文将介绍VBA中常用的字符串匹配和替换方法,帮助读者更好地应用这些技巧。
在VBA中,实现字符串匹配和替换有多种方式,取决于我们的需求和具体的情况。
下面将介绍一些常用的方法。
1. 使用InStr函数进行字符串匹配InStr函数用于在一个字符串中查找子字符串的位置。
它返回子字符串在主字符串中第一次出现的位置。
我们可以利用这个函数来判断一个字符串是否包含某个特定的子字符串。
例如,我们可以使用以下代码来判断一个字符串变量str1是否包含子字符串"abc":```If InStr(str1, "abc") > 0 Then' 字符串包含子字符串"abc"Else' 字符串不包含子字符串"abc"End If```2. 使用Replace函数进行字符串替换Replace函数用于将一个字符串中的某个子字符串替换为另一个字符串。
它接受三个参数:原始字符串、被替换的子字符串和替换的字符串。
以下是一个简单的示例:```Dim str2 As Stringstr2 = "Hello, World!"str2 = Replace(str2, "Hello", "Hi")' 将"Hello"替换为"Hi"```在替换过程中,VBA会从左到右依次匹配并替换每一个子字符串。
如果替换的子字符串在原始字符串中出现多次,那么所有的匹配都会被替换。
需要注意的是,Replace函数是区分大小写的。
如果需要进行不区分大小写的替换,可以使用StrComp函数进行比较。
3. 使用Regular Expressions对象进行正则表达式匹配VBA中的正则表达式匹配可以使用Regular Expressions对象实现。
python之字符串查找与替换任务描述在大家日常工作使用Word编写文档的过程中,经常会遇到的一个问题是:发现前面写的文档中某个词用错了,需要换为另外一个词来表达。
Word提供了全文查找与替换的功能,可以帮助用户很方便的处理这一问题。
那么,这一功能最基础和核心的字符替换,如果我们要自己基于Python来实现,该怎么做呢?本关的任务是,给定一个字符串,要利用Python提供的字符串处理方法,从该字符串中查找特定的词汇,并将其替换为另外一个更合适的词。
例如,给定一个字符串Where there are a will, there are a way,我们发现这句话中存在语法错误,其中are应该为is,需要通过字符串替换将其转换为Where there is a will, there is a way.相关知识本关的小目标是让读者学习并掌握Python中常用的字符串方法,包括字符串查找、字符串切分、字符串替换等。
字符串查找Python提供了内置的字符串查找方法find(),利用该方法可以在一个较长的字符串中查找子字符串。
如果该字符串中有一个或者多个子字符串,则该方法返回第一个子串所在位置的最左端索引;若没有找到符合条件的子串,则返回-1。
find()方法的基本使用语法如下:1.source_string.find(sub_string)其中,•source_string:源字符串•sub_string:待查的目标子字符串•find:字符串查找方法的语法关键字例如,在一个字符串中查找两个单词的位置:1.# coding=utf-82.3.# 创建一个字符串4.source_string = 'The past is gone and static'5.6.# 查看'past'在source_string字符串中的位置7.print(source_string.find('past'))8.9.# 查看'love'在source_string字符串中的位置10.print(source_string.find('love'))输出结果:4-1字符串替换Python提供了replace()方法,用以替换给定字符串中的子串,其基本使用语法如下:1.source_string.replace(old_string, new_string)其中,•source_string:待处理的源字符串•old_string:被替换的旧字符串•new_string:替换的新字符串•replace:字符串替换方法的语法关键词例如,在如下字符串中用small子串替换big子串1.# coding = utf-82.3.# 创建一个字符串circle4.source_string = 'The world is big'5.6.# 利用replace()方法用子串'small'代替子串'big'7.print(source_string.replace('big','small'))输出结果:The world is small字符串分割Python提供了split()方法实现字符串分割。
VBA中字符串搜索与替换的高级方法在VBA编程中,字符串搜索与替换是一个非常常见的任务。
在处理数据和文本时,我们经常需要对字符串进行一系列操作,如查找特定的单词或字符,并将其替换为其他内容。
在本文中,我将介绍几种VBA中字符串搜索与替换的高级方法,以帮助您更有效地处理这些操作。
一、使用InStr函数进行搜索InStr函数是VBA中用于查找一个字符串在另一个字符串中的位置的函数。
它的用法如下:position = InStr(start, str1, str2, compare)其中,start为搜索起始位置,str1为要搜索的字符串,str2为要查找的子字符串,compare为比较模式。
如果找到了子字符串,InStr函数将返回其在主字符串中的位置,并且搜索将从该位置继续进行。
如果未找到子字符串,函数将返回0。
我们可以使用InStr函数来查找字符串中的特定单词或字符,并在需要时进行替换。
以下是一个示例:```vbaSub SearchAndReplace()Dim mainStr As StringDim searchStr As StringDim replaceStr As StringDim startPosition As LongmainStr = "This is a sample string."searchStr = "sample"replaceStr = "example"' 查找子字符串的位置startPosition = InStr(1, mainStr, searchStr, vbTextCompare)' 如果找到子字符串,则进行替换If startPosition > 0 ThenmainStr = Left(mainStr, startPosition - 1) & replaceStr & Mid(mainStr, startPosition + Len(searchStr))End If' 输出替换后的字符串Debug.Print mainStrEnd Sub```在上面的代码中,我们将字符串"This is a sample string."中的"sample"替换为"example"。
精选10个汇编语言程序案例集摘要:一、汇编语言简介二、案例1:简单算术运算三、案例2:字符串处理四、案例3:逻辑与关系运算五、案例4:循环与条件语句六、案例5:函数调用与参数传递七、案例6:数组与指针操作八、案例7:内存管理九、案例8:输入输出操作十、案例9:操作系统调用十一、案例10:网络编程十二、总结与拓展正文:一、汇编语言简介汇编语言是一种低级编程语言,它与计算机硬件的操作紧密相关。
汇编语言通过对计算机指令进行汇编,实现对计算机资源的控制。
下面将介绍10个汇编语言程序案例。
二、案例1:简单算术运算案例1是一个实现加减乘除算术运算的汇编程序。
通过编写相应的汇编指令,实现对两个整数的加减乘除操作。
三、案例2:字符串处理案例2是一个处理字符串的汇编程序。
通过汇编指令实现字符串的输入、输出、查找、替换等功能。
四、案例3:逻辑与关系运算案例3是一个处理逻辑与关系运算的汇编程序。
通过汇编指令实现逻辑与、逻辑或、逻辑非以及关系运算。
五、案例4:循环与条件语句案例4是一个处理循环与条件语句的汇编程序。
通过汇编指令实现for、while、if-else等循环与条件控制结构。
六、案例5:函数调用与参数传递案例5是一个处理函数调用与参数传递的汇编程序。
通过汇编指令实现函数调用,以及将参数传递给函数。
七、案例6:数组与指针操作案例6是一个处理数组与指针操作的汇编程序。
通过汇编指令实现数组的创建、访问、排序等操作,以及指针的运算与控制。
八、案例7:内存管理案例7是一个处理内存管理的汇编程序。
通过汇编指令实现内存的分配、释放、拷贝等操作。
九、案例8:输入输出操作案例8是一个处理输入输出操作的汇编程序。
通过汇编指令实现键盘输入、显示输出等功能。
十、案例9:操作系统调用案例9是一个处理操作系统调用的汇编程序。
通过汇编指令实现操作系统提供的功能,如文件操作、进程管理等。
十一、案例10:网络编程案例10是一个处理网络编程的汇编程序。
VBA中的文本查找与替换技巧与方法VBA(Visual Basic for Applications)是微软开发的一种宏编程语言,广泛应用于Microsoft Office套件中的各种应用程序,如Excel、Word和PowerPoint等。
对于处理大量文本数据的任务,VBA提供了强大的查找与替换功能,可以帮助用户在文本中快速定位和修改特定内容。
本文将介绍一些常用的VBA中文本查找与替换的技巧与方法。
一、基本的文本查找功能VBA提供了`InStr`函数用于在给定字符串中查找特定的文本内容。
该函数的语法如下:```InStr([start], string1, string2[, compare])```其中,`start`表示查找的起始位置,默认为1;`string1`表示要进行查找的字符串;`string2`是要查找的目标字符串;`compare`是可选参数,指定查找时是否区分大小写(0表示不区分,1表示区分)。
例如,下面的代码演示了如何在字符串中查找特定的文本内容,并输出其位置:```vbaSub FindText()Dim myString As StringDim searchStr As StringDim pos As IntegermyString = "Hello, world! This is a text string."searchStr = "text"pos = InStr(1, myString, searchStr)If pos > 0 ThenMsgBox "The string was found at position: " & posElseMsgBox "The string was not found."End IfEnd Sub```运行上述代码,将会弹出一个消息框,显示目标字符串的位置。
汇编实验二查找匹配字符串YKK standardization office【 YKK5AB- YKK08- YKK2C- YKK18】实验三查找匹配字符串1.实验目的:查找匹配字符串SEARCH。
2. 实验要求:程序接收用户键入的一个关键字以及一个句子。
如果句子中不包含关键字则显示“No match!”;如果句子中包含关键字则显示“Match!”,且把该句子中的位置用十六进制数显示出来。
实验结果:要求程序的执行过程如下:Enter keyword:abcEnter Sentence: We are studying abc.Match at location:11H of the sentence.Enter Sentence: xyz, Ok?No match.Enter Sentence: ^C3. 实验报告要求:(1)分析要点及调试后的正确程序。
(2) 实验体会。
源代码:DATAREA SEGMENTSTRING1 DB "Enter keyword:$"STRING2 DB "Enter sentence:$"STRING3 DB "Match at location:$"STRING4 DB "No match!",13,10,"$"STRING5 DB "H of the sentence.$" keyword DB 50D,?,51D DUP(?) sentence DB 50D,?,51D DUP(?) DATAREA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATAREA,ES:DATAREA START:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAREAMOV DS,AXMOV ES,AXLEA DX,STRING1MOV AH,09HINT 21HLEA DX,keywordMOV AH,0AHINT 21HMOV AH ,02HMOV DL,0AHINT 21HLEA DX,STRING2MOV AH,09HINT 21HLEA DX,sentenceMOV AH,0AHINT 21HMOV AH,02HMOV DL,0AHINT 21HLEA SI,keyword+2 ;关键词LEA DI,sentence+2MOV AX,0MOV AL,[sentence+1] ;句子字符个数MOV AH,[keyword+1] ;关键词字符个数CMP AL,AHJL NOSUB AL,AHMOV AH,0MOV CX,AXINC CXCOMPARE:PUSH CXMOV CX,3 ;建议采用mov ax,字符个数,使字符的个数不固定CLDREPZ CMPSBJZ MATCHMOV AX,3 ;建议采用mov ax,字符个数SUB AX,CXSUB SI,AX ;关键词回到词首MOV AX,2 ;建议采用mov ax,字符个数-1SUB AX,CXSUB DI,AXPOP CXLOOP COMPARENO: LEA DX,STRING4MOV AH,09HINT 21HJMP EXITMATCH: POP CXMOV BX,DILEA DX,STRING3MOV AH,09HINT 21HSUB BX,OFFSET sentence+2SUB BX,2 ;首地址所在字符串中的地址CALL CHANGELEA DX,STRING5MOV AH,09HINT 21HEXIT:RETMAIN ENDPCHANGE PROC NEAR PUSH AXPUSH BXPUSH CXPUSH DXMOV CH,4MOV CL,4 ROTATE: ROL BX,CL MOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7H PRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATEPOP DXPOP CXPOP BXPOP AXRETCHANGE ENDP CODE ENDSEND START。
汇编语言实验二查找匹配字符串一、目的查找匹配字符串SEARCH二、实验内容程序接收用户键入的一个关键字以及一个句子。
如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。
流程图三、设计和编码DATA SEGMENTmess1 DB 'Enter keyword:','$'mess2 DB 'Enter Sentence:','$'mess3 DB 'Match at location:','$'mess4 DB 'NOT MATCH.',13,10,'$'mess5 DB 'H if the sentence',13,10,'$' N YY Y输入关键字结束关键字长度=0输入句子句子长度<关键字长度Y保存关键字长度到cx ,cx 入栈,保存总循环次数(句子长度-关键字长度+1)到al ,将句子的首地址放进bx(作为基址寄存器) si=di=0(变址寄存器)开始比较[bx+di]与[si]是否相等si+1,di+1,cx-1(同时指向下一个字符)YN bx+1(句子指向下一个字符) cx 出栈,再入栈,si,di 清零,al-1 cx 是否为0N 匹配完成,调用子程序输出al 是否为0 不匹配,输出change DB 13,10,'$'stoknin1 label bytemax1 db 10act1 db?stokn1 db 10 dup(?)stoknin2 label bytemax2 db 50act2 db?stokn2 db 50 dup(?)DATA ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODE SEGMENT;*************************************代码段main proc farassume cs:code,ds:data,es:dataSTART:push dssub AX,AXsub BX,BXsub DI,DIsub SI,SIpush AX ;为返回dos并清空后面要用到的寄存器MOV AX,DATAMOV DS,AXLEA DX,mess1MOV ah,09INT 21h ;输出Enter keywordLEA DX,stoknin1MOV ah,0ah ;用21号中段的0ah号功能获取关键字INT 21hcmp act1,0je exit ;如果为空直接退出程序a10:;********************************输入Sentence并判断LEA DX,changeMOV ah,09INT 21h ;输出回程,换行LEA DX,mess2MOV ah,09INT 21h ;输出Enter Sentence:LEA DX,stoknin2MOV ah,0ahINT 21h ;用21号中段的0ah号功能获取句子MOV AL,act1CBWMOV CX,AX ;保存关键字长度到cxPUSH CX ;cx入栈MOV AL,act2cmp AL,0je a50 ;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1js a50 ;若句子长度小于关键字长度,则跳转显示not match INC ALCBWLEA BX,stokn2 ;将句子的首地址放进BXMOV DI,0MOV SI,0a20:;****************************************比较,内循环MOV AH,[BX+DI]CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30jne a30INC DIINC SIDEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完CMP CX,0je a40jmp a20a30:;*****************************************外循环,BX+1,清空si,di继续内循环比较INC BXDEC ALcmp AL,0je a50MOV DI,0MOV SI,0POP CXpush CXjmp a20a40:;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出SUB BX,offset stokn2INC BXLEA DX,changeMOV ah,09INT 21hLEA DX,mess3MOV ah,09INT 21hCALL btohLEA DX,mess5MOV ah,09INT 21hjmp a10;****************************************二进制转换十六进制btoh PROC NEARMOV CH,4rotate: MOV CL,4ROL BX,CLMOV AL,BLand AL,0fhadd AL,30hcmp al,3ahjl printitadd al,7hprintit:MOV dl,alMOV ah,2int 21hdec chjnz rotateretbtoh endpa50:;*****************************************显示not matchLEA DX,changeMOV ah,09INT 21hLEA DX,mess4MOV ah,09INT 21hjmp a10exit:retmain endpCODE ENDSEND START 四、运行结果及分析五、实验小结六、附录(选)。
汇编语⾔实现在指定字符串中搜索字符A的⽅法我也不知道我以前怎么会写这种东西的,留个纪念…;⽤串操作指令设计程序,实现在指定字符串中搜索字符‘A',;若该字条串中有字符'A',;则将第⼀个'A'字符在该字符串中的位置记录在BX寄存器中,;若不包含,则使BX=0FFFFH。
;在程序开始查找指定字符前要求在屏幕上输出提⽰信息:;The program is running!查找结束后输出信息:the program is over!DATAS SEGMENTSTRING DB 'CDAFX246hk'NO DW 10FALSE DW 0FFFFHSTR1 DB 'The program is running!$'STR2 DB 0DH,0AH,'The program is over!$'DATAS ENDSSTACKS SEGMENTDW 20 DUP(?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV ES,AXLEA DX,STR1MOV AH,09HINT 21HMOV BX,FALSELEA DI,STRINGMOV AL,'A'MOV CX,NOREPNE SCASBCMP CX,0JE COUNTDEC DIMOV BX,DICOUNT:LEA DX,STR2MOV AH,09HINT 21HMOV AH,4CHINT 21HCODES ENDSEND START以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
WordVBA教程:查找并替换文字或格式通过Find和Replacement对象可实现查找和替换功能。
Selection和Range对象可以使用 Find对象。
从 Selection 或 Range 对象访问 Find对象时,查找操作会略有不同。
查找并选定文字如果从 Selection对象访问 Find对象,当找到搜索条件时,就会更改所选内容。
下列示例选定下一个出现的“Hello”。
如果到达文档结尾时仍未找到“Hello”,则停止搜索。
With Selection.Find.Forward = True.Wrap = wdFindStop.Text = "Hello".ExecuteEnd WithFind对象包含与“查找和替换”对话框中的选项相关的属性(在“编辑”菜单上选择“查找”可显示该对话框)。
可以设置Find对象单独的属性或使用Execute方法的参数,如下例所示。
Selection.Find.Execute FindText:="Hello", _Forward:=True, Wrap:=wdFindStop查找文字,但不更改所选内容如果从Range对象访问Find对象,则找到搜索条件时,不更改所选内容,但是会重新定义Range对象。
下列示例在活动文档中查找第一个出现的“blue”。
如果找到该单词,则重新定义该区域,并将加粗格式应用于单词“blue”。
With ActiveDocument.Content.Find.Text = "blue".Forward = True.ExecuteIf .Found = True Then .Parent.Bold = TrueEnd With下列示例使用 Execute方法的参数,执行结果与上例相同。
Set myRange = ActiveDocument.ContentmyRange.Find.Execute FindText:="blue", Forward:=TrueIf myRange.Find.Found = True Then myRange.Bold = True使用 Replacement对象Replacement对象代表查找和替换操作的替换条件。
汇编语言实验二查找匹配字符串一、目的查找匹配字符串SEARCH二、实验内容程序接收用户键入的一个关键字以及一个句子。
如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。
流程图N YY Y输入关键字结束关键字长度=0输入句子句子长度<关键字长度Y保存关键字长度到cx ,cx 入栈,保存总循环次数(句子长度-关键字长度+1)到al ,将句子的首地址放进bx(作为基址寄存器) si=di=0(变址寄存器)开始比较[bx+di]与[si]是否相等si+1,di+1,cx-1(同时指向下一个字符)YN bx+1(句子指向下一个字符) cx 出栈,再入栈,si,di 清零,al-1 cx 是否为0N 匹配完成,调用子程序输出al 是否为0 不匹配,输出三、设计和编码DATA SEGMENTmess1 DB'Enter keyword:','$'mess2 DB'Enter Sentence:','$'mess3 DB'Match at location:','$' mess4 DB'NOT MATCH.',13,10,'$' mess5 DB'H if the sentence',13,10,'$'change DB 13,10,'$'stoknin1 label bytemax1 db 10act1 db?stokn1 db 10 dup(?)stoknin2 label bytemax2 db 50act2 db?stokn2 db 50 dup(?)DATA ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODE SEGMENT;*************************************代码段main proc farassume cs:code,ds:data,es:dataSTART:push dssub AX,AXsub BX,BXsub DI,DIsub SI,SIpush AX ;为返回dos并清空后面要用到的寄存器MOV AX,DATAMOV DS,AXLEA DX,mess1MOV ah,09INT 21h ;输出Enter keywordLEA DX,stoknin1MOV ah,0ah ;用21号中段的0ah号功能获取关键字INT 21hcmp act1,0je exit ;如果为空直接退出程序a10:;********************************输入Sentence并判断LEA DX,changeMOV ah,09INT 21h ;输出回程,换行LEA DX,mess2MOV ah,09INT 21h ;输出Enter Sentence:LEA DX,stoknin2MOV ah,0ahINT 21h ;用21号中段的0ah号功能获取句子MOV AL,act1CBWMOV CX,AX ;保存关键字长度到cxPUSH CX ;cx入栈MOV AL,act2cmp AL,0je a50 ;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1js a50 ;若句子长度小于关键字长度,则跳转显示not match INC ALCBWLEA BX,stokn2 ;将句子的首地址放进BXMOV DI,0MOV SI,0a20:;****************************************比较,内循环MOV AH,[BX+DI]CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30jne a30INC DIINC SIDEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完CMP CX,0je a40jmp a20a30:;*****************************************外循环,BX+1,清空si,di继续内循环比较INC BXDEC ALcmp AL,0je a50MOV DI,0MOV SI,0POP CXpush CXjmp a20a40:;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出SUB BX,offset stokn2INC BXLEA DX,changeMOV ah,09INT 21hLEA DX,mess3MOV ah,09INT 21hCALL btohLEA DX,mess5MOV ah,09INT 21hjmp a10;****************************************二进制转换十六进制btoh PROC NEARMOV CH,4rotate: MOV CL,4ROL BX,CLMOV AL,BLand AL,0fhadd AL,30hcmp al,3ahjl printitadd al,7hprintit:MOV dl,alMOV ah,2int 21hdec chjnz rotateretbtoh endpa50:;*****************************************显示not matchLEA DX,changeMOV ah,09INT 21hLEA DX,mess4MOV ah,09INT 21hjmp a10exit:retmain endpCODE ENDSEND START 四、运行结果及分析五、实验小结六、附录(选)。
汇编程序设计——语言翻译机(一)实验内容本次汇编程序设计题目选自2006年百度之星程序设计大赛初赛题目。
原题如下:百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特的缩率语。
他们在平时的交谈,会议,甚至在各中技术文档中都会大量运用。
为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩率语和专有名词翻译成日常语言。
●输入数据:输入数据包含三部分1. 第一行包含一个整数N(N<=10000 ),表示总共有多少个缩率语的词条。
2. 紧接着有N行的输入,每行包含两个字符串,以空格隔开。
第一个字符串为缩率语(仅包含大写英文字符,长度不超过10 ),第二个字符串为日常语言(不包含空格,长度不超过255 )。
3. 从第N+2 开始到输入结束为包含缩略语的相关文档。
(总长度不超过1000000 个字符)●输出数据:将缩率语转换成日常语言,其他字符保留原样。
●输入样例:6PS(门户搜索部)NLP(自然语言处理)PM(产品市场部)HR(人力资源部)PMD(产品推广部)MD(市场发展部)百度的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。
●输出样例:百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等,其中门户搜索部还包括自然语言处理小组。
(二)算法流程图本程序算法流程图如下:注:要将缓冲区中字符串末尾回车符替换为$。
rankstrcpy(复制): ArrayStrcat(粘贴):(三)实验结果(四)源程序.model small.586.datanum db ? ;替换词条个数buf0 db 5 ;输入词条个数缓存count0 db ?word0 db 5 dup(0)tihuan strucbuf1 db 20 ;结构体,储存数据count1 db ?word1 db 20 dup('$')buf2 db 40count2 db ?word2 db 40 dup('$')tihuan endsstring tihuan 100 dup (<>) ;结构体数组,存储词条temp tihuan <>buf3 db 100 ;输入句子缓存count3 db ?x db 100 dup('$')y db 100 dup('$')note db '此程序实现了字符串的查找替换。
例如',0ah,0dh,'输入(每行以回车键结束)',0ah,0dh,'2',0ah,0dh,'NWPU',0ah,0dh,'The Northwestern PolytechnicalUniversity',0ah,0dh,'Beijing',0ah,0dh,'Xian',0ah,0dh,'NWPU is one of the best universities in Beijing.',0ah,0dh,'则输出',0ah,0dh,'The Northwestern Polytechnical University is one of the best universities in Xian.',0ah,0dh, 'Now please enter:$'note1 db '请输入词条个数:',0ah,0dh,'$'note2 db '请输入被替换的词条:',0ah,0dh,'$'note3 db '请输入替换词条:',0ah,0dh,'$'note4 db '请输入文本:',0ah,0dh,'$'note5 db '替换结果为:',0ah,0dh,'$'.code.startupmov ax,@data ;数据段段基址mov es,axcr macro ;宏:回车mov dl,0dhmov ah,2int 21hendmlf macro ;宏:换行mov dl,0ahmov ah,2int 21hendmmov dx,offset note ;输出提示mov ah,9int 21hcrlfcall inputcall rankmov al,numand ax,00ffhmov cx,axmov bx,offset string[0].word1lop:mov ax,offset xpush axpush bxcall strstrcmp ax,0jz nextwordmov si,axmov al,[si+1];和下边第三行是为了解决缩略词条字数为1时的BUG!mov [si],'$'mov [si+1],almov al,[bx-1]and ax,00ffhadd si,axmov ax,offset ypush axpush sicall strcpymov ax,offset xpush axmov ax,bxadd ax,22push axcall strcatmov ax,offset xpush axpush axcall strcatjmp lopnextword:add bx,64loop lopmov dx,offset note5 ;输出提示5mov ah,9int 21hmov dx,offset xmov ah,9int 21h.exitinput proc near ;输入函数mov dx,offset note1 ;输出提示1mov ah,9int 21hmov dx,offset buf0 ;输入词条个数0~99mov ah,0ahint 21hmov bl,1 ;ASCII值转换为数值mov bh,0mov al,count0and ax,00ffhmov cx,axlop0: mov si,cxsub si,1mov al,word0 [si]sub al,30hmul bladd bh,almov al,blmov ah,10mul ahmov bl,alloop lop0mov num,bhlfmov al,num ;输入替换词条and ax,00ffhmov cx,ax ;num值送计数器mov di,0ffffhlop1:mov dx,offset note2 ;输出提示2mov ah,9int 21hmov dx,bxmov ah,0ahint 21hlfmov si,bxmov al,[si+1]and ax,00ffhadd si,2add si,axmov [si],'$'mov dx,offset note3 ;输出提示3mov ah,9int 21hadd bx,22mov dx,bxmov ah,0ahint 21hlfmov si,bxmov al,[si+1]and ax,00ffhadd si,2add si,axmov [si],'$'add bx,42loop lop1mov dx,offset note4 ;输出提示4mov ah,9int 21hmov dx,offset buf3 ;输入文本mov ah,0ahint 21hlfmov si,offset buf3mov al,[si+1]and ax,00ffhadd si,2add si,axmov [si],'$'retinput endp ;输入完毕rank proc near ;排序函数lea bx,string[0]mov dl,numand dx,00ffhdec dxcmp dx,0jz nonemov si,0ffffhlop3: inc simov di,si ;外循环mov bp,bxlop4: inc di ;内循环add bp,64mov al,[bx].count1mov ah,[bp].count1cmp al,ahjae nextpush si ;string[si]与string[di]交换push dimov cx,64mov si,bx ;temp=string[si]lea di,tempcldrep movsbmov cx,64mov si,bp ;string[si]=string[di]mov di,bxrep movsbmov cx,64lea si,temp ;string[di]=tempmov di,bprep movsbpop dipop sinext:cmp di,dxjnz lop4add bx,64mov ax,dxdec axcmp si,axjnz lop3none:retrank endpstrstr proc near;查找替换词在句子中第一次出现的位置,若找到把其偏移地址AX,否则把0送AX。
堆栈传递入口参数push bppush cxmov bp,spmov si,[bp+6]mov di,[bp+8]lop5:cmp [di],'$'jz no ;不存在push dipush simov al,[si-1]and ax,00ffhmov cx,axcldrepe cmpsbjz foundpop sipop diinc dijmp lop5found: pop si ;找到pop dimov ax,dijmp exit0no: mov ax,0exit0:pop cxpop bpret 4strstr endpstrcpy proc near ;字符串复制函数push bpmov bp,spmov si,[bp+4]mov di,[bp+6]nex: mov al,[si]cmp al,'$'jz exit1mov al,[si]mov [di],alinc siinc dijmp nexexit1:mov [di],'$';末尾加'$'!!!否则多次用y后会出错。
如:第一次将asd复制进y中,则y为asd$,若第二次将m复制进y,若末尾不加$,pop bp;则y为msd$,导致合并xy时将sd也合并了进去ret 4strcpy endpstrcat proc near ;字符串合并push bpmov bp,spmov si,[bp+4]mov di,[bp+6]lop6: mov al,[di]cmp al,'$'jz moveinc dijmp lop6move: mov al,[si]mov [di],alcmp al,'$'jz exit2inc siinc dijmp moveexit2:pop bpret 4strcat endpend(五)实验总结虽然本次实验要求简单明了,但我们在实际编程,尤其是运用汇编语言编写程序的过程中,还是遇到了一些困难,例如输出函数中未将缓冲中的回车符替换为$;strcpy函数中未在y字符串后加上$等。