8086汇编语言程序设计 微机实验报告

更新时间:2023-09-16 03:49:01 阅读量: 高中教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

微 机 实 验 报 告

微机实验报告

第一部分:8086汇编语言程序设计

一、实验目的

通过上机练习,初步掌握8086的指令系统,熟悉8086汇编语言程序的编写格式,学会编写简单的汇编语言应用程序,初步学会使用DEBUG调试工具。

二、实验题目

(一)编程实现从字符串中查找特定的字符,记录特定字符的个数,并将结果在屏幕上显示,同时退出并返回DOS。(要求字符串从键盘上输入)

1、流程图

- 1 -

微 机 实 验 报 告

2、实验程序及注释 DATA SEGMENT

BUFSIZE DB 20 ;数据段

ACTCHAR DB ? ;定义字符串

CHARTEXT DB 20 DUP(?) ;给输入字符分配内存 DB '$'

CNT DB 0 ;给计数器分配内存 STRING1 DB 'PLEASE INPUT THE STRING:','$'

STRING2 DB 0AH,0DH,'INPUT THE WORD YOU WANT TO CHECK:','$' STRING3 DB 0AH,0DH,'THE NUMBER OF THE WORD IS:','$' DATA ENDS ;数据段结束 COSEG SEGMENT ;代码段 ASSUME CS:COSEG,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV DX,OFFSET STRING1 ;显示提示语:请输入字符串 MOV AH,09H ;输出字符串STRING1 INT 21H

MOV DX,OFFSET BUFSIZE ;从键盘输入字符串存入BUFSIZE MOV AH,0AH ;并送显 INT 21H

MOV DX,OFFSET STRING2 ;显示提示语:想查询的字符是 MOV AH,09H ;输出字符串STRING2 INT 21H

MOV AH,01H ;从键盘上输入字符到AL中并送显 INT 21H

MOV BX,OFFSET CHARTEXT ;将字符串首地址存入BX MOV CL,ACTCHAR ;置循环次数CX=字符串长度 XOR CH,CH

LP1: CMP AL, [BX] ;字符串从头开始与键入字符AL比较 JZ LP2 ;相等则转入LP2

INC BX ;指针指向字符串下一个字符 DEC CX ;循环次数减一 JNZ LP1 ;若还有未比较的字符,继续循环LP1 JMP FINI ;若全部比较完毕,跳转FINI LP2: INC CNT ;计数器增一

INC BX ;指针指向字符串下一个字符 DEC CX ;循环次数减一

JNZ LP1 ;若还有未比较的字符,跳至LP1 FINI: MOV DX,OFFSET STRING3 ;显示提示语:所查询的字符个数: MOV AH,09H INT 21H

MOV AL,CNT ;将计数器的值送AL

AAM ;将此值转换成非压缩BCD码

- 2 -

微 机 实 验 报 告

ADD AH,30H ;将BCD码转换为ASCⅡ码 MOV DL,AH ;高位送显 MOV AH,02H INT 21H

MOV AL,CNT ;再将计数器的值送AL AAM

ADD AL,30H ;将BCD码转换为ASCⅡ码 MOV DL,AL ;低位送显 MOV AH,02H INT 21H

MOV AH,4CH ;结束 INT 21H

COSEG ENDS ;代码段结束 END START ;程序结束

3、运行结果

PLEASE INPUT THE STRING(先输入字符串):ASDFAAD↙

INPUT THE WORD YOU WANT TO CHECK(输入待查找字符): A↙ THE NUMBER OF THE WORD IS(数量为):3↙

PLEASE INPUT THE STRING(先输入字符串):ASDFAAD↙

INPUT THE WORD YOU WANT TO CHECK(输入待查找字符):9↙ THE NUMBER OF THE WORD IS(数量为):0↙

PLEASE INPUT THE STRING(先输入字符串):ASDFAAD↙

INPUT THE WORD YOU WANT TO CHECK(输入待查找字符): S↙ THE NUMBER OF THE WORD IS(数量为):1↙

4、程序改进

1循环次数的改进 ○

原来的程序:MOV CX,19

改进原因:此程序表明无论输入的字符串多长,即使没有达到限定的最大字符

串的长度,也要循环19次。

改进后的程序:MOV CL,ACTCHAR

XOR CH,CH

改进结果:ACTCHAR即所输入的字符串的实际长度,因此,实际为置循环次

数CX=字符串长度,这样可以提高运行速度

2删除多余语句 ○

原来的程序:

LP1: CMP AL,[BX] ;将字符与字符串逐个比较 JZ LP2 ;相等则转入LP2

INC BX ;指针指向字符串下一个字符 DEC CX ;循环次数减一

CMP CX,0000H ;若还有未比较的字符

- 3 -

微 机 实 验 报 告

JNZ LP1 ;继续循环LP1

JMP FINI ;若全部比较完毕,跳转FINI LP2: INC CNT ;计数器增一

INC BX ;指针指向字符串下一个字符 DEC CX ;循环次数减一

CMP CX,0000H ;若还有未比较的字符 JNZ LP1 ;跳转LP1

改进原因:DEC为自减一,若减为0,它会自动影响其标志位ZF,所以不用把

CX再与00H比较,判断CX是否为零。

改进后的程序:(删除CMP CX,0000H) LP1: CMP AL, [BX] ;字符串从头开始与键入字符AL比较 JZ LP2 ;相等则转入LP2

INC BX ;指针指向字符串下一个字符 DEC CX ;循环次数减一 JNZ LP1 ;若还有未比较的字符,继续循环LP1 JMP FINI ;若全部比较完毕,跳转FINI LP2: INC CNT ;计数器增一

INC BX ;指针指向字符串下一个字符 DEC CX ;循环次数减一

JNZ LP1 ;若还有未比较的字符,跳至LP1

(二)编程实现把键盘输入的两位BCD码,在屏幕上用16进制数显示出来。 1 流程图 初始化

键入字符

判断是否在0到9之间

转化为十进制数

除以16

将整数部分和余数部分转化为ASIIC码,并送显

返回DOS

2、实验程序及注释 CODE SEGMENT ASSUME CS:CODE

START: CALL DECIBIN ;调用十进制转二进制子程序 CALL CRLF ;调用添加回、换行符子程序

CALL BINIHER ;调用二进制转十六进制并显示子程序 CALL CRLF ;调用添加回、换行符子程序

- 4 -

微 机 实 验 报 告

MOV AH,4CH INT 21H DECIBIN PROC

MOV BX,0 ;BX清零

MOV CL,2 ;限定输入两位BCD码

NEW: MOV AH,1 ;DOS调用,键入字符并回显 INT 21H

SUB AL,30H ;比较键入字符是否在0到9之间

JL NEW1 ;小于零,即不在范围内,就跳到NEW1 CMP AL,9

JG NEW1 CBW XCHG AX,BX MOV CX,10 MUL CX XCHG AX,BX ADD BX,AX POP CX DEC CL JNC NEW

RET NEW1: PUSH CX MOV AH,3 INT 10H MOV AH,2 DEC DL INT 10H POP CX JMP NEW

DECIBIN ENDP BINIHER PROC

MOV CH,4 RORATE: MOV CL,4 ROL BX,CL MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH

JL NEXT ADD AL,7H

NEXT: MOV DL,AL MOV AH,2 INT 21H

DEC CH ;左>右则转移

;将一个字节转化为字

;交换两个寄存器之间的内容 ;十进制数10入CX

表达式的值与AX内容相乘,并将结果存于AX ;返回到原来调用指令的下一条指令

;NEW1为固定光标程序,直到输入0-9 数字,光标才会移动 ;记录转换后的十六进制位数

;利用CL当计数器,记录寄存器数位移动次数 ;循环左移四位,相当于除以16 ;把BX低八位BL内数据转移至al ;高四位清零 ;AL小于等于3AH转移 ;把ASCII码装入DL ;DOS调用,显示字符 ;CH减一,减到零时,零标志置1

- 5 -

本文来源:https://www.bwwdw.com/article/qn5h.html

Top