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