微机原理与接口技术 北邮 软件 实验报告

合集下载

北邮2012级微机原理与接口技术实验报告1

北邮2012级微机原理与接口技术实验报告1

北京邮电大学微机原理与接口技术实验报告学院:电子工程学院班级:学号:姓名:汇编语言程序的上机过程一、上机环境要运行调试汇编语言程序,至少需要以下程序文件:▪编辑程序:或其他文本编辑工具软件,用于编辑源程序。

▪汇编程序:MASM.EXE,用于汇编源程序,得到目标程序。

▪连接程序:LINK.EXE,用于连接目标程序,得到可执行程序。

▪调试程序:DEBUG.EXE,用于调试可执行程序。

二、上机过程汇编语言程序上机操作包括:编辑、汇编、连接和调试几个阶段。

1.编辑源程序用文本编辑软件创建、编辑汇编源程序。

常用编辑工具有:、记事本、Word等。

无论采用何种编辑工具,生成的文件必须是纯文本文件,所有字符为半角,且文件扩展名为.asm(文件名不分大小写,由1~8个字符组成)。

2.汇编用汇编工具对上述源程序文件(.asm)进行汇编,产生目标文件(.obj)等文件。

3.连接汇编产生的目标文件(.obj)并不是可执行的程序,还要用连接程序把它转换为可执行的EXE文件。

4.程序运行在DOS提示符下输入可执行程序的文件名即可运行程序。

5.程序调试在程序运行阶段,有时不容易发现问题,尤其是碰到复杂的程序更是如此,这时就需要使用调试工具进行动态查错。

常用的动态调试工具为DEBUG。

三、运行调试DEBUG是为汇编语言设计的一种调试工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段,它可以直接调试COM文件和EXE文件。

DEBUG状态下的所有数据都采用十六进制形式显示,无后缀H。

1.DEBUG的运行在DOS状态下,就可以进入DEBUG调试状态。

命令一:DEBUG ↙ (回车)格式二:DEBUG 可执行文件名↙(回车)进入DEBUG调试状态后,将显示提示符“-”,此时,可输入所需的DEBUG命令。

2.DEBUG的主要命令(1)显示内存单元内容的命令D(2)修改内存单元内容的命令E格式一:用给定内容代替指定范围的单元内容格式二:逐个单元相继地修改(3)检查和修改寄存器内容的命令R格式一:显示CPU内部所有寄存器内容和标志寄存器中的各标志位状态格式二:显示和修改某个指定寄存器内容格式三:显示和修改标志寄存器内容(4)运行命令G(5)跟踪命令T格式一:逐条指令跟踪格式二:多条指令跟踪(6)汇编命令A(7)反汇编命令U格式一:从指定地址开始,反汇编32字节格式二:对指定范围内的存储单元进行反汇编(8)执行命令P(9)退出DEBUG命令Q四、运行调试-DEBUG使用说明①在DEBUG中的提示符“-”下才能输入命令,在按回车键后,该命令才开始执行。

微机原理与接口技术软件实验报告

微机原理与接口技术软件实验报告

第一篇软件实验实验一存储器块操作实验一、实验目的1. 熟悉KEIL集成调试环境和汇编程序的调试方法。

2. 掌握存储器读写方法;3. 了解内存块的移动方法;二、实验说明实验1 指定某存储器的其实地址和长度,要求能将其内容赋值。

通过该实验学生可以了解单片机读写存储器的方法,同时也可以了解单片机编程、调试方法。

块移动是单片机常用操作之一,多用于大量的数据复制和图像操作。

例程2给出起始地址,用地址加1方法移动块,将指定源地址和长度的存储块移到指定目标为起始地址的单元中去。

移动3000H起始的256个字节到4000H起始的256个字节。

三、实验内容1. 试编程将片内RAM中的数据依次复制到片外RAM。

假设源数据区的首地址为40H,目的数据区的首地址为1000H,数据块长度为10H。

流程图:程序:运行结果:Memory显示,片内RAM中40H开始数据为03 00 29 00 00 00 71 00 AB 00 00 00 1E 00 00 FF,说明测试数据已经成功输入片内RAM。

从片外RAM中1000H位置开始记录为03 00 29 00 00 00 71 00 AB 00 00 00 1E 00 00 FF,说明片内RAM从40H开始的数据已经成功复制到片外从1000H开始的地址。

2. 两个16位无符号二进制数分别存放在片外RAM首址为2000H和2002H单元内,将它们相加,结果存入RAM 30H(低8位)、31H(高8位)。

程序(以0506H+CDEFH为例):0506H和CDEFH已存入片外单元,运算结果D2F5已存入30H和31H中。

四、思考题1. 如何将存储块的内容置成某固定值(例全填充为0FFH)?请用户修改程序,完成此操作。

答:将源程序中的MOV A, #01H 改为MOV A,#0FFH即可。

2. 若源块地址和目标地址有重叠,该如何避免?答:先执行一次数据转移操作将源块地址中的数据先暂存入一块地址与目标地址和源块地址均不重叠的存储区,再执行一次数据转移操作将暂存区的数据移入目标地址区域。

北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告

北京邮电大学微机原理软件实验报告信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告实验一DEBUG 的使用一、实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG 调试程序的方法。

二、实验内容1. 用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20 ;(自定)B DB 15 ;(自定)Y DB 3 DUP (0)Z DB 0, 0DAT ENDSSTA SEGMENT STACKDW 50 DUP (?)STA ENDSCOD SEGMENTASSUME CS: COD, DS: DATSTAR PROC FARPUSH DSXOR AX, AXPUSH AXMOV AX, DATMOV DS, AXMOV AX, STAMOV SS, AXMOV AL, AMOV Z, ALMOV Z+1, ALCALL SUB1MOV AL,B微机原理软件实验·报告MOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL, ZMOV AH, Z+1MUL AHADD WORD PTR Y, AXADC BYTE PTR[Y+2], 0RETSUB1 ENDPCOD ENDSEND STAR2. 通过编译,连接形成可执行文件。

3. 用DEBUG 将可执行文件调入,并进行调试。

1) 用D 命令观察数据区在内存中的具体内容,记录单元A 和B 的具体地址。

2) 用U 命令对目标代码反汇编,观察反汇编后的结果。

注意发现源程序的起始位置,并记录这个起始地址。

3) 用T 命令作单步跟踪调试。

比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。

北邮微机原理软件实验报告(精)

北邮微机原理软件实验报告(精)

北邮微机原理软件实验报告(精)微机原理软件实验报告实验二分支、循环程序设计一.实验目的1.启动独立的汇编语言编程。

2.掌握基本分支和循环编程。

3.掌握最简单的DOS函数调用。

二、实验内容1.安排一个数据区,内存有若干个正数,负数和零。

每类数的个数都不超过9。

2.编写一个程序统计数据区中正数,负数和零的个数。

3.将统计结果在屏幕上显示。

三.流程图IV源代码datasegmentzdw0;数据adw0中的零数;大于0 bdw0的数据数;数据中小于0的数量numdw9,8,0,-7,6,-5,-4,3,2,-1,0,-8,-1,9,0,0,1;设定的一组数据,其中4个0,7个正数,6个负数,符合题目要求NDW($-num/2);此组中的数据数量为类型0DB0DH,0ah,‘零的数量:$’类型1DB0DH,0ah,‘格雷特的数量:$'type2db0dh,0ah,'numberoflessthan0:$'locatedwtype0,type1,type2dataendsstacksegmentstackdw128dup(?stackendscodesegmentassumeds:data,ss:stack,cs:codestart:movax,datamovds,axmovax,stack莫夫斯,斧头;初始化DS和Ss以指向stamovbx,offsetnum;将num中第一个数字的地址送入bxmovcx,n;将n中数字个数送入cxloop1:movax[bx];取出num中的第一个数字cmpax,0;与零相比jzifz;判断结果为是0,跳转到ifz处继续执行salax,1jcifl;如果判断结果小于0,跳转到IFLincwordptra;否则,a自加,然后继续执行程序jmpcontinueifl:incwordptrb;B计数加上1jmpcontinueifz:incz;Z计数加1继续:addbx,2;指针+2,继续送入下一数字looploop1;循环cx次判断movcx,3;共显示3个字符串xorbx,bxdisp:movdx,定位[bx]movah,09h;dos09号功能调用,显示字符串int21hmovdx,z[bx]adddx,'0';转换为ASCII码movah,02h;dos02号功能调用,显示字符int21haddbx,2;指针+2(DW)loopdispmovax,4c00hint21h;返回dos系统codeendsendstart五.运行结果Vi预览问题1.十进制数0--9所对应的ascii码是什么?如何将十进制数0--9在屏幕上显示出来?。

微机原理与接口技术实验报告

微机原理与接口技术实验报告

微机原理与接口技术实验报告
本次实验是关于微机原理与接口技术的实验报告,通过本次实验,我们将深入
了解微机原理与接口技术的相关知识,并通过实际操作来加深对这些知识的理解和掌握。

实验一,微机原理。

在本次实验中,我们首先学习了微机的基本原理,包括微机的组成结构、工作
原理和基本功能。

通过实际操作,我们了解了微机的主要组成部分,如中央处理器(CPU)、内存、输入输出设备等,并学习了它们之间的工作原理和相互配合关系。

同时,我们还学习了微机的基本指令系统和数据传输方式,加深了对微机工作原理的理解。

实验二,接口技术。

在接口技术的实验中,我们学习了微机与外部设备之间的接口技术,包括并行
接口、串行接口和通用接口等。

我们通过实际操作,了解了这些接口技术的工作原理和应用场景,学会了如何通过接口技术实现微机与外部设备的数据交换和通信。

实验三,实验综合。

在本次实验的最后,我们进行了一个综合实验,通过实际操作来综合运用微机
原理和接口技术的知识,实现一个具体的功能。

通过这个实验,我们加深了对微机原理与接口技术的理解,掌握了如何将理论知识应用到实际操作中。

总结。

通过本次实验,我们深入学习了微机原理与接口技术的相关知识,并通过实际
操作加深了对这些知识的理解和掌握。

微机原理与接口技术作为计算机科学与技术的基础知识,对我们今后的学习和工作都具有重要意义。

希望通过这次实验,能够对大家的学习和工作有所帮助,并为今后的学习打下坚实的基础。

以上就是本次实验的实验报告,希望对大家有所帮助。

感谢大家的阅读!。

微机原理与接口技术实验报告

微机原理与接口技术实验报告

微机原理与接口技术实验报告实验目的:本次实验旨在熟悉并掌握微机原理与接口技术的相关知识,通过实例操作和分析实验数据,加深对微机原理与接口技术的理解。

一、实验器材与软件1. 硬件器材:计算机主机、外设设备2. 软件工具:操作系统、编程软件二、实验步骤及结果分析1. 实验1:计算机开机自检在实验中,通过开机启动计算机,观察计算机进行自检的过程。

根据显示屏上的自检信息,可以判断计算机硬件的工作状态。

2. 实验2:串口通信测试在本实验中,通过串口通信实现计算机与外设设备之间的数据传输。

首先,将串口接口连接到计算机主机,然后进行相应的设置,包括波特率、数据位、停止位和校验位等。

在实验中,通过编写相应的程序,实现计算机与外设设备之间的数据交互。

通过观察实验结果,判断串口通信是否正常。

3. 实验3:并口通信测试本实验旨在通过并行口通信实现计算机与外设设备之间的数据传输。

首先,将并行口接口连接到计算机主机。

然后,根据实验要求进行相应的设置,包括数据总线的宽度、传输模式等。

通过编写程序,实现计算机与外设设备之间的数据交互。

观察实验结果,判断并口通信是否正常。

4. 实验4:USB接口测试在本实验中,通过USB接口实现计算机与外设设备之间的数据传输。

首先,将USB接口连接到计算机主机。

然后,在计算机中安装相应的驱动程序。

通过编写程序,实现计算机与外设设备之间的数据交互。

观察实验结果,判断USB接口是否正常工作。

5. 实验5:网络接口测试本实验旨在通过网络接口实现计算机之间的数据传输。

首先,将计算机连接到局域网中的其他计算机。

然后,进行相应的设置,包括IP地址、子网掩码等。

通过编写程序,实现计算机之间的数据交互。

观察实验结果,判断网络接口是否正常工作。

三、实验总结通过本次实验,我对微机原理与接口技术有了更深入的了解,掌握了串口、并口、USB接口和网络接口等常用接口的使用方法。

通过实验的操作和分析,我对接口通信的原理和实现方式有了更详细的了解,对计算机与外设设备之间的数据传输有了更清楚的认识。

北邮微机原理实验报告

北邮微机原理实验报告

北邮微机原理实验报告微原软件实验报告班级:序号:学号:姓名:实验⼆分⽀,循环程序设计⼀.实验⽬的:1.开始独⽴进⾏汇编语⾔程序设计;2.掌握基本分⽀,循环程序设计;3.掌握最简单的DOS 功能调⽤.⼆.实验内容:1.安排⼀个数据区(数据段),内存有若⼲个正数,负数和零.每类数的个数都不超过9.2.编写⼀个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显⽰.三.预习题:1.⼗进制数0 -- 9 所对应的ASCII 码是什么? 如何将⼗进制数0 -- 9 在屏幕上显⽰出来?答:0—9对应的ASCII码是30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,将⼗进制数转换成相应的ASCII码并调⽤字符显⽰功能即能实现⼗进制数在屏幕上的显⽰。

2.如何检验⼀个数为正,为负或为零? 你能举出多少种不同的⽅法?答:将该数与0字符(ASCII码为30H)⽐较,根据⽐较的结果转⼊不同的分⽀。

四.流程图:开始初始化CX,BX,AH,DH,DL[BX] 0?[BX]=0?DH++DH 记录等于零的个数BX++BX++CX--AH++AH 记录⼩于零的个数DL++DL 记录⼤于零的个数CX 0?将AH,DH,DL 中的数转成ASCII 码并存储显⽰结束YES YES NOYESNO NO CX 是待处理的数的个数,BX 是这串数的⾸地址五.代码:六.运⾏结果:七.总结:第⼀次在DOS窗⼝下⽤汇编编程,⼀些基本的操作和以前的⾼级语⾔迥然不同,如建⽴⽂件,编译,链接,调试,这些操作都是要在DOS窗⼝中键⼊语⾔指令来完成的,不像⾼级语⾔的编译器只要按下相关的键就好了,⽤语⾔指令能更加明⽩编译,调试这些操作真正的含义。

更重要的是调试指令,通过这些指令,可以直接看到寄存器,内存中真真切切的变化,对硬件的⼯作机制特别是cpu的指令运⾏,内存的数据存储与读取,整个程序运⾏的本质过程有了更加透彻的了解和认识。

北邮微机原理软件实验报告

北邮微机原理软件实验报告

实验一1.实验要求:编一程序,将地址偏移量为100H单元开始的256个单元分别写入00H,01H,……,FFH数据;统计写入的数据块的0元素、正元素、负元素的个数,并分别将统计结果送入上述数据块后的三个单元中;用DOS功能调用显示上面数据快各单元(包括统计结果)内容,要求每行显示16个数据,两个数据之间用空格隔开。

程序设计思路:分配256个单元存放数据00H,01H,……,FFH,3个单元存放统计结果。

约定:DH存放0的个数,BH存放负数的个数,BL存放正数的个数,然后进行将256个数据一一与0进行比较,得到 DH、BH、BL。

将DH、BH、BL 存入SI的最后三个单元。

最后在以高、低4位,依次将每个单元的数据输出。

2. 程序流程:4.子程序:DISP PROC NEAR ;Show number MOV DL,AL MOV AH,2 INT 21H RET DISP ENDP开始初始化;SI 前256个单元存放00 H……FFH;CX=256;DH=0;BX=0;CMP AL ,0;MOV AL ,[SI] CX=0?将DH ,BX 存入SI ;INC SI ;CX=259;YESINC DH ;INC BHINC BL显示高4位显示低4位; 添加空格; INC SI ;BH=0??BH=16;CX=0?SF=ELSZF=1N ONO YE SN O终止YE实验二1.实验要求:编一程序,把键入的十六进制数转换成十进制,要求:(1)在屏幕上显示转换的十进制数,键入的最大值为FFFFH;(2)若键入非16进制的数,则提示错误;(3)程序中至少用一个子程序和宏命令。

2.程序设计思路:首先判断键入的字符是否为合法的十六进制字符,若是十六进制,将其转化成二进制数值,放入BX中,然后接收下一个字符,并将上一个字符左移4位,再讲此时的BX与接收到的BX相加,直到键入回车,停止接收。

然后通过除以10000,依次将余数除以1000、100、10、1,将二进制转化为十进制,再显示出来。

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

微机原理与接口技术软件实验报告实验B 分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS功能调用。

二、实验任务及内容1.安排一个数据区,内存有若干个正数,负数和零。

每类数的个数都不超过9。

2.编写一个程序统计数据区中正数,负数和零的个数。

3.将统计结果在屏幕上显示。

4. 选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.四、源程序DISPSTR MACRO STR ;打出字符串(属于DOS功能调用)MOV AH,9MOV DX,SEG STRMOV DS,DXMOV DX,OFFSET STRINT 21HENDMDISPNUM MACRO NUM ;打出数字(属于DOS功能调用)MOV AH,2MOV DL,NUMADD DL,30H ;加30H变为ASCII码INT 21HENDMDATA SEGMENTNUM DB 3,2,7,0,1,0,-5,-4,0COUNT EQU $-NUM ;统计数据个数ZEROS DB 0 ;各类数初值均为0PLUSES DB 0MINUSES DB 0EVENMINUSES DB 0ODDMINUSES DB 0EVENPLUSES DB 0ODDPLUSES DB 0ZEROSTR DB 0DH,0AH,'ZERO:$' ;待输出字符串PLUSSTR DB 0DH,0AH,'PLUS:$'MINUSSTR DB 0DH,0AH,'MINUS:$'EVENMINUSSTR DB 0DH,0AH,'EVENMINUS:$'ODDMINUSSTR DB 0DH,0AH,'ODDMINUS:$'EVENPLUSSTR DB 0DH,0AH,'EVENPLUS:$'ODDPLUSSTR DB 0DH,0AH,'ODDPLUS:$'DATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA, SS:STACKSTART PROC FARPUSH DS ;初始化MOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,COUNT ;CX控制循环次数MOV SI,OFFSET NUM ;SI指向数据的偏移地址LOOP1: CMP BYTE PTR[SI],0 ;将SI指向的内容与0比较大小JZ ZERO ;等于0跳转JG PLUS ;大于0跳转INC MINUSES ;负数加一SHR BYTE PTR[SI],1 ;判断是负奇数还是负偶数JNC EVENMINUS ;是负偶数跳转INC SI ;SI指针后移INC ODDMINUSES ;负奇数加一RETURN: LOOP LOOP1 ;循环直至CX=0JMP DISP ;循环结束后跳转至打出结果ZERO: INC ZEROSINC SIJMP RETURN ;返回循环体PLUS: INC PLUSESSHR BYTE PTR[SI],1JNC EVENPLUSINC SIINC ODDPLUSESJMP RETURNEVENPLUS: INC SIINC EVENPLUSESJMP RETURNEVENMINUS: INC SIINC EVENMINUSESJMP RETURNDISP: DISPSTR ZEROSTR ;打出结果DISPNUM ZEROSDISPSTR PLUSSTRDISPNUM PLUSESDISPSTR MINUSSTRDISPNUM MINUSESDISPSTR EVENPLUSSTRDISPNUM EVENPLUSESDISPSTR ODDPLUSSTRDISPNUM ODDPLUSESDISPSTR EVENMINUSSTRDISPNUM EVENMINUSESDISPSTR ODDMINUSSTRDISPNUM ODDMINUSESRETSTART ENDPCODE ENDSEND STARTend start五、程序运行结果进行统计的数据为3,2,7,0,1,0,-5,-4,0。

程序运行结果如下:六、回答预习题1.十进制数0 --9所对应的ASCII码是什么?如何将十进制数0--9在屏幕上显示出来?0--9的ASCII码为30H—39H。

若想将一个十进制数0—9的字符在屏幕上显示出来,首先应该把它所占寄存器的值赋给DL寄存器,然后DL寄存器的值加30H,然后执行02号DOS 功能调用,即执行以下代码“MOV AH,02”,“INT 21H”即可。

2.如何检验一个数为正,为负或为零?你能举出多少种不同的方法?1)可以用CMP指令将数与0比较,若为正数则可通过JG跳转;若为0可通过JE/JZ跳转;若为负数可通过JL跳转。

2)若只需判断是非负数或者负数,则可以用TEST指令将数与80H(DB情况下)或8000H(DW情况下)相与,若为非负数则可通过JE/JZ跳转;若为负数则可通过JNE/JNZ 跳转。

3)若只需判断是非负数或者负数,则也可以用SHL,SAL对数字进行左移,若为非负数可根据JNC判断;若为负数可以根据JC判断跳转。

4)若只需判断是非负数或者负数,则也可以用JS,JNS来进行判断,若为非负数可根据JNS跳转;若为负数可以根据JS判断跳转。

七、实验总结、建议要求、心得体会通过本次实验,我对宏定义和调用以及DOS功能调用有了更深的认识和学习。

同时,针对比较复杂的逻辑,需要将分支以及循环结构合理使用。

在对不同情况加以考虑时,要注意对不同判决条件的选择,不同的代码指令可能可以实现相同的功能。

实验的另一个收获是了解到了0—9字符ASCII码到实际数值的转化,为今后实验奠定了基础。

对于数字奇偶性的判断,可以采取不同的方法。

比如说可以使用TEST 语句实现对非0位的置0,而保留第0位来判断数字的奇偶性;或者使用SHR来对CF进行判断,也就是第0位。

使用不同的指令代码可以实现相同功能。

同时,考虑到输出的美观性,在汇编过程中,针对字符串,我有针对性的加入了0DH,0AH使得完成字符串输出的换行。

其中0AH是换行功能的ASCII码,0DH是回车功能的ASCII 码。

也是在本次实验中,我深刻认识到了宏定义与使用的重要性。

无论是输出字符还是字符串,这两个在实验中非常重要的功能完全可以通过简单的宏定义在汇编程序中多次调用。

使得汇编程序的可读性大大提高。

实验C 代码转换程序设计一、实验目的1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计。

二、实验任务及内容1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。

2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。

3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。

4.将整个程序分解为若干模块,分别用子程序实现。

在报告中要给出模块层次图。

三、程序流程图四、源程序(空格为两十进制数间的分隔符,空格为输入结束标志)DISPSTR MACRO STR (DOS功能调用)MOV AH,9MOV DX,SEG STRMOV DS,DXMOV DX,OFFSET STRINT 21HENDMDISPCH MACRO NUMMOV AH,2MOV DL,NUMINT 21HENDMDATA SEGMENTINSTR DB 31 ;最多能输入连回车在内的31个字符DB 0 ; 每输入一个两位数占3 byteDB 31 DUP(0)NUMS DB 10 DUP(0FFH) ;储存由字符串转化过来的实际数值COUNT DB ? ;记录实际数据的个数MIN DB 0FFH ;记录最小值,初始化为0FFHSTRIN DB 'PLEASE INPUT YOUR NUMBER:$'STRERR DB 0DH,0AH,'WRONG INPUT!',0DH,0AH,'PLEASE INPUT AGAIN:$' STROUT DB 0DH,0AH,'THE MINIUM IS:$'DATA ENDSSTACK SEGMENT STACK 'STACK'DW 100H DUP(0FFFFH)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXDISPSTR STRINAGAIN: MOV DX,OFFSET INSTR ;输入错误时重输入口MOV AH,0AHINT 21H ;用户输入字符串MOV SI,OFFSET NUMS ;SI指向数值起始位置MOV BX,DXADD BX,1 ;BX指向字符串长度字节MOV AL,[BX]MOV AH,0MOV CL,3DIV CL ;长度除以3得到有效数据个数CMP AH,0 ;余数不为0则输入必有误JNZ RESETMOV COUNT,ALMOV DX,0 ;DX压栈传递参数,初始为0,用于继续判断输入是否有误。

PUSH DXCALL CHECK ;调用过程CHECK继续判断输入是否有误POP DXCMP DX,1 ;弹出DX,DX得1时有误JE RESETCALL GETMIN ;调用过程找最小值DISPSTR STROUTMOV AH,0 ;此时CH中记载着最小数在数组中的偏移位置MOV AL,3 ;乘3得到在字符串中的偏移位置MUL CHMOV BX,AXADD BX,2DISPCH [BX]INC BXDISPCH [BX]DISPCH 0DHDISPCH 0AHRETRESET: DISPSTR STRERRJMP AGAINSTART ENDPCHECK PROC NEARMOV CH,0MOV CL,COUNTSUB CL,1 ;前COUNT-1次判断方式与最后一次略有不同INC BX ;BX指向字符串有实际意义的第一个字节LOOPCH: MOV AL,[BX] ;先判断前COUNT-1次,每一次循环判断连续三个字节AND AL,7FH ;最高位先置0CMP AL,'9' ;与'9'比大小,大则输入错误JA ERRORCMP AL,'0' ;与'0'比大小,小则输入错误JB ERRORSUB AL,'0' ;得到十位实际大小MOV DL,10MUL DL ;乘10放入DLMOV DL,ALINC BX ;BX后移一位MOV AL,[BX]AND AL,7FHCMP AL,'9'JA ERRORCMP AL,'0'JB ERRORSUB AL,'0'ADD DL,AL ;将个位的值累加到DL中,并将DL的值传给SI所指字节MOV [SI],DLINC SI ;SI指针后移MOV DL,0 ;DL重新置0INC BX ;BX继续后移MOV AL,[BX]AND AL,7FHCMP AL,' ' ;两数之间分隔符约定为','JNZ ERRORINC BX ;BX继续后移LOOP LOOPCHMOV AL,[BX] ;输入的最后三位的判断基本同上理,只是约定结束标志为'.' AND AL,7FHCMP AL,'9'JA ERRORCMP AL,'0'JB ERRORSUB AL,'0'MOV DL,10MUL DLMOV DL,ALINC BXMOV AL,[BX]AND AL,7FHCMP AL,'9'JA ERRORCMP AL,'0'JB ERRORSUB AL,'0'ADD DL,ALMOV [SI],DLINC SIMOV DL,0INC BXMOV AL,[BX]AND AL,7FHCMP AL,' 'JNZ ERRORJMP RETURNERROR: MOV BP,SP ;此时入栈的DX=0在SP+2处ADD BP,2MOV WORD PTR [BP],1 ;弹出DX后,DX将被置1RETURN: RETCHECK ENDPGETMIN PROC NEARMOV SI,OFFSET NUMS ;SI指向实际数值的偏移地址MOV DL,MIN ;DL记录已经比较过的数中的最小值MOV CL,COUNTLOOPF: CMP CL,0JZ RETU ;CL=0时结束循环CMP DL,[SI]JA GET ;若[SI]指向的值必现有最小值小则跳转DEC CL ;循环变量减1INC SI ;指针后移JMP LOOPFRETU: MOV MIN,DLRETGET: MOV DL,[SI] ;更新最小值INC SIMOV CH,COUNTSUB CH,CL ;CH=COUNT-CL记录新最小值的相对于NUMS的偏移地址DEC CL ;循环变量减1JMP LOOPFGETMIN ENDPCODE ENDSEND START五、程序运行结果六、回答预习题1.如何将输入的两个字符(0 – 9)变为十进制或二进制数?若想将连续两个0—9字符转换成十进制数,首先可以将第一个字符的ASCII码值减30H,得到实际的十位上的值。

相关文档
最新文档