北京理工大学汇编实验报告 下载本文

内容发布更新时间 : 2024/5/21 19:36:24星期一 下面是文章的全部内容请认真阅读。

本科实验报告

实验名称:实验三 字符串操作实验

课程设计Ⅰ(CPU与汇编)课程名称: (实验) 任课教师: 聂青 实验教师: 苏京霞 学生姓名: 罗逸雨 学号/班级: 1120141208 05211401 学 院: 信息与电子学院 专 业: 通信工程 第5-10周周五下实验时间: 午 实验地点: 10-102 ? 原理验证 实验类型: □ 综合设计 □ 自主创新 组 号: 3 同组搭档: 成 绩:

1 / 16

一、实验目的

1) 熟悉串操作指令的功能与应用;

2) 掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序; 3) 了解汇编语言字符串处理基本流程;

二、实验环境与原理

1.实验软硬件环境

1) 硬件环境:惠普 64 位一体化计算机及局域网;

2) 软件环境:Windows 8,红蜘蛛管理系统,MASM for Windows。

2.实验原理

1)字符串操作流程

SI寄存器保存源串首地址; DI寄存器保存目的串首地址; CX寄存器保存字符串长度;

CLD或STD指令设置字符串处理方向;

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。

REPNE/REPNZ判断计数寄存器的内容是否为0或ZF=1(即比较的两个操作数相等),只要满足一个则重复执行结束,否则继续执行。可以与 REPE/REPZ 配合工作的串指令有CMPS和SCAS。 3)字符串操作指令 lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据 DF 标志增减 SI; stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据 DF 标志增减 DI;

movsb、movsw:把 DS:SI 指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据 DF标志分别增减SI和DI; scasb、scasw:把AL或AX 中的数据与ES:DI 指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI; cmpsb、cmpsw:把DS:SI 指向的存储单元中的数据与 ES:DI 指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI;

rep:重复其后的串操作指令。重复前先判断 CX 是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。主要用在MOVS和STOS前。一般不用在 LODS

2 / 16

前。

上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器 AX、计数器CX。

涉及的标志位:DF、AF、CF、OF、PF、SF、ZF。

三、实验步骤

1) 编写程序,比较两个字符串BUF1和BUF2所含的字符是否相同,相同则AL返回0,不同AL返回1,字符串长度要求自动获取,要求用字符串处理方法。提示:输入两个字符串之后,将串操作所必须的寄存器等参数设置好,然后使用串操作指令进行从头到尾的比较,两个字符串相等的条件是串长度相等且对应的字符相同。 2) 编写程序,设有一字符串存放在以BUF为首址的数据区中,其最后一字符‘$’作为结束标志,计算该字符串的长度并输出。提示:从串的第一个字符开始统计,直到遇到定义的字符串结束符为止,看看在这个过程中总共有多少个字符,即求得串的长度。

3) 编写程序,将内存中BUF1某一区域的数据传送到另一区域BUF2中,要求用字符串处理方法。

4) 编写程序,在已知字符串中搜索特定字符‘#’,若找到则AL返回0,找不到 AL返回1,要求用字符串处理方法。 5) 编写程序,统计一串字符串中字符\出现的次数, 要求用字符串处理方法。 6) 编写程序,设有一字符串已存放在 STRBUF 为首址的数据区中,编一程序找出其中的‘#’字符,如果字符串中不存在‘#’字符则应该输出“Not found”。

四、程序清单与框图

(1)

DATAS SEGMENT

BUF1 DB 20,?,20 DUP(?) COUNT1 EQU $-BUF1

BUF2 DB 20,?,20 DUP(?) DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,ES:DATAS START:

MOV AX,DATAS MOV DS,AX MOV ES,AX

LEA DX,BUF1 ;输入字符串BUF1 MOV AH,0AH INT 21H

3 / 16