编辑: 无理的喜欢 | 2019-10-16 |
201209020108 成绩: 指导教师:李刚实验日期:
2014、
11、10 (实验报告如打印,纸张用A4,左装订;
页边距:上下2.
5cm,左2.9cm, 右2.1cm;
字体:宋体小四号,1.25倍行距.) 验证性、综合性实验报告应含的主要内容:
一、实验目的及要求
二、所用仪器、设备
三、实验原理
四、实验方法与步骤
五、实验结果与数据处理
六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见)
七、所附实验输出的结果或数据 设计性实验报告应含的主要内容:
一、设计要求
二、选择的方案
三、所用仪器、设备
四、实验方法与步骤
五、实验结果与数据处理
六、结论(依据"设计要求")
七、所附实验输出的结果或数据 * 封面左侧印痕处装订 实验目的及要求 微机原理与汇编语言程序设计期中测试小程序: 基于汇编语言的十进制数据的输入输出以及平均数的计算,该实验要求熟悉编程环境及进行程序基本结构练习,学会使用DOS和BIOS的基本功能调用,并进行子程序结构练习和高级汇编语言技术练习,最终实现一个具备人工交互页面的十进制数据的输入和平均数计算功能的小汇编程序.
二、所用仪器、设备 PC机、Masm for windows集成实验环境(或masm5.
0、masm6.
0、Emu8086等)、伟福实验系统.
三、实验原理 1,从键盘输入有符号十进制数的子程序 负数使用"-"引导,正数直接输入或者用"+"引导并实现如下功能 判断输入时正数还是负数,并用一个寄存器记录下来 接着输入0~9数字,并减30h转换成二进制数为后面计算做准备 然后将前面输入的数值乘十,并与刚才输入的数字相加得到新的数值 重复2)3)不直到输入一个非数字字符为止 如果是负数则进行求补,转化成不嘛;
否则直接将数据保存 2,向显示器输出有符号数十进制数的子程序 首先判断数据是零、正数、还是负数,是零显示"0"退出. 是负数,显示"-",求数据的绝对值 借着数据除以10,余数加30h转化成ASCII码压入栈中 重复步骤3),直到商为0结束 依次从堆栈中探出各位数字进行显示. 3,计算有符号数平均数的子程序. 将16位有符号二进制数求和,然后除以数据个数得到平均数,为避免溢出,被加数要进行符号位扩展,得到备长数据,然后求和.
四、实验方法与步骤 1.对数据段代码进行分析与编程 总数count为10的十进制数,要用数组记录这些数据,同事在子程序调用时会生成不同的数组,这样就涉及到wtemp、wmed等数组,为了增加输出界面的可读性,分别为每个子程序实现的功能加以描述,代码如下: string1 db 'Please input ten datas:',0dh,0ah,'$' string2 db 'There are what you input',0dh,0ah,'$' string3 db 'they are meaning is:',0dh,0ah,'$' count =
10 array dw count dup(0) wtemp dw ? wmed dw ? 2.堆栈段省略,直接编写代码段 期间要编写输入、输出、均值计算三个子程序,每个子程序又是不同嵌套调用的合成.例如输入子程序,一出口参数用寄存器ax传递,采用回车换行的方式确定一个数据的完成,当数据输入后首先要判断正负性、数据大小的检验并转化成二进制数值方便后期计算,其他两个子程序采用类似的方式思考和编程,在此基础商编写中框架程序,来调用这三个子程序实现完整的交互过程,具体代码如下: 总框架: mov dx,offset string1 mov ah,9 int 21h mov cx,count mov bx,offset array again:call read mov [bx],ax inc bx inc bx call dpcrlf loop again mov dx,offset string2 mov ah,9 int 21h mov cx,10 mov bx,offset array again1: mov ax,[bx] mov wtemp,ax call write inc bx inc bx call dpcrlf loop again1 mov dx,offset string3 mov ah,9 int 21h mov ax,10 push ax mov ax,offset wtemp push ax add sp,4 ;
mov wmed,ax mov ah,2 int 21h mov ax,4c00h int 21h 输入子程序: read proc push bx push cx push dx xor bx,bx xor cx,cx mov ah,1 int 21h cmp al,'+' jz read1 cmp al,'-' jnz read2 mov cx,-1 read1: mov ah,1 int 21h read2: cmp al,'0' jb read3 sub al,30h shl bx,1 mov bx,dx shl bx,1 shl bx,1 add bx,dx ;
mov ah,0 add bx,ax jmp read1 read3: cmp cx,0 jz read4 neg bx read4: mov ax,bx pop dx pop cx pop bx ret read endp 输出子程序 write proc push ax push bx push dx mov ax,wtemp test ax,ax jnz write1 mov dl,'0' mov ah,2 int 21h jmp write5 write1: jns write2 mov bx,ax mov dl,'-' mov ah,2 int 21h mov ax,bx neg ax write2: mov bx,10 push bx write3: cmp ax,0 jz write4 sub dx,dx div bx add dl,30h push dx jmp write3 write4: pop dx cmp dl,10 je write5 mov ah,2 int 21h jmp write4 write5: pop dx pop bx pop ax Ret write endp 均值计算 mean proc push bp mov bp,sp push bx push cx push dx push si push di mov bx,[bp+4] mov cx,[bp+6] xor si,si mov di,si mean1: mov ax,[bx] cwd add si,ax adc di,ax inc bx inc bx loop mean1 mov ax,si mov dx,di mov cx,[bp+6] idiv cx pop di pop si pop dx pop cx pop bx pop bp ret mean endp 光标回车换行 dpcrlf proc push ax push dx mov ah,2 mov dl,0dh int 21h mov ah,2 mov dl,0ah int 21h pop dx pop ax ret dpcrlf endp
五、实验结果与数据处理 程序运行结果:根据提示以回车结束连续输入10个数据,再按下回车就会将你所输入的数据和计算的结果显示出来
六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见) 本次汇编实现基本实现要求的功能,锻炼了自己思考涉及处理问题的能力,增强了动手编程时间的能力,但是实验过程中遇到了很到问题 1,数组传参不灵活,在程序衔接时总是得不到数据,于是增加了二个数字每次分别记录需要的数据以便使用 2,显示器显示数据混乱,分不清哪些是输入的数据哪些是计算的数据,于是增加了一些显性的字符串增强界面可读性 3,在子程序编写时要分别考虑不同的判断情况逻辑相对复杂.