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