微机原理软件实验报告文档格式.docx
- 文档编号:18438778
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:40
- 大小:191.36KB
微机原理软件实验报告文档格式.docx
《微机原理软件实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理软件实验报告文档格式.docx(40页珍藏版)》请在冰豆网上搜索。
;
用于打印字符串定义
NEGTCHARDB'
Negtive:
ZEROCHARDB'
Zero:
EVENCHARDB'
Even:
ODDCHARDB'
Odd:
CRDB0DH,0AH,'
$'
回车换行的ASCII码
dataends
--------------------------------------------------------
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movsi,offsetarray;
offset指令取array的偏移地址
decsi;
偏移地址先减1
movcl,length;
数组长度赋予CL
xoral,al
lop:
cmpcl,0;
余下数组长度不为0,则继续循环
jeprint;
cl为0跳出循环
incsi;
偏移地址加1,比较下一位数字
deccl;
余下数组长度减1
movbl,[si];
采用寄存器间接寻址方式
cmpbl,0;
和0比较
jgposi;
正数跳转
jzzo;
零跳转
jlneg;
负数跳转
posi:
incpnum;
正数个数加1
testbx,01h;
检测最后一位是否是0
jzpep;
是0,即为偶数则跳转至pep
incpodd;
不是0,则正奇数个数加1
jmplop
pep:
incpeven;
正偶数个数加1
zo:
inczero;
零的个数加1
neg:
incnnum;
负数个数加1
检测最后一位是否是0
jznep;
是0,即为偶数则跳转至nep
incnodd;
不是0,则负奇数个数加1
nep:
incneven;
print:
movah,09h;
打印正数个数
movdx,offsetPOSICHAR
int21h;
系统功能调用
movah,02h
movdl,pnum
adddl,30h
int21h
movah,09h
movdx,offseteventchar
movdl,peven
movdx,offsetoddchar
movdl,podd
movdl,30h
movdx,offsetcr
movah,09h;
打印负数个数
movdx,offsetnegtchar
movdl,nnum
movdl,neven
movdl,nodd
movdx,offsetzerochar
movdl,zero
ext:
movax4c00h
codeends
endstart
实验分析
数据区待统计的数据为:
1,4,3,2,5,7,-1,-2,-6,0,0,0
实验结果如下图所示:
理论知识积累
1.EQU:
等价语句,一般使用格式为符号名EQU表达式,作用是左边的符号名代表右边的表达式,当把一个常量或表达式定义成一个具有一定含义的符号名后,在程序中就可以用该符号名来代表该常量或表达式。
等价语言不会给符号名分配存储空间,符号名不能与其他符号同名,也不能被重新定义。
2.test指令属于逻辑运算指令,功能是执行BIT与BIT之间的逻辑运算测试,tsst对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标致寄存器,结果本身不会保存(两操作数与运算,仅修改标志位,不送会结果)。
3.int21H系统调用(由DOS提供的一组实现特殊功能的子程序供程序员在编写自己的程序时调用,以减轻编程的工作量);
调用的实现步骤大概是系统功能送到寄存器AH中,入口参数送到指定寄存器中,用int21H指令执行功能调用,根据出口参数分析功能调用执行情况。
4.字符显示的实现问题,首先把数据转换成ASCII码,然后调用DOS功能将其显示。
要特别注意每段待输出的字符串都要以$结尾,不然无法识别串尾,输出乱码。
实验C代码转换程序设计
1.掌握几种最基本的代码转换方法;
2.运用子程序进行程序设计。
1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。
2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。
3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。
4.将整个程序分解为若干模块,分别用子程序实现。
在报告中要给出模块层次图。
1.如何将输入的两个字符(0~9)变为十进制或二进制数?
答:
输入的字符0~9是ASCII码表示的,对应于30H~39H,通过减去30H,高位数乘以十加上低位数,即变为十进制数。
2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?
可以直接读入并存储数字的ASCII码,容易比较其大小,然后输出时商和余数分别加上30H后显示在屏幕上。
3.你觉得采用二进制运算还是十进制运算更适合于这个实验?
采用二进制或者十进制都需要进行ASCII码到数字的转换和其反向转换。
直接使用数字对应的ASCII比较,分别比较十位和个位,最后直接输出十进制字符即可。
模块层次图
DATASEGMENT
INPUTDB100DUP(?
)
MINTMPDB'
9'
-30H,'
-30H;
最小值初始99
COUNTDB0D
IFERRORDB0D;
判断调用输入子程序是否有错
WELCOMEDB'
Pleaseinputnumbers:
'
'
OUTTIPDB'
Minimumis:
;
回车换行
ERROR1DB'
ERROR:
Characterisnotvalid!
;
错误输入提示
ERROR2DB'
Numbermustcontainstwodigits!
ERROR3DB'
Numberisempty!
ERROR4DB'
Needseparatechar!
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETWELCOME
CALLPRINT
MOVDX,OFFSETCR;
CALLGETNUM;
获取输入
CMPIFERROR,0;
判断输入过程是否有错
JNZBACK;
错误则直接返回DOS
MOVDX,OFFSETCR;
CALLFINDMIN;
查找最小数
MOVDX,OFFSETOUTTIP;
输出提示
MOVAH,02H
MOVDL,MINTMP;
输出最小值的十位
ADDDL,30H
INT21H
MOVDL,MINTMP[1];
输出最小值的个位
ADDDL,30H
INT21H
BACK:
MOVAX,4C00H;
返回DOS
MAINENDP
GETNUMPROC
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDI
MOVDI,0;
数组偏移地址
MOVCX,0;
标识数字的位数
GETLOOP:
MOVAH,01H;
从键盘读取一个字符
INT21H
CMPAL,0DH;
和回车比较
JEEXIT1;
是回车则结束输入
CMPCX,0;
数字位数为空
JECMPSPACE0
CMPCX,1;
数字位数为1
JECMPSPACE1
CMPCX,2;
数字位数为2
JECMPSPACE2
CMPSPACE0:
CMPAL,20H
JEGETLOOP;
位数为0,输入空格,忽略
JMPASCBIN;
否则读取字符
CMPSPACE1:
JEERR2;
位数为1,输入空格,出错
CMPSPACE2:
JNEERR4;
位数为2后,不输入空格,错误
XORCX,CX;
输入空格,清零重计
JMPGETLOOP
ASCBIN:
SUBAL,30H;
化为二进制
JLERR1;
小于,无效字符
CMPAL,9
JGERR1;
大于9是无效字符
MOVINPUT[DI],AL;
保存
INCCOUNT;
统计输入的数字个数
INCDI;
向后移动数组
INCCX
JMPGETLOOP
ERR1:
MOVIFERROR,1
MOVDX,OFFSETERROR1
JMPRETURN
ERR2:
MOVIFERROR,
MOVDX,OFFSETERROR2
CALLPRINT
JMPRETURN
ERR3:
MOVDX,OFFSETERROR3
ERR4:
MOVDX,OFFSETERROR4
EXIT1:
MOVBL,COUNT;
判断输入数的个数是否为零
CMPBL,0
JEERR3;
输入数目为0,输出错误,退出
ANDBL,01H;
判断数字是否为两位数
JNEERR2;
输入数字个数为奇数则出错
RETURN:
POPD
POPDX
POPCX
POPBX
POPAX
RET
GETNUMENDP
PRINTPROC
MOVAH,09H
PRINTENDP
FINDMINPROC
PUSHDI
PUSHCX
MOVDI,-2;
数组下标
MOVCL,COUNT;
把数组长度移入CX
MOVAL,CL
CBW
MOVCX,AX
LOP:
ADDDI,2
CMPCX,DI;
是否已经比较完毕
JEEXIT2;
比较完毕,退出
MOVAH,INPUT[DI];
否则接着比较,移入十位数
MOVAL,INPUT[DI+1];
移入个位数
CMPAH,MINTMP;
比较十位数,MINTMP低地址为十位
JALOP;
如果MINTMP小,则直接比较下一个数
JEHIGHEQU
;
如果十位数相等,比较个位数,再否则十位大就直接存储
STOMIN:
MOVMINTMP,AH
MOVMINTMP[1],AL
JMPLOP
HIGHEQU:
CMPAL,MINTMP[1];
比较个位数
JNBLOP;
个位数比MINTMP大则跳到下一个数
JMPSTOMIN;
否则将当前数写入为MINTMP
EXIT2:
POPCX
POPDI
FINDMINENDP
CODEENDS
ENDMAIN
实验中以空格为分隔符,空格的个数不限制,以回车为输入结束标志符。
对输入的数字进行了位数和范围的严格限制,即必须是两位数字,如果数字小于10,需要补齐零。
空格分隔不同数字输入,回车结束。
一位数后面空格为错误,回车后判断。
1.iferror:
如果公式的计算结果为错误,则返回指定的值;
否则返回公式的结果。
2.call指令(调用指令)功能主要有:
将下一条指令的所在地址即程序计数器PC的内容入栈,并将子程序的起始地址送入PC,于是CPU的下一条指令就会转去执行子程序。
实验D子程序设计
1.进一步掌握子程序设计方法;
2.进一步掌握基本的DOS功能调用。
1.从键盘上输入某班学生的某科目成绩。
输入按学生的学号由小到大的顺序输入。
2.统计检查每个学生的名次。
4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜。
输出应便于阅读.尽可能考虑美观。
5.输入要有检错手段。
1.如何确定一个学生在这门科目中的名次?
1.可以抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次。
2.可以把学生成绩存入连续内存区域,即数组方式,取得每个学生的成绩偏移量,即成绩指针。
然后比较指针所指的成绩的大小,根据比较结果移动指针完成排序。
2.输入结束后,采用什么方法进行比较以得到学生的名次最为简单?
采用移动指针完成排序的方法在汇编语言下实现,复杂度较高。
由于人数比较少,冒泡法还是比较简洁的。
冒泡法的时间和空间性能都还不错,可以接受。
3.准备好模块层次图。
4.给出输出显示的形式。
答:
根据输入的每个学生的ID,成绩,列出一个表,后面跟着排名次数。
具体形式参见实验分析部分的输出截图。
IDDB400DUP(?
);
存储学号
MARKDB20DUP(?
);
存储分数
RANKDB20DUP(?
存储排名
RANKTMPDB20DUP(?
临时排序指针
MTMPDB?
;
临时记录成绩
COUNTBDB?
总的学生的个数
COUNTWDW?
;
总的学生个数
CHEOKDB?
输入检查标志位
ERRORDB?
记录错误号
TMPDB2DUP(?
判断、计数
CRDB0DH,0AH,'
回车
TABDB09H,09H,'
输出TAB键
ERR0DB'
Inputcannotbeempty!
ERR2DB'
Characterisinvalid!
ERR4DB'
Markisinvalid!
ERR6DB'
Inputisinvalid!
ERRLISTDWERR0,ERR2,ERR4,ERR6
TIP0DB'
Pleasere-input:
TIP1DB'
Pleaseinputnumberofstudents:
TIP2DB'
PleaseinputIDandMARK:
PRTIPDB'
--------------RESULT---------------'
PRINFODB'
ID'
09H,09H,'
MARK'
RANK'
PRPRE1DB'
ID:
'
PRPRE2DB'
MARK:
BUFFDB16;
最长的字符长度
PRESDB?
;
存储实际输入字符数
CHARDB16DUP(?
);
实际可存储有效字符16个
PRINTTIPMACROPARA
MOVDX,OFFSETPARA
POPDX
ENDM
PRINTCHARMACROACHAR
MOVDL,ACHAR
DATA,ES:
MOVES,AX
CALLGETNUMBER;
人数
CALLGETINFO;
分数
CALLSORT;
排序
CALLPRINT;
显示
MOVAX,4C00H;
MAINENDP
GETNUMBERPROCNEAR
PUSHAX
PUSHBX
HE:
PRINTTIPTIP1
GREP:
CALLGETIN
MOVCHEOK,0
CALLCHECK
CMPCHEOK,0
JEGRETURN
MOVERROR,6
CALLPRINTERR
PRINTTIPTIP0
PRINTTIPCR
JMPGREP
ERRHERE:
PRINTTIPCR
PRINTTIPTIP0
JMPGREP
GRETURN:
CALLCHANGE
MOVAL,MTMP
CMPAL,0
JEERRHERE
MOVCOUNTB,AL
CBW
MOVCOUNTW,AX
POPBX
POPAX
RET
GETNUMBERENDP
GETINFOPROCNEAR
PUSHBX
PUSHSI
PRINTTIPTIP2
MOVTMP,0;
学号还是分数
XORBX,BX;
ID的偏移量
XORAX,AX;
记录学生数目
MORE:
PRINTTIPCR
CMPCOUNTB,AL
JNZHERE1
JMPRETURN;
计数器为0,返回父程序
HERE1:
CMPTMP,0
JEPR1
CMPTMP,1
JEPR2
PR1:
PRINTTIPPRPRE1
JMPHERE2
PR2:
PRINTTIPPRPRE2
HERE2:
CALLGETIN;
否则接受输入
CALLCHECK;
检查是否是数字且不为空
CMPCHEOK,0
JNECHEFAIL
JEISID;
输入学号
CMPTMP,1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 软件 实验 报告