四川大学微机原理实验报告微机原理实验报告学院:专业班级:姓名学号实验一汇编语言编程基础1.3汇编语言程序上机操作和调试训练一.功能说明运用8086汇编语言,编辑多字节非压缩型BCD数除法的简单程序,文件名取为*.ASM。
运用MASM﹒EXE文件进行汇编,修改程序中的各种语法错误,直至正确,形成*.OBJ文件。
运用LINK.EXE文件进行连接,形成*.EXE文件。
仔细阅读和体会DEBUG调试方法,掌握各种命令的使用方法。
运用DEBUG。
EXE文件进行调试,使用单步执行命令—T两次,观察寄存器中内容的变化,使用察看存储器数据段命令—D,观察存储器数据段内数值。
再使用连续执行命令—G,执行程序,检查结果是否正确,若不正确可使用DEBUG的设置断点,单步执行等功能发现错误所在并加以改正。
二.程序流程图设置被除数、商的地址指针设置单位除法次数计数器取被除数一位作十进制调整作字节除法、存商N 被除数各位已除完?Y显示运算结果结束三.程序代码修改后的程序代码如下:DATA SEGMENTA DB 9,6,8,7,5B DB 5C DB 5 DUP (0)N EQU 5DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXCLDLEA SI,ALEA DI,CMOV CX,NMOV AH,0LP1: LODSBAADDIV BSTOSBLOOP LP1MOV CX,NLEA DI,CLP2: MOV DL,[DI]ADD DL,30HMOV AH,2INT 21HINC DILOOP LP2MOV AH,4CHINT 21HCODE ENDSEND START四.实验感想和收获通过这次试验,我对微机原理上级试验环境有了初步的认识,可以较为熟练地对汇编语言进行编译,汇编及连接,同时也学会了用DEBUG调试程序,收获很大。
在这次试验中我也遇到了一些困难。
在刚开始我发现自己无法打开MASM.EXE,计算机提示是由于版本不兼容。
我这才想起来我的操作系统是64位的,和该软件版本不兼容。
不过我并没有放弃,经过我的摸索之后,我发现用DOSBOX这个程序可以解决我的电脑运行不了该程序的问题。
在解决了第一个难题后,我开始着手改正试验 1.3中的语法错误和逻辑错误,但是无论我怎么修改却始终都无法通过编译,并且基本上每句话都有编译错误。
根据我多年编程的经验来看,这应该是中文输入法在搞鬼,之后我耐心地把程序重新输了一遍,果然通过了编译,并且之后的连接也进行的很顺利。
在用DEBUG调试时发现得出的结果也很正确。
尽管这次的实验内容非常简单,仅仅是教会我们一些基本的操作,但我却明显感觉到了汇编语言和C语言等高级语言所不同的地方。
越是底层,基础的东西就越不人性化,用C语言一行代码就能实验的功能在汇编语言中可能要花上数十行。
看来汇编语言的学习不是几周就能速成的,必须要有长年累月的积淀才能掌握。
实验二设计汇编语言程序一.功能说明练习1. 实验题目:编程计算下列表达式:A=90,B=-70,C=5,Y均为有符号数,计算Y=2×(A+B)+(A×C)÷5要编写一些稍微复杂的程序,我们会遇到一段程序被反复执行,这样,我们会用到LOOP指令。
使用该指令时,需在CX中装入循环次数。
练习2.码转换程序设计编制程序,把十进制数15786转化成二进制数。
提示:15786=1×10×10×10×10+5×10³+7×10²+8×10+6,循环CX=5练习3.编制程序,从键盘输入最多5个数,求他们的和,存入SUM。
练习4.用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。
提示:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。
对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。
每一遍的排序由若干次邻元素的排序组成。
4遍排序中,邻元素的排序依次为4,3,2,1遍。
完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。
外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DEC CX)排序遍数本遍排序前第一次排序后第二次排序后第三次排序后第四次排序后1 300,250,280,240,260 250,300,280,240,260250,280,300,240,260250,280,240,300,260250,280,240,260,3002 250,280,240,260,300 250,280,240,260,300250,240,280,260,300250,240,260,280,3003 250,240,260,280,300 250,240,260,280,300240,250,260,280,3004 240,250,260,280,300 240,250,260,280,300实验要求:1.编制程序,从键盘输入300,250,280,240,260这五个数,并思考如何输入任意五个数,五个数可以有一位数,二位数,三位数,四位数,五位数,混合输入比较大小;2.对这组数用冒泡法进行排序,并输出原始数据及排序后数据,两两数据之间用空格分隔;3.利用DEBUG调试工具,用D0命令,查看排序前后,内存数据的变化,以及会用调试命令查看程序运算中寄存器中的值;4.去掉最大和最小的两个值,求出其余值的平均值,并输出最大值,最小值和平均值;5.用压栈PUSH和出栈POP指令“先进后出”的特点,设计算法将平均值按位逐个输出(即输出263);6.用移位指令将平均值以二进制串的形式输出。
7.设计程序要有模块化的思想,用子程序实现不同的功能;所有数据输出前要用字符串的输出指令,进行输出提示(如:zui da zhi shi : 300等),所有数据结果能清晰地显示在电脑屏幕上。
二.程序流程图开始输出 'QING SHU RU 5 GE SHU JU'提示输入数据输入5个待排序的数据输出'PAI XU HOU DE SHU JU SHUN XU SHI :'CX=4(外循环)CX 入栈指针指向第一个数比较相邻两数大小,前一个数比后一个小?CX 减1,指针指向下一个数Y将这两个数交换位置NCX=0?N外循环CX 出桟并减1YCX=0?N输出排序后的五个数据Y三.程序代码练习一:DATA SEGMENTA DB 90B DB -70C DB 5Y DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BL,AMOV CL,BADD BL,CL ;A+BMOV AL,02HIMUL BL ;2*(A+B)MOV BX,AXMOV AL,AMOV CL,CIMUL CL ;A*CIDIV CL ;A*C/5 ADD AX,BXMOV Y,AXMOV AH,4CHINT 21HCODE ENDSEND START练习二:DATA SEGMENTA DW 15786DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV BX,AMOV CX,16LEFT: TEST BX,8000HJNZ L1 ;当首位为1,执行L1 MOV DL,'0' ;输出‘0’MOV AH,02HINT 21HSHL: SHL BX,1LOOP LEFTMOV AX,4CHINT 21HL1: MOV DL,'1' ;输出‘1’ MOV AH,02HINT 21HJMP SHLCODE ENDSEND START运行结果:练习三:DATA SEGMENTSUM DW ?HEHE DB ?,?,?,?,? DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXLEA SI,HEHEMOV BL,0MOV CX,5LOOP1: MOV AH,01HINT 21HSUB AL,30HMOV [SI],ALINC SILOOP LOOP1MOV CX,5MOV AX,0SUB SI,5LOOP2: ADD AL,[SI]AAAINC SILOOP LOOP2MOV BX,AXMOV SUM,AXMOV DL,BHADD DL,30HMOV AH,2INT 21HMOV DL,BLADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START运行结果:冒泡排序法程序:DATAS SEGMENTSHURU DB 'QING SHU RU 5 GE SHU JU',13,10,'$'SHU1 DB 4,?,3 DUP(?)SHU2 DB 4,?,3 DUP(?)SHU3 DB 4,?,3 DUP(?)SHU4 DB 4,?,3 DUP(?)SHU5 DB 4,?,3 DUP(?)AVER DB 3 DUP(?)SHUCHU DB 'PAI XU HOU DE SHU JU SHUN XU SHI',':','$'MAX DB 'ZUI DA ZHI SHI',':','$'MIN DB 'ZUI XIAO ZHI SHI',':','$'AVERAGE DB 'PING JUN ZHI SHI',':','$'CHUSHU DB 100,10HE DW ?STR1 DB 16 DUP(30H)STR2 DB 'PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU',':','$' DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART: MOV AX,DATASMOV DS,AXMOV ES,AXLEA DX,SHURU;显示QING SHU RU 5 GE SHU JU:INT 21HMOV CX,5;输入五个数字MOV SI,0INPUT: LEA DX,[SHU1+SI];输入要排序的原始数据MOV AH,10INT 21HMOV DL,10;输入后换行MOV AH,2INT 21HADD SI,5;指针加5,指向下一个变量LOOP INPUTCLDMOV CX,4;设定排序外循环次数A: MOV BP,0PUSH CX;外循环次数入栈PX: PUSH CXMOV CX,3LEA SI,[SHU1+BP+2];逐位比较两个数大小LEA DI,[SHU1+BP+7]REPZ CMPSBJB B;如果小于直接比较下一个数,否则两个数对换位置MOV CX,3Jh: MOV AL,SHU1[BP+2]XCHG AL,SHU1[BP+7];将两个字节对换位置,循环3次即完成这两个数的交换XCHG AL,SHU1[BP+2]INC BPLOOP JhSUB BP,3B: ADD BP,5;指向后面两个数字POP CXLOOP PXPOP CX;外循环次数出栈LOOP ALEA DX,SHUCHU;输出字符串'PAI XU HOU DE SHU JU SHUN XU SHI:' MOV AH,9INT 21HMOV CX,5MOV SI,2OUTPUT:PUSH CX;计数器入栈实现循环嵌套MOV CX,3L: MOV AL,[SHU1+SI];输出排序后的5个数字MOV DL,ALINT 21HINC SILOOP LMOV DL,2CHMOV AH,2INT 21HADD SI,2POP CX;计数器出栈LOOP OUTPUTMOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,MAX;输出字符串'ZUI DA ZHI SHI:' MOV AH,9INT 21HMOV CX,3MOV SI,2D: MOV DL,[SHU5+SI];输出最大值MOV AH,2INT 21HINC SILOOP DMOV DL,10;换行MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,MIN;输出字符串'ZUI XIAO ZHI SHI:' MOV AH,9INT 21HMOV CX,3MOV SI,2E: MOV DL,[SHU1+SI];输出最小值MOV AH,2INT 21HINC SILOOP EMOV DL,10MOV AH,2MOV DL,0DHMOV AH,2INT 21HLEA DX,AVERAGE;输出字符串'PING JUN ZHI SHI:'MOV AH,9INT 21HMOV CX,3MOV BX,10;除数10MOV SI,2AD: MOV DX,0MOV AH,0PUSH CXMOV CX,3ZH: MOV AL,[SHU2+SI];将十进制数转换为二进制数,为后面求平均值做准备SUB AL,30HPUSH AXMOV AX,DXMUL BXMOV DX,AXPOP AXADD DX,AXINC SILOOP ZH;执行3次完成3个十进制数的转换ADD SI,2POP CXADD HE,DX;将DX的数放在HE中LOOP AD;循环后得到三个十进制数转换为二进制数之后的相加和MOV DX,HE;MOV AX,DXXOR DX,DXMOV BX,3DIV BX;除3取平均值,结果将商放在AX中,余数放在DX中MOV BX,AX;给BX赋值平均数,然后将BX中表示的十进制数转换为对应的字符串DIV CHUSHU;除100取最高位ADD AL,30H;转换为ASCII码MOV AVER,ALMOV AL,AHXOR AH,AHDIV [CHUSHU+1];除10取十位ADD AL,30HADD AH,30H;余数就是个位MOV [AVER+1],ALMOV [AVER+2],AHMOV CX,3MOV SI,0F: MOV DL,[AVER+SI];输出平均值MOV AH,2INT 21HINC SILOOP FMOV DL,10MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,STR2 ;输出字符串'PING JUN ZHI DE ER JIN ZHI CHUAN SHU CHU:’ MOV AH,9INT 21HMOV CX,16MOV SI,0G: RCL BX,1;将平均数转换为二进制串JNC HADD [STR1+SI],1;如果不为0就将其加1变成1的ASCII码值H: MOV DL,[STR1+SI];将二进制串逐个输出MOV AH,2INT 21HINC SILOOP GMOV AH,4CHINT 21HCODES ENDSEND START运行结果:四.实验感想和收获本次实验相较于第一次难度增大了很多,本人花了大约12个小时才做完。