实验六 串操作指令
串操作指令程序设计
实验目的:
掌握串传送指令功能及执行规律
理解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。
串操作指令一
串传送 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
