北京理工大学汇编实验报告3

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京理工大学汇编实验报告3

本科实验报告实验名称:实验三字符串操作实验

课程名称:

课程设计Ⅰ(CPU与汇编)(实

验)实验时间:

第5-10周周五

下午

任课教师:聂青实验地点:10-102

实验教师:苏京霞

实验类型:☑原理验证□综合设计□自主创新

学生姓名:罗逸雨

学号/班级:1120141208 05211401 组号:3 学院:信息与电子学院同组搭档:

专业:通信工程成绩:

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 前。

上述指令涉及的寄存器:段寄存器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

MOV DL,0AH ;输出回车、换行

MOV AH,02H

INT 21H

MOV DL,0DH

MOV AH,02H

INT 21H

LEA DX,BUF2 ;输入字符串BUF2

MOV AH,0AH

INT 21H

MOV AX,0

LEA DI,BUF1

LEA SI,BUF2

CLD

MOV CX,COUNT1

REPZ CMPSB

JNZ L1 ;BUF1和BUF2不同,跳转至L1 L2:

MOV AL,0H

JMP EXID

L1:

MOV AL,1H

EXID:

MOV BL,AL

MOV DL,0AH ;输出回车、换行

MOV AH,02H

INT 21H

MOV DL,0DH

MOV AH,02H

INT 21H

ADD BL,30H ;将AL中的内容输出

MOV DL,BL

MOV AH,02H

INT 21H

MOV AH,4CH

INT 21H

CODES ENDS

END START

程序分析:本程序的难点在于从键盘输入两字符串BUF1、BUF2。为了成功输入,要在两次输入之间加上输出回车、换行。初始化BUF1、BUF2内存区域时,应设置相同的空间大小便于后续比较BUF1、BUF2中的字符。利用0A号功能进行输入字符串时,要注意初始化时的固定格式。输入前应将字符串有效地址放入DX中。利用串操作指令CMPSB逐个比较DS:SI和ES:DI中的字符。利用CLD 指令可以方便地使SI、DI在每次串操作指令后递增。输出AL中的内容0、1时应先将其转换成ASCII码30H、31H再输出。

框图:

开始

相关文档
最新文档