当前位置:文档之家› 北京理工大学汇编实验报告3

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

北京理工大学汇编实验报告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 SEGMENTBUF1 DB 20,?,20 DUP(?)COUNT1 EQU $-BUF1BUF2 DB 20,?,20 DUP(?)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATASSTART:MOV AX,DATASMOV DS,AXMOV ES,AXLEA DX,BUF1 ;输入字符串BUF1MOV AH,0AHINT 21HMOV DL,0AH ;输出回车、换行MOV AH,02HINT 21HMOV DL,0DHMOV AH,02HINT 21HLEA DX,BUF2 ;输入字符串BUF2MOV AH,0AHINT 21HMOV AX,0LEA DI,BUF1LEA SI,BUF2CLDMOV CX,COUNT1REPZ CMPSBJNZ L1 ;BUF1和BUF2不同,跳转至L1 L2:MOV AL,0HJMP EXIDL1:MOV AL,1HEXID:MOV BL,ALMOV DL,0AH ;输出回车、换行MOV AH,02HINT 21HMOV DL,0DHMOV AH,02HINT 21HADD BL,30H ;将AL中的内容输出MOV DL,BLMOV AH,02HINT 21HMOV AH,4CHINT 21HCODES ENDSEND START程序分析:本程序的难点在于从键盘输入两字符串BUF1、BUF2。

为了成功输入,要在两次输入之间加上输出回车、换行。

初始化BUF1、BUF2内存区域时,应设置相同的空间大小便于后续比较BUF1、BUF2中的字符。

利用0A号功能进行输入字符串时,要注意初始化时的固定格式。

输入前应将字符串有效地址放入DX中。

利用串操作指令CMPSB逐个比较DS:SI和ES:DI中的字符。

利用CLD 指令可以方便地使SI、DI在每次串操作指令后递增。

输出AL中的内容0、1时应先将其转换成ASCII码30H、31H再输出。

框图:开始相同且CX 不为0?初始化BUF1,BUF2内存单元循环次数CX 设为字符串长度 SI 、DI 加一,CX 减一输入BUF1、BUF2字符串,设置SI 、DI 比较DS:SI 和ES:DI 中字符NY(2)DATAS SEGMENTBUF DB '12345678912345$' BUF2 DB 20 DUP('$') DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATAS START:MOV AX,DATAS MOV DS,AX MOV ES,AX LEA BX,BUF LEA SI,BUF结束AL=0ZF=1?NY AL=1LEA DI,BUF2CLDREPNZ CMPSBMOV AX,SISUB AX,BX ;计算BUF长度MOV DX,0 ;将AX中的内容转为10进制输出 MOV BX,10000DIV BXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,02HINT 21HMOV AX,BXMOV BX,1000MOV DX,0DIV BXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,02HINT 21HMOV DX,0 MOV BX,100 DIV BXMOV BX,DX MOV DL,AL ADD DL,30H MOV AH,02H INT 21HMOV AX,BX MOV BX,10 MOV DX,0 DIV BXMOV BX,DX MOV DL,AL ADD DL,30H MOV AH,02H INT 21HMOV DL,BL ADD DL,30H MOV AH,02H INT 21HINT 21HCODES ENDSEND START程序分析:本程序的难点在于将内存中的十六进制数转为十进制输出。

一个字能表示的最大十六进制数是65535,即十进制的五位数。

所以采用除10000、1000、100、10、1法,将商不断输出,再将余数作为下一次运算的被除数。

输出前要将原数加上30H转为ASCII码。

(3)DATAS SEGMENTBUF1 DB 'ABCDEFGHIJKLMN'COUNT1 EQU $-BUF1BUF2 DB 20 DUP(?)DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATASSTART:MOV AX,DATASMOV DS,AXMOV ES,AXLEA SI,BUF1LEA DI,BUF2CLDMOV CX,COUNT1REP MOVSB ;将BUF1中数据复制到BUF2中MOV AH,4CHINT 21HCODES ENDSEND START程序分析:本程序使用的串操作指令是MOVSB,该指令的功能为把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI。

利用该指令可以方便地将BUF1内存单元中的内容复制到BUF2内存单元中。

框图:开始初始化BUF1,BUF2内存单元装载DS、ES段,设置SI、DI循环次数CX设为BUF1长度(4)DATAS SEGMENTBUF1 DB 'ABCDEFGHIJKLMN'COUNT1 EQU $-BUF1DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATASSTART:MOV AX,DATAS SI 加一 DI 加一CX 减一 将DS:SI 中的内容复制到ES:DI 中 N CX=0? Y 结束MOV DS,AXMOV ES,AXMOV AL,'#'LEA DI,BUF1CLDMOV CX,COUNT1REPNZ SCASBJZ L1JNZ L2L1:MOV AL,0JMP EXIDL2:MOV AL,1EXID:MOV AH,4CHINT 21HCODES ENDSEND START程序分析:本程序使用的串操作指令为SCASB,其功能是把AL中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI。

本程序要实现的功能是查找字符'#',所以可将AL中的数据设置为'#'。

若一次循环过程中ZF=1,即说明原字符串BUF1中也含有字符'#'。

框图:初始化BUF1内存单元 循环次数CX 设为字符串长度 装载ES 段,设置DI 开始不同且CX 不为0? 结束DI 加一,CX 减一 N AL=0ZF=1? N Y Y AL=1(5)DATAS SEGMENTBUF1 DB '&YYYSS22323&&&&&&&g&&' COUNT EQU $-BUF1DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,ES:DATAS START:MOV AX,DATASMOV DS,AXMOV ES,AXMOV BX,0LEA DI,BUF1MOV CX,COUNTMOV AL,'&'CLDL: ;统计‘&’个数REPNZ SCASBJZ FOUNDJMP EXIDFOUND: ;发现一个‘&’INC CXINC BXLOOP LEXID:MOV AH,4CHINT 21HCODES ENDSEND START程序分析:本程序的目的是统计字符串中'&'的个数。

相关主题