实 验 报 告 课程名称: 微机原理与接口技术 实验名称: 实验三 串操作实验 专 业: 计算机科学与技术 学 号: 姓 名: 实验地点: 系统结构实验室 实验日期: 任课教师: |
实 验 目 的 | 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清零,位置指针SI或DI往正向(地址增大方向)移动 Rep movsb ;movsb字符串传送指令,这条指令按字节传送数据 rep重复执行 2.完善以下程序,将数据段的sbuf指示的“Hello world!”字符串传送到数据段的dbuf缓冲区。要求在Turbo Debugger中调试该程序,数据区如下图所示。 DSEG SEGMENT sbuf DB 'Hello world!','$' dbuf DB 13 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 13 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小时内删除。
发表评论