微机原理软件实验报告文档格式.docx

上传人:b****3 文档编号:18438778 上传时间:2022-12-16 格式:DOCX 页数:40 大小:191.36KB
下载 相关 举报
微机原理软件实验报告文档格式.docx_第1页
第1页 / 共40页
微机原理软件实验报告文档格式.docx_第2页
第2页 / 共40页
微机原理软件实验报告文档格式.docx_第3页
第3页 / 共40页
微机原理软件实验报告文档格式.docx_第4页
第4页 / 共40页
微机原理软件实验报告文档格式.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

微机原理软件实验报告文档格式.docx

《微机原理软件实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理软件实验报告文档格式.docx(40页珍藏版)》请在冰豆网上搜索。

微机原理软件实验报告文档格式.docx

;

用于打印字符串定义

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模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1