实验六 串操作指令
- 格式:doc
- 大小:46.50 KB
- 文档页数:5
串操作指令的使用一、串操作指令概述所谓串就是内存中一段地址相连的字节或字。
串操作就是对串中各项数据进行某种运算,也叫数据块操作。
8086/8088有5种基本串操作:⏹MOVS(Move string)串传送指令⏹CMPS(Compare string)串比较指令⏹SCAS(Scan string)串扫描指令⏹LODS(Load from string)从串取指令⏹STOS (Store in to string)存入串指令可以使用3种重复前缀:⏹REP(Repeat)无条件重复⏹REPE/REPZ(Repeat while equal/zero)相等/为零则重复⏹REPNE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复二、串操作指令详解★MOVS 串传送格式:MOVS dest,srcMOVSB(字节传送)MOVSW(字传送)功能:把DS:SI所指向的内存单元中的一个字或字节的内容取出复制到ES:DI所指向的字或字节内存单元中。
同时SI±1、DI±1或SI±2、DI±2,方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。
说明:☆单条MOV指令不能完成存储单元之间的数据传送;MOVS指令就是为解决内存储单元之间数据传送而设置的。
☆所涉及到的源内存单元和目的内存单元的地址分别存放在DS:SI和ES:DI中。
✧MOVS串传送指令不影响标志寄存器。
★LODS 从串取指令格式:LODS srcLODSB (取字节)LODSW(取字)功能:把DS:SI所指向的内存单元中的字或字节内容传送到AX或AL寄存器中。
同时SI 加减1或2;方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。
说明:☆LODS指令可用于取出指定的内存单元中的内容。
✧默认目的寄存器为AX或AL寄存器。
串操作指令串操作指令串操作指令就是用一条指令实现对一串字符或数据的操作。
8086的串操作指令的特点是:◆通过加重复前缀来实现重复操作。
重复的次数取决于C X寄存器的内容(在字符串比较和字符串检索指令中还与Z F标志有关)。
◆可以对字节串进行操作,也可以对字串进行操作。
◆所有的串操作指令都用寄存器S I对源操作数进行间接寻址,默认段寄存器为D S;所有的串操作指令都用寄存器D I为目的操作数进行间接寻址,默认段寄存器为E S。
串操作指令是唯一的一组源操作数和目的操作数都在存储器中的指令。
◆串操作时,地址指针的修改与方向标志D F有关,当D F=1时,S I和D I作自动减量修改,当D F=0时,S I和D I作自动增量修改。
串操作指令一共有5条:◆字符串传送指令M O V S B/M O V S W◆字符串比较指令C M P S B/C M P S W◆字符串检索指令S C A S B/S C A S W◆取字符串指令L O D S B/L O D S W◆存字符串指令S T O S B/S T O S W与上面串操作指令配合使用的重复前缀有:◆重复R E P◆相等则重复/为零则重复R E P E/R E P Z◆不相等则重复/不为零则重复R E P N E/R E P N Z在串操作指令的前面加上重复前缀,使C P U能重复执行该指令,这使处理长字符串比用软件循环处理快得多。
在执行有重复前缀的串操作指令时,C X寄存器控制重复次数,每重复执行一次,C X 内容减1,C X减为0结束;此外,还可以按规定的条件(Z F=1或Z F =0)结束重复过程。
重复前缀对规定条件的检测,是在每次进入串操作以前进行的。
所以若初始化使操作次数C X为0,它将不会引起任何操作。
一、字符串传送指令M O V S B/M O V S W字符串传送指令M O V S B/M O V S W将位于D S段的、由S I所指出的存储单元的内容传送到位于E S段、由D I所指的存储单元中,再修改S I和D I,从而指向下一个元素,M O V S B用于字节传送,M O V S W用于字传送。
一、实验目的1. 理解串操作的基本概念和原理。
2. 掌握串操作的常用方法和技巧。
3. 能够使用串操作解决实际问题。
二、实验原理串操作是指对字符串进行的一系列操作,包括字符串的创建、拼接、截取、查找、替换等。
在计算机编程中,字符串操作是常见的操作之一,掌握串操作对于编程开发具有重要意义。
三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019四、实验内容1. 创建字符串2. 字符串拼接3. 字符串截取4. 字符串查找5. 字符串替换6. 字符串长度计算7. 字符串比较五、实验步骤1. 创建字符串```cpp#include <iostream>using namespace std;int main() {string str1 = "Hello";string str2 = "World";return 0;}```2. 字符串拼接```cpp#include <iostream>#include <string>using namespace std;int main() {string str1 = "Hello";string str2 = "World";string str3 = str1 + str2; // 拼接字符串cout << str3 << endl; // 输出拼接后的字符串 return 0;}```3. 字符串截取```cpp#include <string>using namespace std;int main() {string str = "HelloWorld";string subStr = str.substr(0, 5); // 截取字符串cout << subStr << endl; // 输出截取后的字符串return 0;}```4. 字符串查找```cpp#include <iostream>#include <string>using namespace std;int main() {string str = "HelloWorld";size_t pos = str.find("World"); // 查找字符串cout << "Position: " << pos << endl; // 输出查找位置 return 0;}```5. 字符串替换```cpp#include <iostream>#include <string>using namespace std;int main() {string str = "HelloWorld";string newStr = str.replace(0, 5, "Hi"); // 替换字符串 cout << newStr << endl; // 输出替换后的字符串return 0;}```6. 字符串长度计算```cpp#include <iostream>#include <string>using namespace std;int main() {string str = "HelloWorld";int length = str.length(); // 计算字符串长度cout << "Length: " << length << endl; // 输出字符串长度 return 0;}```7. 字符串比较```cpp#include <iostream>#include <string>using namespace std;int main() {string str1 = "Hello";string str2 = "World";if (str1 == str2) {cout << "Strings are equal." << endl;} else {cout << "Strings are not equal." << endl;}return 0;}```六、实验结果与分析通过以上实验,我们掌握了字符串的基本操作,包括创建、拼接、截取、查找、替换、长度计算和比较。
串操作实验报告串操作实验报告引言:串操作是计算机科学中的一项基本操作,它涉及到对字符串的处理和操作。
在本次实验中,我们将学习和掌握一些常见的串操作技术,并通过实际操作加深对这些技术的理解和应用。
实验目的:1. 掌握字符串的基本概念和表示方法;2. 学习串的初始化、赋值和销毁操作;3. 熟悉串的基本操作,如求串的长度、比较串、连接串等;4. 掌握串的模式匹配算法。
实验过程:1. 字符串的初始化和赋值在本次实验中,我们使用C语言来进行串操作的实现。
首先,我们需要初始化一个字符串,并为其分配内存空间。
然后,我们可以通过赋值操作将一个字符串赋给另一个字符串。
这样,我们就可以对这个字符串进行各种操作。
2. 求串的长度求串的长度是串操作中的一个基本操作。
我们可以通过遍历字符串中的每一个字符,并计数来得到字符串的长度。
在实际操作中,我们可以使用strlen()函数来实现这个功能。
3. 比较串比较串是判断两个字符串是否相等的操作。
我们可以逐个字符地比较两个字符串中的字符,如果所有字符都相等,则认为两个字符串相等。
在实际操作中,我们可以使用strcmp()函数来实现这个功能。
4. 连接串连接串是将两个字符串连接成一个新的字符串的操作。
我们可以先计算出新字符串的长度,然后将两个字符串中的字符逐个复制到新的字符串中。
在实际操作中,我们可以使用strcat()函数来实现这个功能。
5. 串的模式匹配串的模式匹配是在一个字符串中查找另一个字符串的操作。
我们可以通过遍历字符串中的每一个字符,并与目标字符串进行比较来实现这个功能。
在实际操作中,我们可以使用strstr()函数来实现这个功能。
实验结果:通过实验,我们成功地完成了串操作的各项任务。
我们学会了如何初始化和赋值字符串,如何求串的长度,如何比较和连接串,以及如何进行串的模式匹配。
这些技术对于我们在日后的编程工作中处理字符串将会非常有帮助。
结论:串操作是计算机科学中的一项基本操作,它对于我们处理字符串非常重要。
一、概述1)串和串操作存储器中的地址连续的若干单元的字符或数据称为字符串或数据串。
串操作指令就是用来对串中每个字符或数据进行操作的指令。
串指令既可处理字节串,也可处理字串,并在每完成一个字节(或字)的操作后,能够自动修改指针,以便执行下一个字节(或字)的操作。
串指令可完成两个存储单元之间的传送和比较操作(也只有串指令才可以)。
2)串操作的共同点l 源串(源操作数)默认在数据段中:段基地址由DS指定(但允许段超越),偏移地址由SI指定。
即源串指针为DS:SI;l 目的串(目的操作数)默认在附加段中,段基地址由ES指定,偏移地址由DI指定。
即目的串指针为ES:DI;l 若要使用重复前缀,则应把串长度放在CX中;l 在对串中的每个字节(或字)操作后,SI和DI中的串地址都会自动修改:±1或±2。
其中±由方向标志DF决定:若DF=0,取“+”;若DF=1,取“-”。
增减量大小由操作数类型决定:字节操作增减量为1,字操作增减量为2。
若使用了重复前缀,CX的内容也会每次自动减1。
3)串指令的操作①执行规定的操作;② SI和(或)DI自动增量(或减量);③若有重复前缀,CX自动减1。
由上可知,使用串操作指令之前应该设置:方向标志(DF)、源串指针(DS:SI)、目的串指针(ES:DI)和重复次数(CX)。
显然,串操作指令可以处理的最大串长度为65535字节(或字)。
二、重复操作前缀串操作指令前面允许带有一个重复操作前缀(简称重复前缀),使该指令能重复执行。
重复前缀使得串操作指令在每完成一次操作后自动修改CX的值,直到CX=0或满足指定的条件为止。
重复前缀包括:REP CX≠0时重复执行指令规定的操作(无条件重复前缀)REPE/REPZ CX≠0∧ZF=1时重复执行指令规定的操作REPNE/REPNZ CX≠0∧ZF=0时重复执行指令规定的操作重复前缀可单独写为一行,也可写在串指令前面(但要用空格分开)。
1.串传送指令MOVS (Move Byte or Word String) 指令格式:MOVS 目的操作数,源操作数MOVSB ;字节串传送MOVSW ;字串传送指令功能:[DS(0)+SI] →[ES(0)+DI]SI=SI±1,DI=DI±1(字节操作)SI=SI±2,DI=DI±2(字操作)若DF=0时,使用+号;若DF=1时,使用-号【例6.43】实现以FIRST单元开始的200个字节数据传送到SECOND开始的单元中,程序段如下:MOV SI,OFFSET FIRSTMOV DI,OFFSET SECONDMOV CX,200L1:MOV AL,[SI]MOV [DI],ALINC SIINC DIDEC CXJNZ L1HLT方法二:MOV SI,OFFSET FIRSTMOV DI,OFFSET SECONDMOV CX,200CLDL1:MOVSBDEC CXJNZ L1HLT方法三:MOV SI,OFFSET FIRSTMOV DI,OFFSET SECONDMOV CX,200CLDREP MOVSBHLT2.串比较指令CMPS(Compare Byte or Word String)指令格式:CMPS 目的操作数,源操作数CMPSB ;字节串传送CMPSW ;字串传送指令功能:[DS(0)+SI]-[ES(0)+DI],但结果不回送SI=SI±1,DI=DI±1(字节操作);SI=SI±2,DI=DI±2(字操作)若DF=0时,使用+号;若DF=1时,使用-号比较以AREA1和AREA2单元开始的30个字节数据是否相同,如果相同则AREA3单元内容为0,不同则为0FFH,程序段如下:MOV SI,OFFSET AREA1MOV DI,OFFSET AREA2MOV BX,OFFSET AREA3MOV CX,30CLDREPZ CMPSBJNZ L1MOV [BX],0JMP L2L1:MOV [BX],0FFHL2:HLT3.串扫描指令SCAS(Scan Byte or Word String)指令格式:SCAS 目的操作数SCASB ;字节串传送SCASW ;字串传送指令功能:(AL)-[ES(0)+DI],DI=DI±1(字节操作);(AX)-[ES(0)+DI],DI=DI±2(字操作)若DF=0时,使用+号;若DF=1时,使用-号【例6.45】设ES段中自BLOCK单元存有30个字符数,要求查找其中是否有空格符,若有则将第一个被找到字符在ES段中的偏移量送到CX中,否则CX值为0。
串操作指令程序设计
实验目的:
掌握串传送指令功能及执行规律
理解dos中断的2号和9号功能应用
实验内容:
1.要求将串string1传送给string2(数据传送串指令)
2.比较字符串SOU(在数据段中)和字符串TAR(在附加段中)中否相同,若相同则输出YES,不相同输出NO(串比较指令)
3.把附加段中从ARRAY开始的10个字置为ab(存入串指令)
4.从字符串STRING1的结尾取出一个字符,送入AL寄存器,并送屏幕显示(取出串指令)
5.设str是附加段中长度为20字节的字符串,现查询该串是否有该字符,若有则输出"find",没有输出"no find"(串扫描指令)
实验报告要求:
(1)画出程序的流程图
(2)列出程序清单
(3)说明每种传送指令的功能
附:源程序
1、要求将串string1传送给string2
data segment
string1 db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
data ends
edata segment
string2 db 26 dup(?)
edata ends
code segment
assume cs:code,ds:data,es:edata
main proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,edata
mov es,ax
lea si,string1
lea di,string2
cld
mov cx,26
rep movsb ;当CX不为零时重复做movsb指令
;调用dos的9号中断来显示字符串"YES"
;dos 的9号中断显示的字符串结尾一定是一个"$"
mov al,"$"
mov [string2+26],al;给字符串结尾加一个"$"
mov ds,ax
mov dx,offset string2
mov ah,9
int 21h
ret
main endp
code ends
end main
2、比较字符串SOU(在数据段中)和字符串TAR(在附加段中)中是否相同;若相同则输出YES,不相同输出NO
data segment
sou db 'IJKLMNOPQRSTUabcdef'
no db 'no','$'
yes db 'yes','$'
data ends
edata segment
tar db 'IJKLMNOPQRSTUabcdef'
edata ends
code segment
assume cs:code,ds:data,es:edata
main proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,edata
mov es,ax
lea si,sou ;指向源串首地址
lea di,tar ;指向目标串首地址
cld ;置df=0,表示正向比较
mov cx,19 ;比较数,以最长的字符串为准
repz cmpsb ;当CX不为零且ZF=1就继续执行比较
jnz n
;调用dos的9号中断来显示字符串"YES"
y:
mov ax,seg yes ;传送需显示字符串的段地址到ds
mov ds,ax
mov dx,offset yes ;传送需要显示字符串的偏移地址
mov ah,9
int 21h
jmp exit
;调用dos的9号中断来显示字符串"no"
n:
mov ax,seg no
mov ds,ax
mov ah,9
int 21h
exit: ret
main endp
code ends
end main
3、把附加段中从ARRAY开始的10个字置为ab
data segment
data ends
edata segment
array dw 12 dup(?),"ex",'$'
edata ends
code segment
assume cs:code,ds:data,es:edata
main proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,edata
mov es,ax
lea di,array ;字符串的首地址
cld ;置DF=0,串首地址每次正向自动加一
mov cx,10 ;设置传字的个数
mov ax,'ba' ;设置字的内容在AX寄存器
rep stosw ;当CX不为零时重复传送AX的内容到目的地址
;调用DOS的9号中断来显示传送字符串的情况
mov ax,seg array
mov ds,ax
mov dx,offset array
mov ah,9
int 21h
ret
main endp
code ends
end main
4、从字符串STRING1的结尾取出一个字符,送入AL寄存器,并送屏幕显示data segment
string1 db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
data ends
edata segment
string2 db 26 dup(?)
edata ends
code segment
assume cs:code,ds:data,es:edata
main proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,edata
mov es,ax
lea si,string1+25 ;传字符串STRING1的结尾地址到SI
std ;设置DF=1,表示串的地址自动减一
lodsb ;从串的结尾取出一个字符送al
;调用dos的2号中断来显示单个字符
mov dl,al;需要显示的字符或者其ASIIC码送入DL,才能显示
mov ah,2
int 21h
ret
main endp
code ends
end main
5、设str是附加段中长度为20字节的字符串,现查询该串是否有该字符若有则输出"find",没有输出"no find"
data segment
no db 'no find','$'
yes db 'find','$'
data ends
edata segment
str db 'IJKLMNOPQRST#Uabcdef'
edata ends
code segment
assume cs:code,ds:data,es:edata
main proc far
push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
mov ax,edata
mov es,ax
lea di,str ;送字符串的偏移地址进di
cld ;设置DF=0,表示每次di自动加1
mov al,"#" ;需要查找的字符
mov cx,20 ;设置字符串的个数,表示要循环的次数
repnz scasb;当cx不等于零且结果不相等时,继续做scasb指令
jnz n
;调用dos的9号中断来显示字符串"find"
y:
mov ax,seg yes
mov ds,ax
mov dx,offset yes
mov ah,9
int 21h
jmp exit
;调用dos的9号中断来显示字符串"no find" n:
mov ax,seg no
mov ds,ax
mov dx,offset no
mov ah,9
int 21h
exit: ret
main endp
code ends
end main。