计算机原理与汇编语言实验报告123.docx

上传人:b****3 文档编号:12961559 上传时间:2023-04-22 格式:DOCX 页数:16 大小:28.19KB
下载 相关 举报
计算机原理与汇编语言实验报告123.docx_第1页
第1页 / 共16页
计算机原理与汇编语言实验报告123.docx_第2页
第2页 / 共16页
计算机原理与汇编语言实验报告123.docx_第3页
第3页 / 共16页
计算机原理与汇编语言实验报告123.docx_第4页
第4页 / 共16页
计算机原理与汇编语言实验报告123.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

计算机原理与汇编语言实验报告123.docx

《计算机原理与汇编语言实验报告123.docx》由会员分享,可在线阅读,更多相关《计算机原理与汇编语言实验报告123.docx(16页珍藏版)》请在冰豆网上搜索。

计算机原理与汇编语言实验报告123.docx

计算机原理与汇编语言实验报告123

实验1:

循环接收用户按键输入,将用户输入的大字母原样输出,将用户输入的小写

字母转换为小写字母再输出,用户若输入数字0则退出程序,其它情况输出

实验程序代码

datasegment

strdb'error!

$'

dataends

stacksegmentparastack'stack'

db100dup⑺

stackends

codesegment

assumeds:

data,cs:

code,ss:

stack

start:

movax,data

movds,ax

again:

movah,01h

int21h

cmpal,'0'

jenext

cmpal,'A'

jberror;小于A的出错

cmpal,'Z'

jbeprint1;在A,Z之间的输出print1

cmpal,'a'

jberror;在Z(41hH)和a(61H)之间的出错

cmpal,'z'

jbeprint2;在a,z之间的输出print2

jmperror

print1:

movdl,al

movah,02h

int21h

jmpagain;循环输入,again

print2:

movdl,al

subdl,20h

movah,02h

int21h

jmpagain;循环输入,again

error:

movdx,offsetstrmovah,09hint21hnext:

movah,4chint21h

codeends

endstart

实验截图

=^jua-smySblg-.exeRkKHHlIsGBei-roi'*

:

5比・©x#GyVUUQ

=5陶E》.

实验总结

这个实验比较简单,花费的时间也少,将我们学习的理论知识用于实践第一次真实的体会到汇编语言的特点,以及和C++语言的区别。

实验2:

从键盘接收用户输入的一个正整数(0-32767之间),输出该数

字的所有因子

datasegment

strdb'inputdata0-32767:

$'

numdw0

stringdb5dup(0)

dataends

stacksegmentparastack'stack'

db1000dup(?

stackends

codesegment

assumeds:

data,cs:

code

start:

movax,data

movds,ax

movdx,offsetstr

movah,09h

int21h;显示标题

movsi,0

movdi,0

rein:

movah,01h

int21h

cmpal,20h

jzinte;输入空格表示输入结束

cmpal,30h

jbexit;不在0-9之间的退出

cmpal,39h

jaexit

subal,30h;不在0-9之间的退出

movstring[si],al

incsi

cmpsi,6

jzexit;输入位数超过5位的退出

jmprein

;*******************以下整和整

decsi;到达这一步时,si比输入的位数大1,所以要减1

inte:

movbx,num

movax,10

mulbx

addal,string[di]

adcah,00h

movnum,ax

incdi

cmpdi,si

jbinte;得出的整数放置于变量num中

.********************

以下求因子,输出

movbx,0

again:

movax,nummovdx,0incbx

cmpbx,num

jaexit

divbx

cmpdx,0

jetcall

jmpagain

tcall:

calltprint

jmpagain

tprintprocnear;print子程序打印输出bx

movcx,10

movsi,4

movax,bx

boa1:

cmpax,10

jbboa2

xordx,dx

divcx

ordl,30h

movstring[si],dl

decsi

jmpboal

boa2:

oral,30h

movstring[si],al

g:

movdl,string[si]打出输出ASCII

movah,2

int21h

incsi

cmpsi,5

jneg

movdl,20h

movah,2

int21h;空格隔开每个因子

ret

tprintendp

exit:

movah,4ch

int21h

codeends

endstart

实验截图

C:

MJsers\?

?

?

?

?

?

?

?

>cde:

\masn

c:

:

\na&n>niasfii^inzl.asnk

MiciTQSpFtMacroA^senbL^rUcrsion5-00

Copyri^litHicrosoFtCorp1981-1985,1917.Allrightsreserved.

ObjectfilenameCsiinzi.OBJ]:

Soiivr*1istingCNIJT.1T

Cross-FeferenceCNUL.CRF]:

50386+吗J.53?

0B«/tess^nbolspacefree

QUarningErrors

0SevereErrors

c-\na.cm>1i(hki/inzi«abj

Hicro?

nftOverlapLinkerUersion3.60

Copyri£flitNicrosoftCorp1383-1987^H11rightsreserved.

RunFile[VIHZI.EXEJ:

ListFile[NUL.KAP1:

LibFat*iesL.LIBI:

c-\nasm>91nzi.exe

inputdata0-32767:

121234612

c:

\masin>

Inputdata0-32767:

1201234S&8IB1220243B4S68120

c:

i-wxu

inputdata0-^2767:

1310125IQ131262圈1310

c:

XDasm>yinzi・exe

inputdata0327G7=C?

S?

1331?

□932192263G789

c:

Snasm>yinai

inputdAtA0-32767:

12345135158232469411512345

c-\masm>yinsi.exe

inputdAtA0-32767:

B1248

匸:

\11|孔£[11》

注释1:

以上为编译连接运行的结果,其中,输入的,12,120,1310,6789,12345,8等均

能给出因子。

注释2:

下图为,特殊的输入情况下,程序退出一,输入的字符不是0—9之间的字符,退出二,输入的位数超过范围(0—32767),退出

d:

Smasm>i/in21.exe

inputdata0-3276?

®124H

D:

Xnasm>^in2i.exe

inputdata0-3276?

r

D:

\nasnl>yinz£.exeinputdata0-32767:

c;5dMiu>y;Ln乂1.

inputdata0-32767:

222222

c:

\nasm>

输入字符‘r'‘-'等退出程序

输入的整数222222超过范围,自动退出程序

实验总结

本次实验花费了较长时间,其中在修改调试程序上花费时间占绝大部分。

在实验代码的一步步完善过程中,经历了一下步骤:

1,程序编译出错

这里的问题出现在语法错误上,不过这些错误很少,容易修改;不过有一个错误是提示:

noendoffile,造成的原因是由于我定义调用宏,编译时出现的一个不会修改的错误。

之后我去掉宏,然后把宏内的代码直接复制到相应的位置,之后再次编译,没有错误。

2,编译连接都没有错误,但在运行时出错

修改运行,出现无限循环输出乱码情况,再次,修改后,出现一个更严重的情况,只要我一运行yinzi.exe程序,电脑就发出do的报警声,再次修

改,.,再后面,程序可以运行,并且可以输出一些正常的结果

3,在根据输入的ASCII字符转换成整数时,如下代码

inte:

decsi

movbx,num

movax,10此行代码错误

mulbx

addal,string[di]

adcah,OOh

movnum,ax

incdi

cmpdi,si

jbinte

程序运行结果是:

一,能正确求出两位数的因子,如12,为1,2,3,4,6,12等

二,输入三位数120,结果是12的因子1,2,3,4,6,12

输入四位数1230,结果是12的因子1,2,3,4,6,12

输入五位数12100,结果是121的因子1,11,121

只需将上面inte:

这个移到下一行即可解决问题;

虽然,实验花了很长时间修改,克服种种错误终于能够输出正确结果,但我觉得不但的找出错误并修正错误这个过程更能锻炼人,学到的东西更多。

不过,我们在写程序时,一定要细心谨慎,因为如果写的时候不仔细,回头再次调试修改的话就得花更多的时间,不值得,这是我的一点心得体会。

实验3:

从键盘接收用户输入的一个正整数(0-32767之间),输出该数字的所有因子。

1、函数input:

接收用户一个正整数,将数据保存到AX

2、函数outpot:

将AX中的数据在屏幕上显示出来

3、函数sort:

将BX所指向的一批数据进行排序,数据个数在AX中从键盘接收用户一批数据输入,对该批数据从小到大排序,将原数据和排序后的数据在屏幕上显示出来。

实验程序代码

datalsegment

ndw0000h

datadw100dup⑺

numdw0

bufferdb5dup⑺;输入ASCII转换成整数的缓冲区

string0db'howmanydatas:

$'

string1db'inputdata:

$'

string2db'order:

$'

data1ends

stacksegmentparastack'stack'

db100dup⑺

stackends

codesegment

assumeds:

data1,cs:

codestart:

movax,data1

movds,ax

movdx,offsetstringO

data[]中

movah,9int21hcallinputmovn,ax

movdl,0ahmovah,2int21h

movcx,nmovdi,0datain:

callinput

movdata[di],ax

adddi,2loopdatain

movdl,0ahmovah,2int21h

movdx,offsetstring1movah,9

int21hmovsi,0movcx,nagain1:

movax,data[si]

calloutputaddsi,2loopagain1movdl,0ahmovah,2int21h

movdx,offsetstring2movah,9

int21h

movcx,ncallsort

movsi,0movcx,nagain2:

movax,data[si]

calloutputaddsi,2loopagain2jmpnext

;提示输入多少数据

;数据个数存入到变量n中

;换行

;循环输入几个数据打印出,并存入到

;换行

;提示输出排序前的

;换行

;提示输出排序后的

;对data[]排序

inputprocnear;*****接收输入的整数存入AX中,参数buffer]],num********

pushdi

pushbx

movsi,0

movdi,0

rein:

movah,01h

int21h

cmpal,20h

jeinte;空格表示输入结束

subal,30h

movbuffer[si],al

incsi

cmpsi,5

jbrein

decsi

inte:

movbx,num

movax,10

mulbx

addal,buffer[di]

adcah,00hmovnum,ax

movbuffer[di],00h;清零

incdicmpdi,si

jbinte

movax,num;将整理好的整数放到AX中

movnum,0000h用完num清0

popbxpopdi

ret

inputendp;*****用到的寄存器ax,si,di,bx****************

outputprocnear;*****打印出AX中的数据,传入参数AX即可********

pushcx

pushsi

pushdx

movcx,10

movsi,4boa1:

cmpax,10jbboa2xordx,dxdivcx

ordl,30h

movbuffer[si],dldecsi

jmpboalboa2:

oral,30h

movbuffer[si],alg:

movdl,buffer[si]movah,2int21h

movbuffer[si],0incsi

cmpsi,4

jbeg

movdl,20h

movah,2

int21hpopdxpopsi

;打出输出ASCII

;打印完后清零,避免重叠

;空格隔开

popCX

outputendp;*****

sortprocnear;*********

用到的寄存器ax,cx,si,dx**************

字序列的冒泡排序子程序,参数data[],cx(元素个数)

ret

*********

;比较遍数

;比较次数

deccxloop1:

movdi,cx

movbx,0loop2:

movax,data[bx]cmpax,data[bx+2]jbecontinue

xchgax,data[bx+2]movdata[bx],ax

;相邻两数

;比较

;交换位置

continue:

addbx,2

looploop2

movcx,di

looploop1ret

sortendp;

************

用到的寄存器ax,bx,di*************

next:

movah,4chint21h

codeends

endstart

实验截图

c:

:

n\maslihhansflu.asm

iMicrosoFtFlacr'aAssemblek*Uersion5.Q0

CapypisihtMicrosoftCoi*p1981—1985,1987.Allrightsreserved.

Objectf"ll^nnmeChanshu.OBJ]=

SourceLi^VirajCNUL-LST]=

Gt'os&-rcfercnGeCHUL.CRF]:

503001-41S4?

&Bytessymbolspacefree

HUarnin?

Errors

8SevereErrors

c:

\niisiiii>linkhanshu-ahj

Miei*&c:

oFtCR>Ouei'layLinkerUe^sion3_60

CopyrightCOMicposoFtCapp1999-1987-Allviffhtsi*cseFU«4_

RunFileEHAHSHU-EKE1:

ListFileEHUL.MAPJ:

Libpapi&EL_LIBl:

u*5谎s:

ri>h锻n醫hv<•uku

lionnanydat^s:

S

134231G8451042?

inputdata:

134231684510427

ordet-:

410132?

314Z4568

C;71也3;11》.

c:

:

\nA!

±iTk>hAnshu-

hoifn&hifdatas-1&

1t226.743212989401324212G834128

Inputd^ta:

16236743212769431334212G834±28

匕站严1fr6S81212122334674014327853342

g;

实验总结

这个实验跟第二个实验有比较大的关系;这个程序的成功运行也是在不断积累错误中产生的;由于我盲目的复制第二个实验里自己写的代码到第三个实验中,导致一系列错误,步步为营查找很就才查找到几个严重的错误:

1,错误运行结果截图

l:

hanshu.exe

511151111264841U?

5D111540391*13464*

"5I?

‘f1亍'-:

■■:

■KttlHILIMKVBHkhBrUtkKW

分析:

input中,要由num=0开始,所以将num存入ax后要把num置零

|c:

\niasmhanshu-exe

50115

5443;

)0000

不排序输出,也是这样,如

错误原因:

一,存入data[si]时,si是以incsi递增的;

二,读取data[si]时,也是以1递增的

由于data[]定义是dw,每个数据占两个字节,故导致以上错误;修改两处,用loop循环

修改后:

c:

5孔whu..

411224433*1234

c-\masmyhansItu._exe

6222244441111555566663333*li2233445566

进一步完善即记得上图中的正确结果:

c:

\riAsnk>hAnshu-

hoi/n^hifdatas:

1&

1t236.7432127894013242126824128

Inputdetta:

1&236742212789491334212G834128ot-der:

1fr6S81212122334674014327853342

g;

展开阅读全文
相关搜索

当前位置:首页 > 求职职场 > 社交礼仪

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

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