当前位置:文档之家› 微机原理实验报告(排序,计算)

微机原理实验报告(排序,计算)

《微机原理与接口技术实验报告》汇编语言循环结构程序设计一、实验目的1. 理解各种指令的功能。

2. 进一步学习程序的调试。

二、实验内容:1.编制程序,对这组数进行排序,并输出原数据及排序后数据; 2.利用DEBUG 调试工具,用D0命令,查看排序前后,内存数据的变化; 3.去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值; 4.用学过的压栈PUSH 和出栈POP 指令,将平均值按位逐个输出; 5.将平均值转化为二进制串,并将这组二进制串输出。

6. 所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在屏幕上。

三、程序流程图四、程序清单DATA SEGMENTSR DB 100,?,50 DUP (?)VAR DW 5 DUP (0)AVG DW ?TEN DW 10P DW3D DW 2X DW?Y DW?MESG1 DB 13,10,'PLEASE INPUT:$'XS1 DB 13,10,'ORIGIN:$'XS2 DB 13,10,'NOW:$'XS3 DB 13,10,'MAX:$'XS4 DB 13,10,'MIN:$'XS5 DB 13,10,'AVG:$'XS6 DB 13,10,'AVG2:$'DATA ENDSSTACK SEGMENTDW 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATAMOV DS,AXMOV ES,AXMOV DX,OFFSET MESG1MOV AH,09HINT 21HLEA DX,SRCLDMOV CX,5LEA SI,SRADD SI,2LEA DI,VARIN_LOOP:MOV x, 0MOV Y,0_INX:MOV AH, 01HINT 21H;-------------------------------- CMP AL, '0'JB OKKCMP AL, 3AHJB SUB_30H;-------------------------------- JMP OKK;-------------------------------- SUB_30H:SUB AL, '0'MOV AH, 0MOV Y, AXMOV AX, xMUL TENADD AX, YMOV x, AXJMP _INX;-------------------------------- OKK:MOV AX,xSTOSWINC SILOOP IN_LOOP;-------------------------ORIGIN--- MOV DX,OFFSET XS1MOV AH,09HINT 21HMOV CX,5LEA SI,VARLOOPXS1:CALL XSLOOP LOOPXS1;-------------------------------CLDMOV CX,4MOV DX,1LOOPPX: CALL PXINC DXLOOP LOOPPX;----------------------------NOW-- MOV DX,OFFSET XS2MOV AH,09HINT 21HMOV CX,5LEA SI,VARLOOPXS2:CALL XSLOOP LOOPXS2;----------------------------MAX--- MOV DX,OFFSET XS3MOV AH,09HINT 21HLEA SI,VARADD SI,8CALL XS;-----------------------------MIN--- MOV DX,OFFSET XS4MOV AH,09HINT 21HLEA SI,VARCALL XS;-----------------------AVG------ MOV DX,OFFSET XS5MOV AH,09HINT 21HMOV AX,[SI]MOV BX,[SI+2]ADD AX,BXMOV BX,[SI+4]ADD AX,BXCWDIDIV PLEA SI,AVGMOV [SI],AXCALL XS;----------------------AVG2---------- MOV DX,OFFSET XS6MOV AH,09HINT 21HMOV CX,16LEA SI,AVGMOV AX,[SI]LPAVG: CWDSHR AX,1 ;to CFJB ONEMOV DX,0JMP PPONE: MOV DX,1PP: PUSH DXLOOP LPAVGMOV CX,16AVG2XS:POP DXADD DL,30HMOV AH,02HINT 21HLOOP AVG2XSEXIT: MOV AH,4CHINT 21HXS PROCLODSWMOV BX,1ZL1: CWDIDIV TENPUSH DXCMP AX,0JZ ZL2INC BXJMP ZL1ZL2: POP DXADD DL,30HDEC BXMOV AH,2INT 21HJNZ ZL2MOV DL,20HMOV AH,02HINT 21HRETXS ENDPPX PROCPUSH CXMOV CX,5SUB CX,DXMOV SI,0RECMP: MOV AX,VAR[SI]CMP AX,VAR[SI+2]JLE NOCHXCHG AX,VAR[SI+2]XCHG AX,VAR[SI]NOCH: ADD SI,2LOOP RECMPPOP CXRETPX ENDPCODE ENDSEND START五、运行结果按照实验要求,我们输入了“300,250,280,240,260,”。

在输入完最后一个逗号以后,下列的数据自动弹出。

经验算,计算答案正确。

运行结果截图如下:在原题目要求的基础上,我的程序做出了如下改进:●对分隔符的要求很低:输入数据时,可以以任何非数字的字符作为分隔符。

这样一来还有一个好处:程序并不会因为键入失误而异常跳出,只会将该数认作“0”。

●对于单个数字的长度并没有严格要求:只要数字大小在一个字以内都可以。

●对比其他大部分同学,我的提示字符写的更加国际化,而不是简单用汉语拼音。

六、实验心得1)寄存器的隐含用法在实验前,我对各种寄存器的用法并不十分熟练,特别是对数据寄存器的把握比较模糊。

在编程中我发现,到最后,数据寄存器往往都是用于做一些特定的工作。

比如说:我们给CX赋值,规定循环次数;给SI赋值,类似的作为一个指针……后来我看书发现,这其实都是它们的隐含使用,这在书上都有详细的介绍。

掌握好寄存器的隐含使用,可以减少编程时的碰壁,不至于一直变换寄存器的使用。

数据寄存器的隐含使用表如下:2)程序编写的严谨性与程序纠错反思中我发现,实验中遇到的大多数问题,都是粗心大意的小错误。

下列举几个最让我痛心疾首的例子,以及对应的解决方案:3)程序方法使用的有效性对比在初期阶段,我对汇编语言的掌握并不熟悉,编程的目标停留在完成确切的“功能”。

在不断地查书与使用编程的过程中,我发现每一个汇编指令都有它存在的价值和意义。

更好的掌握这些语言,更多地运用、体会,会使我们更加有效地编程。

下面举两个简单的小例子:●XCHG 和双MOV要交换两个数,用C语言的思想来做,第一个出现在脑海里的方法必然是MOV,再利用一个中间变量。

比如说在C语言中,要交换X、Y两个变量中的数据时,我们写的程序是:Z=X; //将一个数X暂存在中间变量Z中X=Y; //将另一个数Y付给这个数XY=Z; //将暂存在Z中的老X付给Y这在C语言中实现的难度不大。

、但是在汇编中,我们有现成的交换指令可以使用:XCHG X,Y这样一来,涉及到的变量少了,语句少了,犯错的可能也减少了。

同时也使我们的程序更加简洁易懂。

●ADD和双INCINC着实是一个简单使用的指令:自加1。

特别是作为指针时,我们常常会用到这个指令来平移指针。

由于十分简洁(比ADD指令至少少打两个字符),有时造成了滥用。

开始我也觉得没有大问题。

但是在后期复查修改的时候,我常常会以为这是我打多了的,或者是看漏一句,以至于认为“程序问题出在这里!”。

INC往往对读程序的人有一种定向的误导,这是应该注意的(至少是针对我自己)。

该好好写【ADD X,2】就不要偷懒写成【INC X ;INC X ;】,这本身对处理器的速度和资源就是一种浪费。

4)关于输入方式做出的改进之前的输入方法比较死板,是以字符串作为输入的,并且每个数字必须以“空格”结尾。

若是输入错误,程序会立即跳出,连纠错的机会都不给。

因此,我改成了后来的字符输入。

缺点是输错了就没法改,但是它对分隔的要求相当的低,不会出现闪退。

而且理论上来说,若数据量大的时候,运算速度相对会快些。

(因为是边输入,边处理输入数据)原方案程序:字符串输入,每个数以空格结尾。

子程序源码如下:CHANGE PROC ;输入数据预加工MOV BX,1 ;用以记录数字长度MOV DX,0ZH1: MOV AX,0LODSB ;读取SI所指至AL,并自加SICMP AL,20H ;关键!检测空格JZ ZH2 ;到了空格,表示一个数输入完毕,开始处理INC BXJMP ZH1 ;没到空格就继续读ZH2: SUB SI,BX ;用指针依次取数DEC BXDEC BXCMP BX,0 ;录入完毕则开始取下一个数JZ ZH4ZH3: MOV AX,0 ;先清零LODSB ;读取SI所指至AL,并自加SISUB AL,30H ;转化成数字ADD AX,DX ;累积MUL TENMOV DX,AXDEC BXJNZ ZH3ZH4: MOV AX,0LODSBSUB AL,30HADD DX,AXMOV AX,DXSTOSW ;把字数据以16进制存入VAR数据串中INC SIRET ;输入转化子程序CHANGE ENDP5)语言学习方法在学习汇编语言的时候发现,在学习方法上其实和C语言、Java语言都有共性。

针对我的学习习惯来说,我倾向于先掌握一些基本指令,然后查找相关简单例程读懂,找到成功的例程的一些共性,再自己练习编写自己的程序。

这样的学习方法比较适用于有应用方面需求的人,若是要更加理解透彻,必须从微处理器结构开始理解。

不过我认为,先学会编程再反过来深入学习硬件结构也未尝不可。

毕竟我们大三这么忙……6)做完实验一定要‘保存’这回做完实验忘了保存!!以至于又花了一晚上重新编了一次虽然这样很能加深印象,但是真的好不值啊啊啊啊编程员最应该有的素质之一——实时保存啊啊啊。

相关主题