实  验  报  告
课程名称:  微机原理与接口技术 
实验名称: 实验三  串操作实验 
专    业:  计算机科学与技术 
学    号:           
姓    名:             
实验地点:  系统结构实验室   
实验日期:             
任课教师:               
1.熟悉串操作指令的功能。
2.了解串操作指令的使用方法。
3.熟悉简化段定义格式的源程序框架。
要求
1.复习8086指令系统中的串操作类指令。
2.实验之前按照题目要求预先编写好实验内容中的程序段。
3.实验之前预习实验内容并写好实验预习部分。
实验环境
台式机一台
Windows XP 操作系统
Turbo Debugger调试工具
MASM汇编程序
实验预习
1.串操作指令中采用的是哪种操作数寻址方式?每执行一次串操作,地址指针如何变化?
(1)、串操作指令采用了特殊的数据串寻址方式,说明如下:
源操作数用寄存器SI间接寻址,默认再在数据段DS中,即DS:[SI],允许段超越。
目的操作数用寄存器DI间接寻址,默认在附加段ES中,即ES:[DI],不允许段超越。
每执行一次串操作,源地址指针SI和目的地址指针DI将自动修改:±1或±2。
对于以字节为单位的数据串操作,地址指针应该±1。
对于以字为单位的数据串操作,地址指针应该±2。
当DF=0,地址指针应该+1或+2。
当DF=1,地址指针应该-1或-2。
串操作后之所以自动修改SI和DI指针是为了方便对后续数据的操作。
(2)、每执行一次串操作,源地址指针SI和目的地址指针DI将自动修改:±1或±2.
对于以字节为单位的数据串操作,地址指针应该±1
对于以字为单位的数据串操作,地址指针应该±2
2.串操作指令分成哪两组?每组分别有哪些指令?写出每一条指令的作用。
(1)、一组实现数据串的传送,一组实现数据串的检测
(2)、传送数据串:串传送指令MOVS、串存储指令STOPS、串读取指令LODS
检测数据串:串比较指令CMPS、串扫描指令SCAS
(3)、串传送指令MOVS:将数据段中的一个字节或字数据传送至附加段的主存单元。
串存储指令STOPS:将AL或AX的内容存入附加段的主存单元。
串读取指令LODS:将数据段中的一个字节或字数据读取到AL或AX寄存器。
串比较指令CMPS:用源数据减去目的数据串,以比较两者间的关系。
串扫描指令SCAS:用AL/AX内容减去目的数据串,以比较两者间的关系。
3.请写出简化段定义格式的源程序框架。
  .model small        ;定义程序的存储模式
    .stack              ;定义堆栈段
    .data                ;定义数据段
    ……                ;数据定义
    .code                ;定义代码段
start: mov ax,@data        ;字符串截取指令程序起始点
    mov ds,ax            ;设置DS指向用户定义的数据段
    ……                ;程序代码
    mov ax,4c00h       
    int 21h              ;程序终止点,返回DOS
    ……                ;子程序代码
    end start            ;汇编结束
4.如何用repz cmpsb指令比较两个等长的字符串是否相同?请用文字说明。指令repz cmpsb结束重复执行的情况有哪些?
(1)、重复前缀指令repz用在cmps、scas指令前,利用计数器CX保存数据串长度,同时判断比较是否相等,可以理解为“当数据串没有结束(CX≠0),并且串相等(ZF=1),则继续比较”。
(2)、①ZF=0,即出现不相等的字符
②CX=0,即比较完所有的字符。在这种情况下,如果ZF=0,说明最后一个字符不等;而ZF=1表示所有字符比较完后都相等,也就是两个字符串相同。
内容
实验
1.设置各寄存器及存储单元的内容如下:(DS)=5000H,(ES)=5000H
(50010H)=48H,(50011H)=65H,(50012H)=6CH,(50013H)=6CH,(50014H)=6FH,(50015H)=20H, (50016H)=77H,(50017H)=6FH,(50018H)=72H,(50019H)=6CH,(5001AH)=64H,(5001BH)=21H
  设置各寄存器及存储单元的内容的步骤如下:
(1)设置寄存器内容,可直接在寄存器区单击寄存器名选中寄存器,直接输入寄存器的内容
(2)设置存储单元内容的汇编程序如下:
MOV  [0010],48H    注释:设置50010单元内容为48H
MOV  [0011],65H    注释:设置50011单元内容为65H
MOV  [0012],6CH    注释:设置50012单元内容为6CH
MOV  [0013],6CH    注释:设置50013单元内容为6CH
MOV  [0014],6FH  注释:设置50014单元内容为6FH
MOV  [0015],20H  注释:设置50015单元内容为20H
MOV  [0016],77H  注释:设置50016单元内容为77H
MOV  [0017],6FH  注释:设置50017单元内容为6FH
MOV  [0018],72H  注释:设置50018单元内容为72H
MOV  [0019],6CH  注释:设置50019单元内容为6CH
MOV  [001A],64H  注释:设置5001A单元内容为64H
MOV  [001B],21H  注释:设置5001B单元内容为21H
试编写一个程序段,将50010地址开始的12个内存单元的数据传送到从50020地址开始的内存单元中。并上机验证结果,将结果截图。
Mov cx,0ch
Mov si,offset 0010
Mov di,offset 0020  ;offset取偏移地址
Cld        ;方向标志DF清零,位置指针SIDI往正向(地址增大方向)移动
Rep movsb  ;movsb字符串传送指令,这条指令按字节传送数据  rep重复执行
2.完善以下程序,将数据段的sbuf指示的“Hello world!”字符串传送到数据段的dbuf缓冲区。要求在Turbo Debugger中调试该程序,数据区如下图所示。
DSEG SEGMENT
sbuf DB 'Hello world!','$'
dbuf DB   1 dup(0)  ;定义了13个字节的0
DSEG ENDS
CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG
START:MOV AX,DSEG
      MOV DS,AX
    MOV ES, AX 
      MOV CX, 0DH 
      MOV SI,OFFSET sbuf
      MOV DI,OFFSET dbuf
      CLD
    REP movsb     
      LEA DX,dbuf  ;取有效地址指令lea 将存储器地址送到一个寄存器
      MOV AH,09H
      INT 21H
      MOV AH,4CH
      INT 21H
      CSEG ENDS
      END START
   
3.用简化段定义的源程序格式改写以上汇编语言源程序。 
    .model small       
    .stack           
    .data             
sbuf db 'Hello world!','$'
dbuf DB   1 dup(0)
    .code               
start: mov ax,@data     
    mov ds,ax           
    mov es, ax 
    mov cx, 0dh 
    mov si,offset sbuf
    mov di,offset dbuf
    cld
    rep  movsb     
    lea dx,dbuf
    mov ah,09h
    int 21h
    mov ah,4ch
    int 21h
    end start
内容
实验
4.从DS:1000H开始存放有一个字符串”This is a string”,要求把这个字符串从后往前传送到DS:2000H开始的内存区域中(即传送结束后,从DS:2000H开始的内存单元的内容为”gnirts a si sihT”),试编写程序段并上机验证(将结果截图)。
assume cs:code,ds:datasg,ss:stack 
datasg segment   
db 'THIS IS A STRING'   
db 1000 dup(1) 
datasg ends 
stack segment   
dw 0,0,0,0,0,0,0,0 
stack ends 
code segment 
start:    mov ax,datasg 
mov ds,ax 
mov es,ax 
mov si,0 
mov di,30 
cld 
rep  movsb 
mov cx,16   
tag: CLD         
LODSB         
STD         
STOSB     
LOOP tag           
mov ax,4c00h       
int 21h 
code ends 
end start
5.用简化段定义的源程序格式编写一个汇编语言源程序。要求挑出数组中的正数(不含0)和负数,分别形成正数数组和负数数组。试编写程序段并上机验证(将结果截图)。
    .model small       
      .stack             
      .data               
count  equ 10
array  dw 23h,9801h,8000h,0f300h,5670h,4321h,0ff00h,0,765h,0a335h
ayplus  dw count dup(0)
ayminus dw count dup(0)
      .code
start:  mov ax,@data   
      mov ds,ax     
      mov si,offset array
      mov di,offset ayplus
      mov bx,offset ayminus
      mov ax,ds
      mov es,ax
      mov cx,count
      cld
again:  lodsw
      cmp ax,0
      jl minus
      jz next
      stosw
      jmp next
minus:  xchg bx,di
      stosw
      xchg bx,di
next:  loop again
      mov ax,4c00h       
      int 21h           
      end start           
正数在ds:0022h,如下图
负数在ds:0036h,如下图   
内容
实验
体  会、(100字以上)
本节实验课学习了传送数据指令rep movsb、rep movsw,还有串比较指令等等。熟悉了串操作指令的功能,了解了串操作指令的使用方法以及简化段定义格式的源程序框架。串传送指令movs是将数据段中的一个字节或字数据传送至附加段的额主存单元。串比较指令cmps是用源数据串减去目的数据串,以比较两者的关系。现在刚刚开始学,还不熟悉,只能参照实验报告学习,以后会多多练习,运用到实际的操作中去。
评语及成绩

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。