北邮微原软件实验报告.docx

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

北邮微原软件实验报告.docx

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

北邮微原软件实验报告.docx

北邮微原软件实验报告

信息与通信工程学院

微机原理软件实验报告

班级:

姓名:

学号:

日期:

2013年11月30日

实验一DEBUG的使用1

一、实验目的1

二、实验内容1

三、预习思考5

四、实验过程6

五、实验总结9

实验二分支、循环程序设计9

一、实验目的9

二、实验内容10

三、预习思考10

四、实验过程10

(一)、流程图10

(二)模块层次图11

(三)、源代码12

(四)、分析结果14

五、实验总结14

实验三代码转换程序设计15

一、实验目的15

二、实验内容15

三、预习思考15

四、实验过程16

(一)流程图16

(二)源代码17

(三)分析结果20

五、实验总结20

实验四子程序设计20

一、实验目的20

二、实验内容21

三、预习思考21

四、实验过程22

(一)流程图22

(二)源代码23

(三)分析结果27

五、实验总结28

 

实验一:

DEBUG的使用

1、实验目的

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

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

2、实验内容

1.用编辑软件,输入以下汇编语言源程序:

DATSEGMENT

ADB20;(自定)

BDB15;(自定)

YDB3DUP(0)

ZDB0,0

DATENDS

STASEGMENTSTACK

DW50DUP(?

STAENDS

CODSEGMENT

ASSUMECS:

COD,DS:

DAT

STARPROCFAR

PUSHDS

XORAX,AX

PUSHAX

MOVAX,DAT

MOVDS,AX

MOVAX,STA

MOVSS,AX

MOVAL,A

MOVZ,AL

MOVZ+1,AL

CALLSUB1

MOVAL,B

MOVZ,AL

MOVZ+1,AL

CALLSUB1

MOVAL,A

MOVZ,AL

MOVAL,B

MOVZ+1,AL

CALLSUB1

ADDWORDPTRY,AX

ADCBYTEPTR[Y+2],0

RET

STARENDP

SUB1PROC

MOVAL,Z

MOVAH,Z+1

MULAH

ADDWORDPTRY,AX

ADCBYTEPTR[Y+2],0

RET

SUB1ENDP

CODENDS

ENDSTAR

2.通过编译,连接形成可执行文件.

3.用DEBUG将可执行文件调入,并进行调试.

(1)用D命令观察数据区在内存中的具体内容,记录单元A和B的具体地址.

(2)用U命令对目标代码反汇编,观察反汇编后的结果.注意发现源程序的起始

位置,并记录这个起始地址.

(3)用T命令作单步跟踪调试.比较每条指令执行后的结果和原来的理解是否

一致.得出程序运行的结果:

它们是写在什么单元,具体内容是什么;并判断结果是

否正确.

(4)在子程序SUB1的入口处设一断点,用G命令执行程序.在断点处观察堆

栈的内容,比较堆栈的内容和程序返回地址是否一致.

(5)用E命令修改单元A,B的内容,重新执行程序,并记录结果.

(6)用M命令和A命令对程序进行修改:

将主程序中最后两条指令(ADD和

ADC)修改为一条CALLSUB1指令,重新执行程序.

(7)退出DEBUG.

4.重新使用编辑软件,把源程序最后一句中的STAR去掉.再次生成可执行文件,

并用DEBUG调入内存.当使用U命令时,显示的结果与前一次(未加STAR)的结果

有何不同?

3、预习思考

1.熟悉常用的DEBUG命令.

2.阅读并分析程序的功能.

答:

程序完成的功能是计算两个数的完全平方和,即计算

其中程序中先完成对A的平方,继而完成B的平方,之后把A×B连加两次。

3.若SS=2000H,SP=FFFFH,向堆栈中压入4字节数据后,如何用D命令显示压

入堆栈的内容?

答:

使用的命令是:

-D2000:

FFFB,即使用段基址加偏移量查看。

4、实验过程

3.

(1)A单元地址:

DS=1484H,偏移地址=100H,物理地址=14940H,数据为20

B单元地址:

DS=1484H,偏移地址=101H,物理地址=14941H,数据为15

3.

(2)源程序起始地址:

CS=0B3EH,偏移地址=0000H,物理地址=0B3E0H

(3)用T命令作单步跟踪调试.

由图可知,程序运行结果:

04C9H

写在单元:

DS=0B26H,偏移地址=0102H,物理地址=0B362H

由源程序可知该程序实现的功能:

计算(A+B)^2的结果,计算可知结果是正确的

(4)由图可知,SUB1的断点地址:

偏移地址=005eF,由图可知压入堆栈的为IP=001AH

(5)修改后A的内容为7,B的内容为8

(6)用M命令和A命令对程序进行修改:

将主程序中最后两条指令(ADD和

ADC)修改为一条CALLSUB1指令,重新执行程序.第一个图中使用mcs:

3234cs:

35

复制call模块。

然后使用a0b38对相应段进行修改

(7)退出DEBUG.

4.重新使用编辑软件,把源程序最后一句中的STAR去掉.再次生成可执行文件,

并用DEBUG调入内存.当使用U命令时,发现程序不能正常运行。

5、实验总结

这是微机原理软件实验的第一次实验。

代码已经给我们了,主要是让我们熟悉DEBUG的使用,如何看堆栈中的内容,如何单步调试,如何判断我们的代码是否正确等等。

这个实验让我们可以深入的了解汇编的内存是怎样使用的。

当然,刚开始接触的时候看到乱七八糟的各种数据有点懵。

后来熟练了,觉得DEBUG非常有用。

实验二:

分支,循环程序设计

1、实验目的

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

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

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

2、实验内容

 1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过9.

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

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

3、预习思考

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

如何将十进制数0--9在

屏幕上显示出来?

答:

0-9的ascii码为,30h,31h,32h,34h,35h,36h,37h,38h,39h,

将要显示的数加上‘0’,得到该数的ascii码,再利用DOS功能调用显示单个字符

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

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

答:

利用cmp指令,将该数与0相减,观察标志位。

检查最高位,为0是正数,为1时再检查其他位判断是负数或0

4、实验过程

(1)流程图

 

 

(2)

模块层次图

 

(3)源代码

datasegment

numdw28,20,10,-32,0,110,-23,0,45,-45,62,-4,-6,3,0,35

countequ$-num

grdb?

lidb?

zedb?

string1db'zhengshu:

','$'

string2db'fushu:

','$'

string3db'ling:

','$'

string4db'','$'

dataends

stacksegmentstack'stack'

db100dup(?

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

movcx,count

shrcx,1

movah,0;>

movdl,0;<

movdh,0;=

movbx,offsetnum

loop1:

cmpwordptr[bx],0

jgegrea

incdl;小于零的计数变量dl加1

jmpnext

grea:

jzzero  

incah       ;大于零的计数变量ah加1

jmpnext

zero:

incdh;等于零的计数变量dh加1

next:

incbx

incbx

looploop1

movgr,ah

movli,dl

movze,dh

calldisplay;显示大于零的数

calldisplay2;显示小于零的数

calldisplay3;显示等于零的数

movax,4c00h

int21h

display1procnear;显示大于零的数

pushdx

movah,09h

movdx,segstring1

movds,dx

movdx,offsetstring1

int21h

moval,gr

addal,'0'-0h

movah,02h

movdl,al

int21h

movah,09h

movdx,segstring4

movds,dx

movdx,offsetstring4

int21h

popdx

ret

display1endp

display2procnear;显示小于零的数

pushdx

movah,09h

movdx,segstring2

movds,dx

movdx,offsetstring2

int21h

moval,li

addal,'0'-0h

movah,02h

movdl,al

int21h

movah,09h

movdx,segstring4

movds,dx

movdx,offsetstring4

int21h

popdx

ret

display2endp

display3procnear;显示等于零的数

pushdx

movah,09h

movdx,segstring3

movds,dx

movdx,offsetstring3

int21h

moval,ze

addal,'0'-0h

movah,02h

movdl,al

int21h

movah,09h

movdx,segstring4

movds,dx

movdx,offsetstring4

int21h

popdx

ret

display3endp

codeends

endstart

(4)分析结果

numdw28,20,10,-32,0,110,-23,0,45,-45,62,-4,-6,3,0,35

可以看出正数有8个,负数有5个,零有三个。

5、实验总结

在本次实验中,第一次尝试自己写汇编语言。

刚开始先画了流程图,理了大致思路,然后开始写代码。

总体还是很简单的。

但是第一次运行的时候还是有九个错误。

基本上都是少加了个逗号,或者,名字打错了之类的。

都是很简单就能发现的错误。

虽然说代码挺简单的,但是却很锻炼我们的思维,也锻炼我们编写代码的能力。

当然在做了第三个和第四个试验后,发现这个代码还是可以继续简化的,一些模块是可以公用的。

代码就是需要不断的去修改完善。

实验三:

代码转换程序设计

1、实验目的

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

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

2、实验内容

1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过9.

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

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

3、预习思考

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

答:

将输入的字符减去‘0’,可得到十进制数

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

先定义一个字节的数据,十位存在高8位,个位存在低8位,每次将输入的数整体进行比较,若小于则将输入的字符和已存的交换,大于则不交换,最后将十位和个位分别加上30H变为相应的ascii码输出

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

答:

采用二进制

4、实验过程

(1)

流程图

 

(2)源代码

datasegment

min1dw99h

shiweidb00h

entercodedw30dup(?

countdw0

temp1dw?

string1db0ah,0dh,'inputerror,pleaseinputagain',0ah,0dh,'$'

string2db'pleaseinputnumber',0ah,0dh,'$'

string3db0ah,0dh,'minis:

','$'

dataends

stacksegmentstack'stack'

db100dup(?

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack

enter1procnear

movsi,bx

intering:

movah,1;第一次输入

int21h

cmpal,'0'

jbshow1

cmpal,'9'

jashow1

subal,'0'

movshiwei,al

get2:

movah,1;第二次输入

int21h

cmpal,'0'

jbshow2

cmpal,'9'

jashow2

subal,'0'

get3:

movah,shiwei;第三次输入

mov[si],ax

incsi

incsi

inccount

movah,1

int21h

cmpal,20h

jnzshow1

jmpintering

show1:

;先判断是否是enter键。

若不是,显示输入错误

cmpal,0dh

jzfinishenter

movah,09h

movdx,segstring1

movds,dx

movdx,offsetstring1

int21h

movcount,0

movsi,bx

jmpintering

show2:

;直接显示错误

movah,09h

movdx,segstring1

movds,dx

movdx,offsetstring1

int21h

movcount,0

movsi,bx

jmpintering

finishenter:

ret

enter1endp

findmprocnear;找最小值

movsi,bx

movax,[si]

movcx,count

loop1:

cmpax,[si]

jnaloop2

movax,[si]

loop2:

incsi

incsi

looploop1

movmin1,ax

ret

findmendp

showmprocnear;显示最小值

movah,09h

movdx,segstring3

movds,dx

movdx,offsetstring3

int21h

movax,min1

addah,'0'

moval,ah

movah,02h

movdl,al

int21h

movax,min1

addal,'0'

movah,02h

movdl,al

int21h

ret

showmendp

start:

movcx,0;主要代码段

movax,data

movds,ax

movbx,offsetentercode

movah,09h

movdx,segstring2

movds,dx

movdx,offsetstring2

int21h

callenter1;调用子程序

callfindm

callshowm

movax,4c00h

int21h

codeends

endstart

(2)结果分析

检错:

每三位一循环输入,输入第一、二位为数字,第三位是空格。

规定第二位只能输入数字,第一位和第三位可以按enter键。

否则报错。

输入正确时,会找到最小的数,显示出来。

空格是两个十进制数之间的分隔符,enter键是输入结束标志。

5、实验总结

本次实验总体还是成功的。

当然在写代码的时候遇到了好多问题。

比如少写了堆栈的定义模块就报错。

报错的时候,换行显示,将0ah和0dh写反位置,会导致屏幕输出的覆盖。

当然,首先需要定义一段内存空间去存储我们键盘输入的数。

然后需要统计我们输入的数的个数。

用空格键作为统计标志。

比较大小时,我们输入多少个两位数,就比较多少次。

然后找到最小的那个数。

实验三是实验二的升华,在理清思路的同时,需要尽量的简化代码。

感觉代码还是是太精简,是这次实验的不足。

实验四:

子程序设计

1、实验目的

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

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

2、实验内容

3、错误!

未找到目录项。

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

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

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

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

能考虑美观.

5.输入要有检错手段.

3、预习思考

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

答:

将其与其他学生的成绩进行比较,如果比其他同学的成绩小,则自己的名词需要加一。

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

答:

使用排序法进行比较最简单。

3.准备好模块层次图.

 

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

答:

 

四、实验过程

(1)流程图

 

(2)源代码

datasegment

gradedw18dup(?

countstandequ$-grade

countdb0

countredb0

countwdb0

shudb0

mingcidw0

string1db'010203040506070809',0ah,0dh,'$'

string2db0ah,0dh,'xue_hao:

','$'

string3db0ah,0dh,'cheng_ji:

','$'

string4db0ah,0dh,0ah,0dh,'ming_ci:

','$'

string5db0ah,0dh,0ah,0dh,'inputerror!

pleaseinputagain!

',0ah,0dh,'$'

dataends

stacksegmentstack'stack'

db100dup(?

stackends

codesegment

assumecs:

code,ds:

data,ss:

stack

enter1procnear

once:

callshow2;输出学号

movsi,offsetgrade

movcx,countstand

shrcx,1

shrcx,1

loop1:

movah,1;输入成绩,与学号第一位对齐

int21h

cmpal,'0'

jbjudge2

cmpal,'9'

jajudge2

subal,'0'

movshu,al

jmpwrite1

judge2:

cmpal,20h;判断输入是否是空格

jzwrite1

showerror:

movcx,countstand;如果输入不是数字也不是空格,就报错返回once

movdx,offsetstring5

callshow1

jmponce

write1:

;把正确的字符的ascii码写入到grade开始的内存里

mov[si],al

incsi

inccount

cmpcount,04h

jbloop1

movcount,0

looploop1

ret

enter1endp

show1procnear;把相应的字符串输出到屏幕

movah,09h

int21h

ret

show1endp

show2procnear

movdx,offsetstring2;学号:

callshow1

movdx,offsetstring1;把学号输出

callshow1

movdx,offsetstring3;成绩:

callshow1

ret

show2endp

compareprocfar;比较比自己大的grade的个数

movch,0

moval,countstand

movcl,2

shral,cl

movcl,al;9

movdi,offsetgrade

loop2:

movah,[di]

moval,[di+1]

movbh,[di+2]

movsi,offsetgrade

loop3:

cmpbh,[si+2]

jztemp1

jbskip1;;;;

incmingci

jmpskip1

temp1:

cmpah,[si]

jatemp2

jztemp4

cmpal,20h

jnztemp3

incmingci

jmpskip1

temp2:

cmpal,20h

jztemp3

jmpskip1

temp3:

mov

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

当前位置:首页 > 求职职场 > 简历

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

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