211123班北邮微原软件实验报告.docx
《211123班北邮微原软件实验报告.docx》由会员分享,可在线阅读,更多相关《211123班北邮微原软件实验报告.docx(42页珍藏版)》请在冰豆网上搜索。
![211123班北邮微原软件实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/22/b47ab4c1-c04d-4631-a252-ea7b1bf690ba/b47ab4c1-c04d-4631-a252-ea7b1bf690ba1.gif)
211123班北邮微原软件实验报告
2011211123班北邮微原软件实验报告
信息与通信工程学院
微机原理软件实验报告
班级:
2011211123
姓名:
学号:
日期:
2013.11.28
实验二分支、循环程序设计
一、实验目的
1.开始独立进行汇编语言程序设计;
2.掌握基本分支,循环程序设计;
3.掌握最简单的DOS功能调用。
二、实验内容
1.安排一个数据区,内存有若干个正数,负数和零。
每类数的个数都不超过9。
2.编写一个程序统计数据区中正数,负数和零的个数。
3.将统计结果在屏幕上显示。
4.(扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。
三、预习思考
1.十进制数0~9所对应的ASCII码是什么?
如何将十进制数0~9在屏幕上显示出来?
答:
0~9分别对应ASCII码的30H~39H。
将十进制数0~9显示在屏幕上,要用二进制数0~9分别加上30H。
2.如何检验一个数为正,为负或为零?
你能举出多少种不同的方法?
答:
和0相比是否相等,然后用该数和10000000相与,取出符号位判断,可区分正负。
还可以直接用CMP命令和0比较,然后用JZ等命令进行判断。
四、实验过程
1、流程图
2、源代码
DATASEGMENT
ARRAYDB8,0,0,5,8,-1,-2,-3,0,1,4,3
LENGEQU$-ARRAY;数组长度
POSIDB?
;正数个数
NEGTDB?
;负数个数
ZERODB?
;零的个数
POSIEVENDB?
;正偶数的个数
POSIODDDB?
;正奇数的个数
NEGTEVENDB?
;负偶数的个数
NEGTODDDB?
;负奇数的个数
POSICHARDB'Pos:
$'
NEGTCHARDB'Neg:
$'
ZEROCHARDB'Zero:
$'
EVENCHARDB'ou:
$'
ODDCHARDB'ji:
$'
CRDB0DH,0AH,'$';回车换行
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETARRAY-1
MOVCL,LENG;数组长度
MOVAL,0
LOP:
CMPCL,0;循环控制条件
JECALC
INCSI
DECCL
MOVBL,[SI];基址加变址寻址
CMPBL,AL;和零比较
JGISPOSI;是正数
JEISZERO;是零
JLISNEGT;是负数
ISPOSI:
INCPOSI;正数个数加一
ANDBX,1
ADDPOSIEVEN,BL;和1与之后的结果加到正偶数中
JMPLOP
ISZERO:
INCZERO
JMPLOP
ISNEGT:
INCNEGT;负数个数加一
ANDBX,1
ADDNEGTEVEN,BL;和1与之后结果加到负偶数中
JMPLOP
CALC:
MOVAH,POSI
MOVAL,POSIEVEN
SUBAH,AL;计算正奇数个数
MOVPOSIODD,AH
MOVAH,NEGT
MOVAL,NEGTEVEN
SUBAH,AL;计算负奇数个数
MOVNEGTODD,AH
PRINT:
;打印
MOVAH,09H
MOVDX,OFFSETPOSICHAR
INT21H
MOVAH,02H
MOVDL,POSI
ADDDL,30H
INT21H
MOVAH,09H
MOVDX,OFFSETEVENCHAR
INT21H
MOVAH,02H
MOVDL,POSIEVEN
ADDDL,30H
INT21H
MOVAH,09H
MOVDX,OFFSETODDCHAR
INT21H
MOVAH,02H
MOVDL,POSIODD
ADDDL,30H
INT21H
MOVDX,OFFSETCR
MOVAH,09H
INT21H
MOVAH,09H
MOVDX,OFFSETNEGTCHAR
INT21H
MOVAH,02H
MOVDL,NEGT
ADDDL,30H
INT21H
MOVAH,09H
MOVDX,OFFSETEVENCHAR
INT21H
MOVAH,02H
MOVDL,NEGTEVEN
ADDDL,30H
INT21H
MOVAH,09H
MOVDX,OFFSETODDCHAR
INT21H
MOVAH,02H
MOVDL,NEGTODD
ADDDL,30H
INT21H
MOVDX,OFFSETCR
MOVAH,09H
INT21H
MOVAH,09H
MOVDX,OFFSETZEROCHAR
INT21H
MOVAH,02H
MOVDL,ZERO
ADDDL,30H
INT21H
EXT:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
五、实验分析
实验结果如下:
六.预习题
1.十进制数0--9所对应的ASCII码是什么?
如何将十进制数0--9在
屏幕上显示出来?
答:
0-9的ascii码为,30h,31h,32h,34h,35h,36h,37h,38h,39h,
将要显示的数加上30h,得到该数的ascii码,再利用DOS功能调用显示单个字符
2.如何检验一个数为正,为负或为零?
你能举出多少种不同的方法?
答:
利用cmp指令,利用TEST指令,将该数与0相减,观察标志位。
检查最高位,为0是正数,为1时再检查其他位判断是负数或0
七、实验总结
通过上课和实验编程初步掌握了基本分支,循环程序的设计,数字的显示相关功能,即掌握了最简单的DOS功能调用。
但是用这种方法预见如果显示一串在程序中得到的数字,将会是比较繁琐的过程。
实验三代码转换程序设计
一、实验目的
1.掌握几种最基本的代码转换方法;
2.运用子程序进行程序设计。
二、实验内容
1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。
2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。
3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。
4.将整个程序分解为若干模块,分别用子程序实现。
在报告中要给出模块层次图。
三、预习思考
1.如何将输入的两个字符(0~9)变为十进制或二进制数?
答:
输入的字符0~9是ASCII码表示的,对应于30H~39H,通过减去30H,可以转换为相应的计算机数。
2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?
答:
如果采用输入时把ASCII码转换为数字,然后比较数字的大小再输出,那么输出时还需要把数字再次转换为ASCII码。
这是不明智的。
可以直接读入并存储数字的ASCII码,容易比较其大小,然后直接输出ASCII码即可。
3.你觉得采用二进制运算还是十进制运算更适合于这个实验?
答:
采用二进制或者十进制都需要进行ASCII码到数字的转换和其反向转换,换用新的思路可以大大简化编程负担。
即直接使用数字对应的ASCII比较,分别比较十位和个位,最后直接输出字符即可。
四、实验过程
1、流程图
2、源代码
DATA SEGMENT ;定义数据段
BUFFER DB 100
DB ?
DB 100 DUP(?
)
RESULT DB ?
STR1 DB 'please input number:
$'
STR2 DB 'The minimum :
$'
STR3 DB 'INPUT IS WRONG!
$'
CK DB ?
DATA ENDS
STACK SEGMENT STACK 'stack'
DB 100 DUP('s')
STACK ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:
CODE,DS:
DATA,SS:
STACK
START PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
;输出信息
AGAIN:
LEA DX,STR1
MOV AH,9
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
LEA DX,BUFFER
MOV AH,10
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
CALL CHECK
CMP CK,0
JZ AGAIN
CALL TRANSFORM
CALL COM
LEA DX,STR2
MOV AH,9
INT 21H
CALL DISPY
RET
START ENDP
;子程序check 检查是否符合规范
CHECK PROC
LEA BX,BUFFER+2
MOV CX,32H
MOV CK,1
NEXT1:
MOV AL,[BX]
CMP AL,39H
JNS WARNING
CMP AL,30H
JS WARNING
MOV AL,[BX+1]
CMP AL,39H
JNS WARNING
CMP AL,30H
JS WARNING
MOV AL,[BX+2]
CMP AL,0DH
JZ FINISH
CMP AL,20H
JZ NEXT
JMP WARNING
NEXT:
ADD BX,3
DEC CX
JNZ NEXT1
WARNING:
MOV DL,0AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
LEA DX,STR3
MOV AH,9
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV DL,0DH
MOV AH,2
INT 21H
MOV CK,0
FINISH:
RET
CHECK ENDP
;子程序transform进行排序算法
TRANSFORM PROC
LEA BX,BUFFER+2
NEXT3:
MOV AH,[BX]
AND AH,0FH
SAL AH,1
MOV DL,AH
MOV CL,2
SAL AH,CL
ADD AH,DL
MOV AL,[BX+1]
AND AL,0FH
ADD AL,AH
MOV [BX],AL
MOV AL,[BX+2]
ADD BX,3
CMP AL,0DH
JNZ NEXT3
RET
TRANSFORM ENDP
;子程序com进行输出结果
COM PROC
LEA BX,BUFFER+2
MOV AL,[BX]
NEXT2:
ADD BX,3
CMP AL,[BX]
JS NEXT4
MOV AL,[BX]
NEXT4:
MOV DL,[BX+2]
CMP DL,0DH
JNZ NEXT2
MOV RESULT,AL
RET
COM ENDP
子程序dispy进行显示
DISPY PROC
MOV BL,RESULT
MOV BH,0
NEXT6:
CMP BL,0AH
JS NEXT5
INC BH
SUB BL,0AH
JMP NEXT6
NEXT5:
ADD BH,30H
ADD BL,30H
MOV DL,BH
MOV AH,2
INT 21H
MOV DL,BL
MOV AH,2
INT 21H
RET
DISPY ENDP
CODE ENDS
END START
3、模块层次图
五、输出结果
说明:
对输入的数字进行了位数和范围的严格限制,即必须是两位数字,如果数字小于10,需要补齐零。
空格分隔不同数字输入,回车结束。
一位数后面空格为错误,回车后判断。
六.预习题
1如何将输入的两个字符(0--9)变为十进制或二进制数?
答:
将输入的字符减去30H,可得到十进制数
2如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?
答:
先定义一个字节的数据,分为十位和低位,每次将输入的数十位和已存的十位相比较,若小于则将输入的字符和已存的交换,大于则不交换,等于时比较个位,若小于则交换,最后将十位和个位分别加上30H变为相应的ascii码输出
3你觉得采用二进制运算还是十进制运算更适合于这个实验?
答:
十进制
七.实验心得与体会
这次的实验相较于上次复杂了很多,光编写代码的时间就用了2个小时,子程序设计的最重要的地方在于入口参数、出口参数的设计与主程序之间的关系。
还有子程序功能之前应该保护现场。
本实验主要将子程序设计在从键盘输入数字的功能,并设置标志,用于主程序确认输入是否正确。
分隔符、结束符的确认较为简单,只需一个比较就可以了。
数字的确认需要两个比较,即必须在0~9之间。
输入错误时调用09号功能输出提示字符串。
对于最小值的确认,初始应设为最大值99,以方便接下来的刷新。
得到最小值就将其赋给MIN,最后再位、个位分别输出。
总的来说,这次实验是第一次遇到比较多的挑战,但自己都慢慢的解决了,很有成就感。
实验四子程序设计
一、实验目的
1.进一步掌握子程序设计方法;
2.进一步掌握基本的DOS功能调用。
二、实验内容
1.从键盘上输入某班学生的某科目成绩。
输入按学生的学号由小到大的顺序输入。
2.统计检查每个学生的名次。
3.将统计结果在屏幕上显示。
4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜。
输出应便于阅读.尽可能考虑美观。
5.输入要有检错手段。
三、预习思考
1.如何确定一个学生在这门科目中的名次?
答:
1.可以抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次。
2.可以把学生成绩存入连续内存区域,即数组方式,取得每个学生的成绩偏移量,即成绩指针。
然后比较指针所指的成绩的大小,根据比较结果移动指针完成排序。
2.输入结束后,采用什么方法进行比较以得到学生的名次最为简单?
答:
采用移动指针完成排序的方法在汇编语言下实现,复杂度较高。
由于人数比较少,冒泡法还是比较简洁的。
冒泡法的时间和空间性能都还不错,可以接受。
3.
准备好模块层次图。
4.给出输出显示的形式。
答:
根据输入的每个学生的ID,成绩,列出一个表,后面跟着排名次数。
具体形式参见实验分析部分的输出截图。
四、实验过程
1、流程图