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

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

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

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

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

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

zer:

incdh

next:

incbx;

下一个数

incbx

loopagain

adddl,48

movplus,dl

adddh,48

movzero,dh

addah,48

movminus,ah

show:

subdx,dx;

显示模块

movdx,offsetstring1

movax,0900h;

送显示指令

int21h

movdl,[plus]

movax,0200h

movdl,0dh

movdl,0ah

movdx,offsetstring2

movax,0900h

movdl,[zero]

movdx,offsetstring3

movdl,[minus]

movax,4c00h;

结束程序

codeends

endbegin

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

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看到内存空间,非常直观。

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

实验三代码转换程序设计

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

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

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

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

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

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

注:

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

datasegment;

数据段初始化

mindb'

9'

string0db0dh,0ah,'

PLEASEINPUTSOMEINTEGERS.DEVIDEDwithSPACE.STOPwithENTER'

0dh,0ah,'

string1db0dh,0ah,'

ERROR!

PLEASEINPUTAGAIN!

string2db0dh,0ah,'

THEMINESTNUMBERIS:

STACKSEGMENTSTACK'

STACK'

DB100DUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

INPUTPROCNEAR;

输入子函数

MOVAH,01H

INT21H

ret

inputendp

test1procnear;

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

cmpal,'

0'

jberror

jaerror

jmpexit

error:

moval,0;

输入不为数字返回0

exit:

ret

test1endp

start:

movdx,offsetstring0

round:

循环主体

callinput;

输入第一个数

calltest1

cmpal,00h

jzwrong1;

错误提示

movbh,al;

存储

callinput;

输入第二个数

jzwrong1

movbl,al

callinput

cmpal,0dh;

输入是否结束

jzshow;

输入结束转移到显示

'

输入分隔符,开始比较

jzcompare

jmpwrong1

wrong1:

jmpround

compare:

cmpbx,WORDPTRmin;

比较并刷新MIN

jbchange

change:

movwordptrmin,bx

显示子函数

cmpbx,WORDPTRmin

jbswap

swap:

outt:

movdl,min+1

movdl,min

movax,4c00h

endstart

结果讲解:

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

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

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

六、回答预习题

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

减30H。

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

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

如要转换则加30H。

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

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

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

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

实验四子程序设计

一、实验目的

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

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

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

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

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

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

5.输入要有检错手段.

调用检验子函数

调用排序子函数

调用显示子函数

结束

datasegment;

buffdw20dup(0000h);

存放成绩

buff1dw20dup(31h,32h,33h,34h,35h,36h,37h,38h,39h);

存放学号

count1db0;

存放输入了几个数

count2db0

PLEASEINPUTSCORES'

THERANK:

string3db0dh,0ah,'

NUMBER:

inputendp

moval,0

save1procnear;

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

leasi,buff

movcx,0

movcl,count1

addsi,cx

addsi,1

mov[si],al

inccl;

40

movcount1,cl

save1endp

save2procnear;

存储输入的第二个数子函数,存在低位

decsi

save2endp

compareprocnear;

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

cmpax,bx

jmpexit0

movch,0

addsi,dx

mov[si],bx

addsi,2

mov[si],ax

leasi,buff1

movax,[si];

交换成绩同时交换学号

movbx,[si]

subsi,2

exit0:

compareendp

movax,data;

主程序入口

movax,0

callinput;

calltest1;

测试

jzwrong1;

callsave1

callinput;

callsave2

cmpal,0dh

jelist;

输入结束进入排序

jeround

movah,09h

movcl,0

list:

shrcl,1

movcount2,cl

deccl

jzshow

order:

movcl,0;

冒泡排序法外层循环

order1:

leasi,buff;

冒泡排序法内层循环

movdh,0

movdl,cl

shldl,1

addsi,dx;

100

movax,[si]

callcompare

inccl

cmpcl,count1

jeorder2

jmporder1

order2:

jnzorder

jmpshow

movdx,offsetstring4;

显示名次

show0:

movah,02h

leasi,buff2

movcl,count2

show00:

incsi

movdl,[si]

incsi

movdl,'

jnzshow00

show1:

movdl,0dh;

显示学号

show2:

jnzshow2

show3:

显示成绩

show4:

jnzshow4

endstart

五、给出程序运行结果

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

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

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

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

根据输入成绩进行排序

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

冒泡排序法

3.模块层次图.

键盘输入

显示屏显示

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

第一行显示名次

第二行显示学号

第三行显示成绩

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

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

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

当前位置:首页 > 法律文书 > 调解书

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

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