当前位置:文档之家› 实验三 字符串操作

实验三 字符串操作

一、实验要求和目的
1.了解汇编语言字符串处理基本流程;
2.熟悉汇编语言字符串处理基本指令的使用方法;
3.掌握利用汇编语言实现字符串处理的程序设计方法。

二、软硬件环境
1、硬件环境:计算机系统windows;
2、软件环境:装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识
1、字符串处理基本操作流程
(1)利用SI寄存器保存源串首地址;
(2)利用DI寄存器保存目的串首地址;
(3)利用CX寄存器保存字符串长度;
(4)利用CLD或STD指令设置字符串处理;
(5)利用字符串处理指令实现相关处理。

其中,CLD指令使DF=0,在执行串处理指令时可使地址自动增量;STD使DF=1,在执行串处理指令时可使地址自动减量。

提示:字符串处理一般都涉及到源串和目的串,汇编语言规定源串在数据段中定义,目的串在附加段中定义。

2、重复前缀指令,重复次数由计数寄存器 CX 中存放的值决定,指令每重复执行一次,计数器 CX 中值减 1,当 CX 中值减至 0 时,停止重复执行,继续执行下一条指令REP 无条件重复前缀,重复串操作直到计数寄存器的内容CX 为0 为止。

经常与REP 配合工作的字符串处理指令有MOVS、STOS和LODS。

REPE/REPZ 判断计数寄存器的内容CX 是否为0 或ZF=0(即比较的两个操作数不等),只要满足一个则重复执行结束,否则继续执行。

可以与REPE/REPZ配合工作的串指令有CMPS 和SCAS。

3、字符串处理基本指令
(1)MOVS传送指令
格式:MOVS DST,SRC或MOVSB(传送字节)或MOVSW(传送字)。

后面两种形式需要与REP指令结合使用。

该指令把由源变址寄存器(SRC)指向的数据段中的一个字(或字节)数据传送到由目的变址寄存器(DST)指向的附加段中的一个字(或字节)中去,同时,根据方向标志及数据格式(字或字节)对源变址寄存器和目的变址寄存器进行修改。

(2)STOS存入串指令
格式:STOS DST或STOSB(存入字节)或STOSW(存入字)。

该指令把AL或AX的内容存入由目的变址寄存器指向的附加段的某单元中,并根据方向标志(DF)和数据类型修改目的变址寄存器的内容。

(3)LODS从串取指令
格式:LODS SRC或LODSB(取字节)或LODSW(取字)。

该指令把由源变址寄存器指向的数据段中某单元的内容传送到AL或AX中,并根据方向标志和数据类型修改源变址寄存器的内容。

(4)CMPS串比较指令
格式:CMPS SRC,DST或CMPSB或CMPSW。

该指令把由源变址寄存器指向的数据段中的一个字节或字与由目的变址寄存器所指向的附加段中的一个字节或字相减,但不保存结果,只根据结果设置条件标志。

该指令与REPE/REPZ或REPNE/REPNZ结合,可以比较两个数据串。

(5)SCAS串扫描指令
格式:SCAS DST或SCASB或SCASW。

该指令把AL或AX的内容与由目的变址寄存器所指向的附加段中的一个字节或字进行比较,并不保存结果,只根据结果设置条件码。

该指令与REPE/REPZ或REPNE/REPNZ结合,可以从一个字符串中查找一个指定的字符。

总的来说,字符串处理可以将缓冲区中一个数据块搬至存储器的另一处,比较两个字符串是否相等,从缓冲区中一个数据块寻找某一个特定的关键字,顺次从一个缓冲区取字符或顺次向一个缓冲区存字符等。

四、实验内容与步骤
1、比较缓冲区中两字符串是否相同,相同则AL返回0,不同AL返回1。

为了使程序的通用性比较好,字符串长度要求自动获取。

(要求用字符串处理方法)
实验流程图
代码DATAS SEGMENT
DATAS ENDS
extra SEGMENT
str1 db'Hello.orld!$'
leng1 dw ($-str1)
str2 db'Hello.world!$'
leng2 dw ($-str2)
extra ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,es:extra START:
MOV AX,DATAS
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
MOV AL,1
MOV BX,LENG1
MOV DX,LENG2
CMP BX,DX
JNZ N
JMP CON
N:
MOV AL,1
JMP OVER
CON:
LEA SI,STR1
LEA DI,STR2
MOV CX,LENG1
CLD
REPE CMPSB
JCXZ Y
Y:
MOV AL,0
JMP OVER
OVER:
MOV AH,4CH
INT 21H
CODES ENDS
END START
因为没有拍照片,所以没有保存调试结果,但是在上机调试的过程中实验是正确的。

2、编写程序,将内存中某一区域的数据传送到另一区域。

(要求用字符串处理方法)
开始
输入数据
CX=字符串长度
Y
CX等于0?
N
复制字符
CX=CX-1
结束
DATAS SEGMENT
str1 db'Hello.orld!$'
leng1 dw ($-str1)
DATAS ENDS
extra SEGMENT
str2 db 30 dup(0)
leng2 dw ($-str2)
extra ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,es:extra
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
LEA SI,STR1
LEA DI,STR2
MOV CX,LENG1
CLD
REP MOVSB
MOV AH,4CH
INT 21H
CODES ENDS
END START
3、编写程序,在已知字符串中搜索特定字符’!’,若找到则AL 返回0,找不到AL 返回1。

(要求用字符串处理方法)
DATAS SEGMENT
DATAS ENDS
extra SEGMENT
str1 db'Hello.world!$'
leng1 dw ($-str1)
extra ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,es:extra
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
LEA ax,str1
mov di,ax
MOV al,'!'
mov cx,leng1
cld
repnz scasb
jcxz n
jmp o
n:
MOV bx,1
JMP OVER
o:
MOV bx,0
jmp over
over:
mov ax,bx
mov ah,4ch
int 21h
CODES ENDS
END START
4、编写程序,统计一串字符串中字符"."出现的次数。

(要求用字符串处理方法);
DATAS SEGMENT
DATAS ENDS
extra SEGMENT
str1 db'Hello...orld!$'
leng1 dw ($-str1)
extra ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,es:extra START:
MOV AX,DATAS
MOV DS,AX
MOV AX,EXTRA
MOV ES,AX
mov bx,0
LEA ax,STR1
mov di,ax
MOV al,'.'
mov cx,leng1
cld
l: repnz scasb
jcxz over
inc bx
jmp l
over:
mov ax,bx
mov ah,4ch
int 21h
CODES ENDS
END START
五、思考与练习
1、如果不用字符串处理方法,而用其他方法如何实现题目2 的程序设计,比较两种方法效果?
答:也可以用循环loop指令实现,在比较时通过采用cmp比较字符ASCII值的方式,跳转对应不同结果进行处理。

采用循环方式需要更多的指令,消耗更多的内存才能完成任务。

采用字符串处理更加简洁也更加方便。

相关主题