1、计算机原理与汇编语言实验报告123实验1:循环接收用户按键输入,将用户输入的大字母原样输出,将用户输入的小写字母转换为小写字母再输出,用户若输入数字 0则退出程序,其它情况输出实验程序代码data segme ntstr db error!$data endsstack segme nt para stack stackdb 100 dupstack endscode segme ntassume ds:data,cs:code,ss:stackstart:mov ax,datamov ds,axaga in:mov ah,01hint 21hcmp al,0je nextcmp al,Ajb
2、 error ;小于A的出错cmp al,Zjbe print1 ;在 A, Z 之间的输出 print1cmp al,ajb error ;在Z(41hH)和a(61H)之间的出错cmp al,zjbe print2 ;在 a,z 之间的输出 print2jmp errorprin t1: mov dl,almov ah,02hint 21hjmp again ;循环输入,againprin t2:mov dl,alsub dl,20hmov ah,02hint 21hjmp again ;循环输入,againerror :mov dx,offset str mov ah,09h int 2
3、1h n ext:mov ah,4ch int 21hcode endsend start实验截图=jua-smySblg-. exe RkKHHl IsGBei-roi*:5比 x# GyVUUQ=5陶E.实验总结这个实验比较简单,花费的时间也少,将我们学习的理论知识用于实践 第一次真实的体会到汇编语言的特点,以及和 C+语言的区别。实验2:从键盘接收用户输入的一个正整数(0-32767 之间),输出该数字的所有因子data segme ntstr db input data 0-32767:$num dw 0stri ng db 5 dup(0)data endsstack segme n
4、t para stack stackdb 1000 dup(?)stack endscode segme ntassume ds:data,cs:codestart:mov ax,datamov ds,axmov dx,offset strmov ah,09hint 21h ;显示标题mov si,0mov di,0rein:mov ah,01hint 21hcmp al,20hjz inte ;输入空格表示输入结束cmp al,30hjb exit ;不在0-9之间的退出cmp al,39hja exitsub al,30h ;不在0-9之间的退出mov stri ngsi,alinc si
5、cmp si,6jz exit ;输入位数超过5位的退出jmp rein;* 以下整和整dec si ;到达这一步时,si比输入的位数大1,所以要减1in te:mov bx,nummov ax,10mul bxadd al,stri ngdiadc ah,00hmov nu m,axinc dicmp di,sijb inte ;得出的整数放置于变量 num中.*以下求因子,输出mov bx,0aga in:mov ax,num mov dx,0 inc bxcmp bx, numja exitdiv bxcmp dx,0je tcalljmp aga intcall:call tpri n
6、tjmp aga intprint proc near ;print 子程序打印输出 bxmov cx,10mov si,4mov ax,bxboa1:cmp ax,10jb boa2xor dx,dxdiv cxor dl,30hmov stri ngsi,dldec sijmp boalboa2:or al,30hmov stri ngsi,alg:mov dl,stringsi 打出输出 ASCIImov ah,2int 21hinc sicmp si,5jne gmov dl,20hmov ah,2int 21h ;空格隔开每个因子rettpri nt endpexit: mov ah
7、,4chint 21hcode endsend start实验截图C: MJsers?cd e : masnc : na&nniasfi iinzl.asnkMiciTQSpFt Macro AsenbLr Ucrsion 5-00Copyrilit HicrosoFt Corp 1981-1985, 1917. All rights reserved.Object filename Csiinzi.OBJ:Soiivr* 1 ist ing CNIJT. 1 TCross-Feference CNUL.CRF:50386 + 吗J.53?0 B/tes snbol space freeQ U
8、arning Errors0 Severe Errorsc - na.c m 1 i(h k i/inz i a bjHicro?nft Overlap Linker Uersion 3.60Copyriflit Nicrosoft Corp 1383-1987 H11 rights reserved.Run File VIHZI.EXEJ:List File NUL.KAP1:LibFat*ies L.LIBI:c-nasm91nz i.exeinput data 0-32767:12 1 2 3 4 6 12c : masinyinzi exeinput data 0 327G7=C?S?
9、 1 3 31 ? 93 219 2263 G789c:Snasmyinaiinput dAtA 0-32767:12345 1 3 5 15 823 2469 4115 12345c - masmyinsi.exeinput dAtA 0-32767:B 1248匸:11|孔11注释1:以上为编译连接运行的结果,其中,输入的, 12,120,1310,6789,12345,8等均能给出因子。注释2:下图为,特殊的输入情况下,程序退出 一,输入的字符不是09之间的字符,退出 二,输入的位数超过范围(032767),退出d : Smasmi/in21 .exeinput data 0-3276?
10、: 1 2 4 HD:Xnasmin2 i.exeinput data 0-3276?:rD : nasnlyinz . exe input data 0-32767:c ; 5dMiuy;Ln乂 1.input data 0-32767:222222c:nasm输入字符 r -等退出程序输入的整数222222超过范围,自动退出程序实验总结本次实验花费了较长时间,其中在修改调试程序上花费时间占绝大部分。在实验代码的一步步完善过程中,经历了一下步骤:1, 程序编译出错这里的问题出现在语法错误上,不过这些错误很少,容易修改;不过有一个 错误是提示:no end of file,造成的原因是由于我定
11、义调用宏,编译时出现的 一个不会修改的错误。之后我去掉宏,然后把宏内的代码直接复制到相应的 位置,之后再次编译,没有错误。2, 编译连接都没有错误,但在运行时出错修改运行,出现无限循环输出乱码情况,再次,修改后,出现一个更严重的 情况,只要我一运行 yinzi.exe程序,电脑就发出 do的报警声,再次修改, .,再后面,程序可以运行,并且可以输出一些正常的结果3, 在根据输入的ASCII字符转换成整数时,如下代码in te:dec simov bx, nummov ax,10 此行代码错误mul bxadd al,stri ngdiadc ah,OOhmov nu m,axinc dicmp
12、 di,sijb inte程序运行结果是:一,能正确求出两位数的因子,如 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:这个移到下一行即可解决问题;虽然,实验花了很长时间修改,克服种种错误终于能够输出正确结果, 但我觉得 不但的找出错误并修正错误这个过程更能锻炼人, 学到的东西更多。不过,我们 在写程序时,一定要细心谨慎,因为如果写的时候不仔细,回头再次调试修改的 话就得花更多的时间,不值得,这是我的一点心得体
13、会。实验3:从键盘接收用户输入的一个正整数(0-32767 之间),输出该数字的所有因 子。1、 函数in put:接收用户一个正整数,将数据保存到 AX2、 函数outpot:将AX中的数据在屏幕上显示出来3、 函数sort:将BX所指向的一批数据进行排序,数据个数在AX中从键盘接收 用户一批数据输入,对该批数据从小到大排序,将原数据和排序后的数据在屏幕 上显示出来。实验程序代码datal segme ntn dw 0000hdata dw 100 dupnum dw 0buffer db 5 dup ;输入ASCII转换成整数的缓冲区stri ng0 db how many datas:
14、$stri ng1 db in put data: $string2 db order: $data1 endsstack segme nt para stack stackdb 100 dupstack endscode segme ntassume ds:data1,cs:code start:mov ax,data1mov ds,axmov dx,offset stri ngOdata中mov ah,9 int 21h call in put mov n,axmov dl,0ah mov ah,2 int 21hmov cx,n mov di,0 data in: call in put
15、mov datadi,axadd di,2 loop data inmov dl,0ah mov ah,2 int 21hmov dx,offset stri ng1 mov ah,9int 21h mov si,0 mov cx,n aga in 1:mov ax,datasicall output add si,2 loop aga in1 mov dl,0ah mov ah,2 int 21hmov dx,offset stri ng2 mov ah,9int 21hmov cx,n call sortmov si,0 mov cx,n aga in 2:mov ax,datasical
16、l output add si,2 loop aga in2 jmp n ext;提示输入多少数据;数据个数存入到变量n中;换行;循环输入几个数据打印出,并存入到;换行;提示输出排序前的;换行;提示输出排序后的;对data排序in put proc near ;* 接收输入的整数存入 AX 中,参数 buffer, nu m*push dipush bxmov si,0mov di,0rein:mov ah,01hint 21hcmp al,20hje inte ;空格表示输入结束sub al,30hmov buffersi,alinc sicmp si,5jb reindec siin te
17、:mov bx,nummov ax,10mul bxadd al,bufferdiadc ah,00h mov nu m,axmov bufferdi,00h ;清零inc di cmp di,sijb intemov ax,num ;将整理好的整数放到 AX中mov num,0000h用完 num 清 0pop bx pop diretinput endp ;* 用到的寄存器 ax,si,di,bx*output proc near ;*打印出AX中的数据,传入参数 AX即可*push cxpush sipush dxmov cx,10mov si,4 boa1:cmp ax,10 jb b
18、oa2 xor dx,dx div cxor dl,30hmov buffersi,dl dec sijmp boal boa2:or al,30hmov buffersi,al g:mov dl,buffersi mov ah,2 int 21hmov buffersi,0 inc sicmp si,4jbe gmov dl,20hmov ah,2int 21h pop dx pop si;打出输出ASCII;打印完后清零,避免重叠;空格隔开pop CXoutput endp ;*sort proc near ;*用到的寄存器 ax,cx,si,dx*字序列的冒泡排序子程序,参数 data,
19、cx(元素个数)ret*;比较遍数;比较次数dec cx loop1:mov di, cxmov bx, 0 loop2:mov ax, databx cmp ax, databx+2 jbe con ti nuexchg ax, databx+2 mov databx, ax;相邻两数;比较;交换位置con ti nue:add bx, 2loop loop2mov cx, diloop loop1 retsort endp ;*用到的寄存器 ax,bx,di *n ext:mov ah,4ch int 21hcode endsend start实验截图c: : n m aslih hans
20、 flu. asmiMicrosoFt Flacra Assemblek* Uersion 5 .Q0Capypisiht Microsoft Coi*p 19811985, 1987. All rights reserved.Object fllnnme Chanshu.OBJ=Source LiViraj CNUL-LST=Gtos&-rcfercnGe CHUL.CRF:50300 1- 41S4?& Bytes symbol space freeH Uarnin? Errors8 Severe Errorsc: niisiiiilink hanshu-ahjMiei*&c:oFt CR
21、 Oueilay Linker Uesion 3_60Copyright CO MicposoFt Capp 1999-1987- All viffhts i*cseFU4_Run File EHAHSHU-EKE1:List File EHUL.MAPJ:Libpapi&E L_LIBl:u * 5谎s:rih锻n醫hvhAnshu -ho if n&hif datas - 1&1 t 22 6.7 432 12 989 401 3242 12 G 8 34 12 8Input dta: 1 6 23 67 432 12 769 431 3342 12 G 8 34 2 8。匕站严 1 fr
22、 6 S 8 12 12 12 23 34 67 401 432 785 3342g;实验总结这个实验跟第二个实验有比较大的关系;这个程序的成功运行也是在不断积累 错误中产生的;由于我盲目的复制第二个实验里自己写的代码到第三个实验中, 导致一系列错误,步步为营查找很就才查找到几个严重的错误:1,错误运行结果截图l : hanshu. exe5 111 511 112 6484 1U ?5D1 115 4039 1*13 464 *5I? f1 亍-: :KttlHILIMKVBHkhBrUtkKW分析:in put中,要由n um=0开始,所以将 num存入ax后要把num置零|c: nias
23、 m han s hu - e xe5 0 1155 4 4 3;)0 0 0 0不排序输出,也是这样,如错误原因:一,存入datasi时,si是以inc si递增的;二,读取datasi时,也是以1递增的由于data定义是dw,每个数据占两个字节,故导致以上错误;修改两处,用 loop循环修改后:c : 5孔whu.411224433 *1234c - masmyhan sItu._ exe6 22 22 44 44 11 11 55 55 66 66 33 33 *li 22 33 44 55 66进一步完善即记得上图中的正确结果:c: riAsnkhAnshu -hoi/ nhif datas: 1&1 t 23 6.7 432 12 789 401 3242 12 6 8 24 12 8Input detta: 1 & 23 67 422 12 789 491 3342 12 G 8 34 12 8 ot-der: 1 fr 6 S 8 12 12 12 23 34 67 401 432 785 3342g;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1