微机原理软件实验报告.docx

上传人:b****3 文档编号:5451275 上传时间: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

微机原理软件实验报告

信息与通信工程学院

微机原理软件实验报告

班级:

姓名:

学号:

日期:

2015年11月

实验B分支、循环程序设计

一、实验目的

1.开始独立进行汇编语言程序设计;

2.掌握基本分支,循环程序设计;

3.掌握最简单的DOS功能调用。

二、实验内容

1.安排一个数据区,内存有若干个正数,负数和零。

每类数的个数都不超过9。

2.编写一个程序统计数据区中正数,负数和零的个数。

3.将统计结果在屏幕上显示。

4.(选作题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。

三、预习思考

1.十进制数0~9所对应的ASCII码是什么?

如何将十进制数0~9在屏幕上显示出来?

0~9分别对应ASCII码的30H~39H;

由于数字0~9的ASCII码值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数。

2.如何检验一个数为正,为负或为零?

你能举出多少种不同的方法?

一是直接用CMP命令和0比较(CMPX,0),然后检验标志位CF,CF=1则X为负数,CF=0接着检验ZF,ZF=1则X为零,ZF=0则X为正数;

二是使用逻辑或移位运算,和0相比是否相等,用数和10000000相与,取出符号位判断,可区分正负。

 

四、实验过程

流程图

源代码

datasegment

arraydb1,4,3,2,5,7,-1,-2,-6,0,0,0;自定义数组

lengthEQU$-array;数组长度

pnumdb?

;正数个数

nnumdb?

;负数个数

zerodb?

;零的个数

pevendb?

;正偶数个数

podddb?

;正奇数个数

nevendb?

;负偶数个数

nodddb?

;负奇数个数

POSICHARDB'Positive:

$';用于打印字符串定义

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

jmplop

zo:

inczero;零的个数加1

jmplop

neg:

incnnum;负数个数加1

testbx,01h;检测最后一位是否是0

jznep;是0,即为偶数则跳转至nep

incnodd;不是0,则负奇数个数加1

jmplop

nep:

incneven;正偶数个数加1

jmplop

print:

movah,09h;打印正数个数

movdx,offsetPOSICHAR

int21h;系统功能调用

movah,02h

movdl,pnum

adddl,30h

int21h

movah,09h

movdx,offseteventchar

int21h

movah,02h

movdl,peven

adddl,30h

int21h

movah,09h

movdx,offsetoddchar

int21h

movah,02h

movdl,podd

movdl,30h

int21h

movdx,offsetcr

movah,09h

int21h

;--------------------------------------------------------

movah,09h;打印负数个数

movdx,offsetnegtchar

int21h;系统功能调用

movah,02h

movdl,nnum

adddl,30h

int21h

movah,09h

movdx,offseteventchar

int21h

movah,02h

movdl,neven

adddl,30h

int21h

movah,09h

movdx,offsetoddchar

int21h

movah,02h

movdl,nodd

movdl,30h

int21h

movdx,offsetcr

movah,09h

int21h

movah,09h

movdx,offsetzerochar

int21h;系统功能调用

movah,02h

movdl,zero

adddl,30h

int21h

ext:

movax4c00h

int21h

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,'9'-30H;最小值初始99

COUNTDB0D

IFERRORDB0D;判断调用输入子程序是否有错

WELCOMEDB'Pleaseinputnumbers:

','$'

OUTTIPDB'Minimumis:

','$'

CRDB0DH,0AH,'$'

;回车换行

ERROR1DB'ERROR:

Characterisnotvalid!

','$';错误输入提示

ERROR2DB'ERROR:

Numbermustcontainstwodigits!

','$'

ERROR3DB'ERROR:

Numberisempty!

','$'

ERROR4DB'ERROR:

Needseparatechar!

','$'

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

MAINPROCFAR

MOVAX,DATA

MOVDS,AX

MOVDX,OFFSETWELCOME

CALLPRINT

MOVDX,OFFSETCR;回车换行

CALLPRINT

CALLGETNUM;获取输入

CMPIFERROR,0;判断输入过程是否有错

JNZBACK;错误则直接返回DOS

MOVDX,OFFSETCR;回车换行

CALLPRINT

CALLFINDMIN;查找最小数

MOVDX,OFFSETOUTTIP;输出提示

CALLPRINT

MOVAH,02H

MOVDL,MINTMP;输出最小值的十位

ADDDL,30H

INT21H

MOVAH,02H

MOVDL,MINTMP[1];输出最小值的个位

ADDDL,30H

INT21H

BACK:

MOVAX,4C00H;返回DOS

INT21H

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:

CMPAL,20H

JEERR2;位数为1,输入空格,出错

JMPASCBIN;否则读取字符

CMPSPACE2:

CMPAL,20H

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

CALLPRINT

JMPRETURN

ERR2:

MOVIFERROR,

MOVDX,OFFSETERROR2

CALLPRINT

JMPRETURN

ERR3:

MOVIFERROR,1

MOVDX,OFFSETERROR3

CALLPRINT

JMPRETURN

ERR4:

MOVIFERROR,1

MOVDX,OFFSETERROR4

CALLPRINT

JMPRETURN

EXIT1:

MOVBL,COUNT;判断输入数的个数是否为零

CMPBL,0

JEERR3;输入数目为0,输出错误,退出

ANDBL,01H;判断数字是否为两位数

CMPBL,0

JNEERR2;输入数字个数为奇数则出错

RETURN:

POPD

POPDX

POPCX

POPBX

POPAX

RET

GETNUMENDP

PRINTPROC

PUSHAX

MOVAH,09H

INT21H

POPAX

RET

PRINTENDP

FINDMINPROC

PUSHDI

PUSHAX

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

POPAX

POPDI

RET

FINDMINENDP

CODEENDS

ENDMAIN

实验分析

实验中以空格为分隔符,空格的个数不限制,以回车为输入结束标志符。

对输入的数字进行了位数和范围的严格限制,即必须是两位数字,如果数字小于10,需要补齐零。

空格分隔不同数字输入,回车结束。

一位数后面空格为错误,回车后判断。

理论知识积累

1.iferror:

如果公式的计算结果为错误,则返回指定的值;否则返回公式的结果。

2.call指令(调用指令)功能主要有:

将下一条指令的所在地址即程序计数器PC的内容入栈,并将子程序的起始地址送入PC,于是CPU的下一条指令就会转去执行子程序。

实验D子程序设计

一、实验目的

1.进一步掌握子程序设计方法;

2.进一步掌握基本的DOS功能调用。

二、实验内容

1.从键盘上输入某班学生的某科目成绩。

输入按学生的学号由小到大的顺序输入。

2.统计检查每个学生的名次。

3.将统计结果在屏幕上显示。

4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜。

输出应便于阅读.尽可能考虑美观。

5.输入要有检错手段。

三、预习思考

1.如何确定一个学生在这门科目中的名次?

答:

1.可以抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次。

2.可以把学生成绩存入连续内存区域,即数组方式,取得每个学生的成绩偏移量,即成绩指针。

然后比较指针所指的成绩的大小,根据比较结果移动指针完成排序。

2.输入结束后,采用什么方法进行比较以得到学生的名次最为简单?

答:

采用移动指针完成排序的方法在汇编语言下实现,复杂度较高。

由于人数比较少,冒泡法还是比较简洁的。

冒泡法的时间和空间性能都还不错,可以接受。

3.准备好模块层次图。

 

4.给出输出显示的形式。

答:

根据输入的每个学生的ID,成绩,列出一个表,后面跟着排名次数。

具体形式参见实验分析部分的输出截图。

四、实验过程

流程图

源代码

DATASEGMENT

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',09H,09H,'RANK','$'

PRPRE1DB'ID:

','$'

PRPRE2DB'MARK:

','$'

BUFFDB16;最长的字符长度

PRESDB?

;存储实际输入字符数

CHARDB16DUP(?

);实际可存储有效字符16个

DATAENDS

CODESEGMENT

PRINTTIPMACROPARA

PUSHAX

PUSHDX

MOVAH,09H

MOVDX,OFFSETPARA

INT21H

POPDX

POPAX

ENDM

PRINTCHARMACROACHAR

PUSHAX

PUSHDX

MOVAH,02H

MOVDL,ACHAR

INT21H

POPDX

POPAX

ENDM

MAINPROCFAR

ASSUMECS:

CODE,DS:

DATA,ES:

DATA

MOVAX,DATA

MOVDS,AX

MOVES,AX

CALLGETNUMBER;人数

CALLGETINFO;分数

CALLSORT;排序

CALLPRINT;显示

BACK:

MOVAX,4C00H;返回DOS

INT21H

MAINENDP

GETNUMBERPROCNEAR

PUSHAX

PUSHBX

HE:

PRINTTIPTIP1

GREP:

CALLGETIN

MOVCHEOK,0

CALLCHECK

CMPCHEOK,0

JEGRETURN

MOVERROR,6

CALLPRINTERR

PRINTTIPTIP0

PRINTTIPCR

JMPGREP

ERRHERE:

PRINTTIPCR

MOVERROR,6

CALLPRINTERR

PRINTTIPTIP0

JMPGREP

GRETURN:

CALLCHANGE

MOVAL,MTMP

CMPAL,0

JEERRHERE

MOVCOUNTB,AL

CBW

MOVCOUNTW,AX

PRINTTIPCR

POPBX

POPAX

RET

GETNUMBERENDP

GETINFOPROCNEAR

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

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

CMPTMP,0

JEISID;输入学号

CMPTMP,1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

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

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