北邮微机原理实验报告.docx

上传人:b****6 文档编号:8475281 上传时间:2023-01-31 格式:DOCX 页数:26 大小:321.59KB
下载 相关 举报
北邮微机原理实验报告.docx_第1页
第1页 / 共26页
北邮微机原理实验报告.docx_第2页
第2页 / 共26页
北邮微机原理实验报告.docx_第3页
第3页 / 共26页
北邮微机原理实验报告.docx_第4页
第4页 / 共26页
北邮微机原理实验报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

北邮微机原理实验报告.docx

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

北邮微机原理实验报告.docx

北邮微机原理实验报告

.

微机原理软件实验报告

学院:

信息与通信工程学院

班级:

2012211123

班内序号:

学生姓名:

学号:

资料Word

.

实验二分支,循环程序设计

一、实验目的

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

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

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

二、实验任务及内容

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

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

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

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

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

三、画出程序流程图

开始

初始化

读入一个数

N

N

判断是否大于等MINUS+1

于零

Y

N

PLUS+1N

是否等于零

YCX=0

ZERO+1

资料Word

DOS返回系统

结束

Y

.

四、给出源程序(要求加注释)

datasegment

buffdw1,2,0,0,-1;数据段,初始化数据

countequ$-buff

plusdb?

;定义三种数的存储位置

zerodb?

minusdb?

string1db'plusnumber:

','$'

string2db'zeronumber:

','$'

string3db'minusnumber:

','$'

dataends

stacksegmentstack'stack'

db100dup(?

stackends

codesegment

assumecs:

code,ds:

data,es:

data,ss:

stack

begin:

movax,data

movds,ax

movcx,count

shrcx,1

movdx,0

movah,0

leabx,buff

again:

cmpwordptr[bx],0;首先和0比较

jgeplu

incah;小于零MINUS+1

jmpnext

plu:

jzzer;判断是否等于零,等于零ZERO+1

incdl;不等于零PLUS+1

jmpnext

zer:

incdh

next:

incbx;下一个数

incbx

loopagain

adddl,48

movplus,dl

adddh,48

movzero,dh

addah,48

movminus,ah

资料Word

.

show:

subdx,dx;显示模块

movdx,offsetstring1

;送显示指令movax,0900h

int21h

movdl,[plus]

movax,0200h

int21h

movdl,0dh

int21h

movdl,0ah

int21h

movdx,offsetstring2

movax,0900h

int21h

movdl,[zero]

movax,0200h

int21h

movdl,0dh

int21h

movdl,0ah

int21h

movdx,offsetstring3

movax,0900h

int21h

movax,0200h

movdl,[minus]

int21h

movax,4c00h;结束程序

int21h

codeends

endbegin

资料Word

.

五、给出程序运行结果(运行结果抓屏保存)

datasegment中存入1,2,0,0,-1

显示有2个0、2个大于0的数、1个小于0的数,结果正确

六、预习题

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

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

答:

对应的ASCII码是30H~39H,把0-9加上30H即可得到对应的ASCII,送给DL,再执行INT21H即可显示。

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

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

答:

1先判断是否大于等于零,否则为负数,是则判断是否等于零,否则为整数。

2.判断ZF标志位,为零则循环左移一直判断,为1为负,为0为正

七、实验总结、建议要求、心得体会

之前小学期中已经用汇编语言编写过比较大型的程序,但是是在编译器中运行,比较容易查错,而且显示、输入等功能都是调用硬件实现,因此很多经验不能照搬,遇到了很多问题,我发现汇编语言对程序内部存储器等的利用虽然比C语言麻烦,但是都是真正可以控制、可以调用显示的,可以直接DEBUG看到内存空间,非常直观。

由于在程序中存在很多条件跳转语句,所以需要在最初设计时就考虑好各种分支情况,在画好程序流程图之后,程序的编写工作变得简单了很多,简化了编写代码过程中的思考过程。

资料Word

.

实验三代码转换程序设计

一、实验目的

1.掌握几种最基本的代码转换方法;

2.运用子程序进行程序设计.

二、实验任务及内容

1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.

2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.

3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.

4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.

三、画出程序流程图

开始

初始化Y开始N

键盘输入两个字符,存储在连续空间检测输入是否正确

Y与MIN比较,刷新最小值N输入空格

Y.输入结束符Y

显示提示输入输入子函数单字符输入

调用检验子函数输入是否合理YY

输入回车结束调用排序子函数调用显示子函数

NERROR!

资料Word

.

四、给出源程序(要求加注释)

注:

本程序段中中断字符为空格结束字符为回车

datasegment;数据段初始化

mindb'9','9'

string0db0dh,0ah,'PLEASEINPUTSOMEINTEGERS.DEVIDEDwithSPACE.STOPwith

ENTER',0dh,0ah,'$'

string1db0dh,0ah,'ERROR!

PLEASEINPUTAGAIN!

',0dh,0ah,'$'

string2db0dh,0ah,'THEMINESTNUMBERIS:

',0dh,0ah,'$'

dataends

STACKSEGMENTSTACK'STACK'

DB100DUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

INPUTPROCNEAR;输入子函数

MOVAH,01H

INT21H

ret

inputendp

test1procnear;测试输入是否为数字子函数

cmpal,'0'

jberror

cmpal,'9'

jaerror

jmpexit

error:

moval,0;输入不为数字返回0

exit:

ret

test1endp

start:

movax,data

movds,ax

movdx,offsetstring0

资料Word

.

movax,0900h

int21h

round:

;循环主体

;输入第一个数callinput

calltest1

cmpal,00h

;错误提示jzwrong1

movbh,al;存储

;输入第二个数callinput

calltest1

cmpal,00h

jzwrong1

movbl,al

callinput

;输入是否结束cmpal,0dh

;输入结束转移到显示jzshow

;输入分隔符,开始比较cmpal,''

jzcompare

jmpwrong1

wrong1:

movdx,offsetstring1

movax,0900h

int21h

jmpround

;比较并刷新compare:

cmpbx,WORDPTRminMIN

jbchange

jmpround

change:

movwordptrmin,bx

jmpround

;显示子函数show:

cmpbx,WORDPTRmin

jbswap

movwordptrmin,bxswap:

movdx,offsetstring2outt:

movax,0900h

int21h

movdl,min+1

movax,0200h

int21h

movdl,min

int21h

资料Word

.

movax,4c00h

int21h

codeends

endstart

五、给出程序运行结果(运行结果抓屏保存)

结果讲解:

第一次由于输入了三位数,所以报错;

第二次由于输入字母,所以报错;

第三次输出正常结果,运行成功。

六、回答预习题

1.如何将输入的两个字符(0~9)变为十进制或二进制数?

答:

减30H。

2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?

答:

直接存储输入的ASCII,不需要转换。

如要转换则加30H。

你觉得采用二进制运算还是十进制运算更适合于这个实验?

答:

二进制运算,直接保存输入的数的二进制编码,直接比较,不需要区分十位个位。

七、实验总结、建议要求、心得体会

练习了调用子函数,发现子函数调用的PROCNEAR必须和子函数名同一行显示,不然程序会报错,还有不能把存储器操作数作为目的操作数,一定要通过寄存器转换。

汇编语言有很多需要注意的语法细节,应该多多练习。

资料Word

.

实验四子程序设计

一、实验目的

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

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

二、实验任务及内容

1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.

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

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

4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.

5.输入要有检错手段.

三、画出程序流程图

结束

资料Word

.

四、给出源程序(要求加注释)

datasegment;数据段初始化

buffdw20dup(0000h);存放成绩

buff1dw20dup(31h,32h,33h,34h,35h,36h,37h,38h,39h);存放学号

count1db0;存放输入了几个数

count2db0

string0db0dh,0ah,'PLEASEINPUTSCORES',0dh,0ah,'$'

string1db0dh,0ah,'ERROR!

PLEASEINPUTAGAIN!

',0dh,0ah,'$'

string2db0dh,0ah,'THERANK:

','$'

string3db0dh,0ah,'NUMBER:

','$'

dataends

STACKSEGMENTSTACK'STACK'

DB100DUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

INPUTPROCNEAR;输入子函数

MOVAH,01H

INT21H

ret

inputendp

test1procnear;测试输入是否为数字子函数

cmpal,'0'

jberror

cmpal,'9'

jaerror

jmpexit

error:

moval,0

exit:

ret

test1endp

save1procnear;存储输入的第一个数子函数,存在高位

leasi,buff

movcx,0

movcl,count1

addsi,cx

资料Word

.

addsi,1

mov[si],al

;40

inccl

movcount1,cl

ret

endpsave1

save2procnear;存储输入的第二个数子函数,存在低位leasi,buff

movcx,0

movcl,count1

addsi,cx

decsi

mov[si],al

;40

inccl

movcount1,cl

ret

endpsave2

;比较两个数大小并完成交换子函数compareprocnear

cmpax,bx

jbchange

jmpexit0

change:

movch,0

leasi,buff

addsi,dx

mov[si],bx

addsi,2

mov[si],ax

leasi,buff1

addsi,dx

movax,[si];交换成绩同时交换学号

addsi,2

movbx,[si]

mov[si],ax

subsi,2

mov[si],bx

ret

exit0:

compareendp

;主程序入口movax,datastart:

movds,ax

movdx,offsetstring0

资料Word

.

movax,0900h

int21h

movax,0

round:

callinput;输入第一个数

calltest1;测试

cmpal,00h

jzwrong1;错误提示

callsave1

callinput;输入第二个数

calltest1

cmpal,00h

jzwrong1

callsave2

callinput

cmpal,0dh

jelist;输入结束进入排序

cmpal,''

jeround

jmpwrong1

wrong1:

movdx,offsetstring1

movah,09h

int21h

movcl,0

movcount1,cl

jmpround

list:

movcl,count1

shrcl,1

movcount2,cl

deccl

movcount1,cl

jzshow

order:

movcl,0;冒泡排序法外层循环

order1:

leasi,buff;冒泡排序法内层循环

movdh,0

movdl,cl

shldl,1

addsi,dx;100

movax,[si]

addsi,2

资料Word

.

movbx,[si]

callcompare

inccl

cmpcl,count1

jeorder2

jmporder1

order2:

movcl,count1

deccl

movcount1,cl

jnzorder

jmpshow

show:

movdx,offsetstring4;显示名次

movah,09h

int21h

movah,02hshow0:

leasi,buff2

movcl,count2

show00:

incsi

movdl,[si]

int21h

decsi

movdl,[si]

int21h

incsi

incsi

movdl,''

int21h

deccl

jnzshow00

;显示学号show1:

movdl,0dh

int21h

movdx,offsetstring3

movah,09h

int21h

movah,02h

leasi,buff1

movcl,count2

incsi

show2:

资料Word

.

movdl,[si]

int21h

decsi

movdl,[si]

int21h

incsi

incsi

movdl,''

int21h

deccl

jnzshow2

show3:

movdl,0dh;显示成绩int21h

movdx,offsetstring2

movah,09h

int21h

movah,02h

leasi,buff

movcl,count2

incsishow4:

movdl,[si]

int21h

decsi

movdl,[si]

int21h

incsi

incsi

movdl,''

int21h

deccl

jnzshow4

movax,4c00h

int21h

codeends

endstart

资料Word

.

五、给出程序运行结果

第一次输入三位数提示错误;

第二次输出字母提示错误;

第三次输入正确,显示名次,学号,分数。

六、回答预习题

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

答:

根据输入成绩进行排序

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

答:

冒泡排序法

3.模块层次图.

输入模块测试输入是否正确模块

键盘输入

存储模块

显示屏显示

资料Word

.

排序模块显示模块

给出输出显示的形式.4.答:

第一行显示名次

第二行显示学号

第三行显示成绩

七、实验总结、建议要求、心得体会

本次实验加深了我对汇编语言的理解,更加熟练的掌握汇编语言的用法,熟练了各种DEBUG的方法,尤其注意在对存储器内容改写时可以用SI寄存器,汇编的寄存器数量比较少,不像C等语言可以自己定义变量,要注意寄存器的合理利用,不注意的的话可能在程序中随意修改他们的值,导致程序混乱不好调试。

总的来说,本次实验十分有意义。

资料Word

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

当前位置:首页 > 高等教育 > 工学

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

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