实验六 串操作指令
串操作指令一
串传送 MOVSB (正向 DF=0 )
串传送 MOVSW(反向 DF=1)
在使用MOVS指令进行字符串传送时,要注意传送方向。 – 如果源字符串与目标字符串不重迭,则传送方向没有任何影响。 – 如果源字符串与目标字符串部分重迭,则传送方向要特别注意。
DF=0? DF=1?
例 将数据段中首地址为SOURCE的100个字节串元素传送到附加段中首地址 为DEST的内存单元址连续的若干单元字符或数据。 由多个字节数据组成的数据串称为字节数据串,简 称字节串; 由多个字数据组成的数据串称为字数据串,简称字 串。 成串的字节数据或字数据称为数据串元素。 对数据串元素作同样的操作,就称为串操作。 把能完成串操作功能的指令称为数据串操作指令或 简称为串操作指令。
3、串操作指令 (1)串传送指令 指令功能:把位于数据段DS:SI中一个字节或字的数据传送到附 加段ES:DI中。 指令格式: 注意: 1)源串可以段跨越,目的串不可以。 MOVSB;字节传送:ES:[DI]←DS:[SI],SI ←SI±1, 2)DF=0,地址指针 +1 或 +2 , DF=1 ,指针 -1 或 -2 。 ;DI ←DI±1 3)指令隐含操作数,只有助记符,无操作数。 MOVSW;字传送:ES:[DI]←DS:[SI],SI ←SI±2, 4)不影响标志位。 ;DI ←DI±2
实现该功能的程序段如下: CLD LEA SI,SOURCE LEA DI,DEST MOV CX,100 AGAIN: MOVSB
DEC JNZ HLT CX AGAIN ;使DF=0 ;SI指向源串 ;DI指向目的串 ;(DS:SI)→ES:DI, ;(SI)+1→SI,(DI)+1→DI
本例中MOVSB指令可用以下4条指令替代: MOV AL,[SI] MOV ES:[DI],AL INC SI INC DI
串操作指令
23 D0 05 AB 92
Source
NEXT: LODSB INC AL 4、保存运算结果 5、所有操作完成否?若完成, 结束;否则继续2-4的动作 STOSB DEC CX JNZ NEXT HLT
24 D1 06 AC
Dest
DI
23 D0 05
Dest
ES
例1-2:与 REP 指令配合传送100个数。 LEA SI,Souce LEA DI,Dest MOV CX,100 LEA SI,Souce LEA DI,Dest MOV CX,100 CLD REP MOVSB HLT CX不为 0 时重复执行
SI
23 D0 05 AB 92
SI
23 D0 05 AB 92
Source
[SI] - [DI] SI+1 → SI DI+1 → DI
3、操作结束? 若否,继续2中 的操作;否则结 束程序
DI
23 D0 05 A1 92
Dest
例2-2:在内存的DS和ES段中,各有长度为50字节的字符串,试比较它们 是否相同。( 与 REPE / REPZ配合使用,找第一个不相同的数据位置)
REPNE CMPSB
JE Found MOV AX, 0 JMP Exit Found : DEC SI MOV AX, SI Exit: HLT
DI 23 D0 05 A1 92 Dest
3、SCAS指令 格式:SCASB/SCASW 功能:AL/AX-[ES:DI] DI±1或2 注意:状态位随运算结果变化。
LEA DI, DEST
MOV CX, 30 MOV AL, ‘A’
DI 53 71 41 49 68 DEST
实验六 串的模式匹配
⑵用KMP算法进行匹配。 (3)程序运行的结果要在屏幕上显示:
简单的朴素模式匹配算法中,模式串的位置、出现的次数。 模式串的next函数值。 说明:下课前请将源代码的.c(或.cpp) KMP算法的匹配位置。 文件以及.h文件打包后重命名为
“p6_姓名简拼_学号后三位”, 然后提交到教师机!
【实验内容】编写程序,实现顺序串的模式匹配算法。 【基本要求】在主程序中调用算法,输入一个主串和模式串, 在主串中检索模式串,显示模式串在主串中出现的次数和 位置。 ⑴用简单的朴素模式匹配算法计模式串出现 的次数; 从主串的任意给定位置检索模式串。
【实现提示】
要统计模式串在主串中出现的次数,可以先确定从
主串中第一个字符起,模式串的位置,然后再利用 指定位置的匹配算法找出其他匹配的位置; 利用一个数组来存放所有模式串出现的位置,然后 将这些位置依次打印输出。 串值在数组中存储时,是从数组的0号单元开始存 放的。注意修改教材中Next函数和KMP算法函数 中的变量! 至少包含以下头文件: #include <stdio.h> #include <string.h> #include <conio.h>
串操作指令
运用MOVSB指令
DATA SEGMENT NUM1 DB 50 DUP(0A0H) NUM2 DB 50 DUP(0) COUNT EQU LENGTH NUM2 ENDS
DATA CODE
SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM1 MOV DI,OFFSET NUM2 MOV CX,COUNT NEXT: MOVSB LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
例2:同学课后应用以上指令编辑传送100字的程序
DATA CODE
SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET NUM1 MOV DI,OFFSET NUM2 MOV CX,COUNT NEXT: MOVS BYTE PTR[DI],BYTE PTR[SI] LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START
START: MOV AX,DATA NEXT: MOV AL,[DI] MOV DS,AX MOV [SI],AL MOV DI,OFFSET NUM1 INC SI MOV SI,OFFSET NUM2 INC DI MOV CX,50 LOOP NEXT
运用MOVS指令
DATA SEGMENT NUM1 DB 50 DUP(0A0H) NUM2 DB 50 DUP(0) COUNT EQU LENGTH NUM2 ENDS
基 本 串 操 作
汇编串操作指令的使用
串操作指令的使用一、串操作指令概述所谓串就是内存中一段地址相连的字节或字。
串操作就是对串中各项数据进行某种运算,也叫数据块操作。
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寄存器。
汇编语言设计-串操作
SI←源串地址指针 DI←目串地址指针 CX←计数器初值 DF←0 增址方向
串比较 [SI]-[DI]
相同?
Y
N
BX←偏移地址
AL←[BX]
(CX)←(CX)-1
CX=0? ≠0 =0
停机
BX←0
程序见P87∽88
3、串扫描(搜索)指令SCASB/SCASW
SCASB ;(AL)-[DI] , (DI)←(DI) 1
SCASW ;(AX)-[DI] , (DI)←(DI) 2
功能:把AL(或AX)中的内容与DI所指的附ES中一个 字节(或字)进行比较 , 结果不回送 , 只影响状态标志 , 并 在比较之后,自动修改地址指针DI。
注意: ①、欲搜索的字符或数据(称关键字)必须存放在AL或 AX寄存器中。
②、串元素的地址指针使用DI寄存器,且通常在附加段 ES中。
Y DX←求负数和
何修改?②去掉MOV BX,AX 指令可行?
5、串存储(存字符串)指令STOSB/STOSW STOSB ;B [DI]←(AL) , (DI)←(DI) 1
STOSW ;W [DI]←(AX) , (DI)←(DI) 2
功能:将AL或AX中的数据存到ES段由DI所指定的内存
CLD ;置方向标志,即DF=0,增址传送
LEA SI,SOURCE ;SI指向源串 DEC CX
LEA DI,DEST ;DI指向目的串 JNZ AGAIN
MOV CX , 64H ;设置计数器初值 HLT AGAIN:MOVSB ;串传送
程序中的MOVSB指令 其一条指令功能相当
于右边四条指令功能
㈠、基本的字符串操作指令
1、字符串传送指令MOVSB/MOVSW 功能:将位于DS段的由SI所指向的存储单元中的字节或 字传送到位于ES段由DI所指向的存储单元中,并修改SI和 DI,以指向字符串的下一个元素。 例:MOVSB ;字节串传送 , SI和DI的内容1
第六章 串操作
;地址自动增加
;一次扫描一个字节 ;相等即空格,则跳转 ;否则,继续扫描
6.重复前缀指令
串操作指令前可加一个重复前缀,实现串操作的
重复执行,重复次数隐含在CX中。 REP 与MOVS,STOS,LODS配合使用 REPZ/REPNZ 与CMPS,SCAS配合使用 ①REP 指令格式:REP MOVSB/REP STOSW 指令功能: ≠0 则执行串指令 CX=0? 且CXCX-1 =0 则退出串操作
②REPZ 指令格式:REPZ CMPSB 指令功能:如果CX≠0且ZF=1,则执行串操作 如果CX=0或ZF=0,则退出串操作 例:比较字符串STR1和STR2,字符串长度6, 如果相等AL置0,不相等AL置0FFH。
DATA SEGMENT STR1 DB 'STRING' STR2 DB 'STRING' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX ;DS的装入 MOV ES,AX ;ES的装入 LEA SI,STR1 ;源操作数地址送至SI LEA DI,STR2 ;目的操作数地址送至DI MOV CX,6 ;字符串长度 CLD ;地址自动增加 REPZ CMPSB ;相等则一直比较下去,遇到不相等或者cx=0则退出
例:将数据段DATA1指示的50个字节送到数据段 指示的DATA2区域。
MOV SI,OFFSET DATA1 MOV DI,OFFSET DATA2 MOV CX,50 CLD ;源操作数地址至SI ;目的操作数地址至DI ;字符串长度 ;地址自动增加
AGN: MOVSB
LOOP AGN
串操作类指令
在SCAS指令前加有REPNE/REPNZ前缀,则表示:当串未结尾 (CX≠0)且串元素≠关键值(ZF=0)时继续搜索,直到CX=0或ZF= 1才执行下一条指令。 --可以用来在一个串中查出某一指定元素。
指令格式:SCAS OPRD SCASB ;搜索字节串 SCASW ;搜索字串 SCASD ;搜索双字串 SCASQ ;搜索4字串
功能:将累加器(AL或AX或EAX或RAX )中的内容与ES:DI(EDI 、 RDI )指定的目标串元素(字节或字或双字或4字)进行比较(减法操 作),用标志位反映比较的结果,而不改变累加器和目标串的内容,达 到字符串搜索的目的,同时自动修改指针DI。
若CMPS指令前加上前缀REPE/REPZ,则表示:当串未结尾(CX≠0) 且串相等(ZF=1)时继续比较;
如果CMPS用REPNE/REPNZ作前缀,则表示:当串未结尾 (CX≠0)且串不相等(ZF=0)时继续比较。
2009年6月2日星期二
7
例:比较两个字符串是否有相同的元素,它们的首地址和目标地址分别 为SRC和DST,字符串的长度为N个字节。
GO_ON:
MOVSD
DEC
CX
JNZ
GO_ON
若采用重复前缀,则上述程序简化为:
LEA SI,SOURCE
LEA DI,DEST
MOV ECX,50
;设置循环操作次数
CLD
;设置方向标志DF=0
REP MOVSD
2009年6月2日星期二
6
(2)串比较指令 CMPS/CMPSB/CMPSW/CMPSD/CMPSQ
串操作类指令
1.串传送指令
REP MOVSB REP MOVSW 字符或数据的个数预先放在CX寄存器中; 每执行一次操作,CX自动减1,直到CX=0串操 作自动停止。
MOV DI, 0 JMP DONE FOUND:DEC DI MOV DATA2 ,DI INC DI SUB DI,BX
DONE: MOV DATA1,DI
把6000H:1200H单元开始的100个字存储单元内容清零。
MOV AX,6000H MOV ES, AX
MOV AX, 1200H
MOV DI, AX MOV CX, 100 CLD MOV AX, 0
REP STOSW
HLT
5.串扫描指令
格式: [REPZ/ REPNZ] SCASB 操作:AL -(ES:DI) 格式: [REPE/ REPNE] SCASW 操作: AX -(ES:DI) 将AL或AX的数据与位于ES段DI指针所指的内 存单元的数据相比较;比较结果不改变目标操 作数,只影响标志位。
用lodsb时每次取一个字节取完后地串装入指令该指令一般不用重复前缀否则al或ax中的内容会被后一次操作覆盖最后只能得到内存中字符串的最后一个字节或字
3.3.4 串操作类指令
1.串操作指令特点
用一条指令实现对一串数据的操作;
源操பைடு நூலகம்数和目标操作数都在存储器中;
共同点:
源操作数由DS:SI指定; 目标操作数由ES:DI指定。 串长:CX 自动修改地址指针:SI和DI
1、串传送指令
DS:SI DS:SI DS:SI
汇编语言——串操作指令
MOVS指令可以实现把内存中的一个数据,不经过寄存 器的过渡由一处复制到另一处。这一点是MOV指令做不到 的。MOVS指令与循环控制指令配合,可以完成数据块的复 制。被复制的数据串称为源串,复制到的目的地称为目标 串。如果源串与目标串所占据的内存是完全分离的,数据 传递可以按由串首至串尾的次序进行,也可以按相反的方 向进行。但是,当两者占据的内存区域有部分重叠时,需 要注意用DF控制方向,当源串首地址小于目标串首地址时, 应由尾至首进行传送,源串首址大于目标串首址时,则由 首至尾传送。
(2)STOSW进行字型串操作,把AX的值送往内存中由 ES:DI所确定的内存中。当DF=0时,令DI←DI+2,当DF= 1时,令DI←DI-2。
STOS指令主要用于把一段连续的存储区域以AL或AX中 的值填充,特别的是,存储区的段地址必须放在附加段寄存 器ES中。STOS与LODS指令配合,还可以从一个串中取出数 据,有选择地存到另一个串中。
8088提供有两条专用指令设置DF,分别是CLD和STD 指令。
【指令格式】CLD
【功能】把标志位DF清0。
【指令格式】STD
【功能】把标志位DF置1。
7.2.2 串操作指令
8088指令系统中共设计有5条串操作指令,分别用于完 成从串中取出数据、往串中2.2.1 LODS指令──从串中取出数据
lab2:
INC [countp]
JMP lab4
lab3:
INC [countn]
lab4:
LOOP lab1
串操作指令
串操作指令串操作指令串操作指令就是用一条指令实现对一串字符或数据的操作。
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时重复执行指令规定的操作重复前缀可单独写为一行,也可写在串指令前面(但要用空格分开)。
第3章_6+串操作
(SI)
(DI)
(SI)
(DI) DF=1
(1)[ES:DI] ← [DS:SI] (2)MOVSB(字节操作):(SI)←(SI)±1, (DI)←(DI)±1 MOVSW (字操作) : (SI)←(SI)±2, (DI)←(DI)±2 (3)方向标志: DF=0 时地址“ +”,DF=1时地址“ -” (4)使用重复前缀REP相配合,一次完成数据串的传送操作
例如: REPNE REPNZ CMPSW SCASB
N
ZF=0? Y CX=0?
N
Y
执行串操作指令 REP结束, 执行下一条指令 CXßCX-1
串操作指令(5条)
1、串传送指令 MOVSB/MOVSW(MOVe String of Byte/Word) 格式:MOVSB/MOVSW
功能:将源串指针SI所指单元的一个数据(字节或字)传送到目的串指针DI所指单 元中,指针作相应变化
地 址 增 量
程序段如下: LDS SI,源串首地址 LES DI,目的串首地址 MOV CX,串长度 CLD REP MOVSB;将数据段中的整串数据传送到附加段中
2、串比较指令 CMPSB/CMPSW(CoMPare String of Byte/Word) 格式:CMPSB/CMPSW
功能:将源串指针SI所指单元的一个数据(字节或字)与目的串指针DI所指单元的 一个数据(字节或字)相减,但结果不回送,只影响标志位,指针作相应变化
5、串读出指令 LODSB/LODSW(LOaD data from String of Byte/Word) 格式:LODSB/LODSW
功能:将源串指针SI所指单元的一个数据(字节或字)传送到累加器(AL或AX) 中,指针作相应变化 数据段DS DF=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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串操作指令程序设计
实验目的:
掌握串传送指令功能及执行规律
理解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。