实验1:循环接收用户按键输入,将用户输入的大字母原样输出,将用户输入的小写字母转换为小写字母再输出,用户若输入数字0则退出程序,其它情况输出“error!”实验程序代码str db 'error!$'data endsstack segment para stack 'stack'db 100 dup(?)stack endscode segmentassume ds:data,cs:code,ss:stackstart:mov ax,datamov ds,axagain:mov ah,01hint 21hcmp al,'0'je nextcmp al,'A'jb error ;小于A的出错cmp al,'Z'jbe print1 ;在A,Z之间的输出print1cmp al,'a'jb error ;在Z(41hH)和a(61H)之间的出错cmp al,'z'jbe print2 ;在a,z之间的输出print2jmp errorprint1: mov dl,almov ah,02hint 21hjmp again ;循环输入,againprint2:mov dl,alsub dl,20hmov ah,02hint 21hjmp again ;循环输入,againerror :mov dx,offset strmov ah,09hint 21hnext:mov ah,4chint 21hcode endsend start实验截图实验总结实践。
第一次真实的体会到汇编语言的特点,以及和C++语言的区别。
实验2:从键盘接收用户输入的一个正整数(0-32767之间),输出该数字的所有因子。
实验程序代码输入字符(0-9),判断合法性,减去30H,存入到数组string[]中将数组string[]里的数字,整合转换为正整数,存入变量num中求出num的因子,存入string[]中转换string[]中数据,加30H,输出ASCIIdata segmentstr db 'input data 0-32767:$'num dw 0string db 5 dup(0)data endsstack segment para stack 'stack'db 1000 dup(?)stack endscode segmentassume 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 string[si],alinc sicmp si,6jz exit ;输入位数超过5位的退出jmp rein;*******************以下整和整数dec si ;到达这一步时,si比输入的位数大1,所以要减1 inte:mov bx,nummov ax,10mul bxadd al,string[di]adc ah,00hmov num,axinc dicmp di,sijb inte ;得出的整数放置于变量num中;********************以下求因子,输出mov bx,0again:mov ax,nummov dx,0inc bxcmp bx,numja exitdiv bxcmp dx,0je tcalljmp againtcall:call tprintjmp againtprint proc near ;print子程序打印输出bxmov cx,10mov si,4mov ax,bxboa1:cmp ax,10jb boa2xor dx,dxdiv cxor dl,30hmov string[si],dldec sijmp boa1boa2:or al,30hmov string[si],alg:mov dl,string[si] ;打出输出ASCIImov ah,2int 21hinc sicmp si,5jne gmov dl,20hmov ah,2int 21h ;空格隔开每个因子rettprint endpexit: mov ah,4chint 21hcode endsend start实验截图注释1:以上为编译连接运行的结果,其中,输入的,12,120,1310,6789,12345,8等均能给出因子。
注释2:下图为,特殊的输入情况下,程序退出1,输入的字符不是0—9之间的字符,退出2,输入的位数超过范围(0—32767),退出输入字符‘r’,‘-’等退出程序输入的整数222222超过范围,自动退出程序实验总结本次实验花费了较长时间,其中在修改调试程序上花费时间占绝大部分。
在实验代码的一步步完善过程中,经历了一下步骤:1,程序编译出错这里的问题出现在语法错误上,不过这些错误很少,容易修改;不过有一个错误是提示:no end of file,造成的原因是由于我定义调用宏,编译时出现的一个不会修改的错误。
之后我去掉宏,然后把宏内的代码直接复制到相应的位置,之后再次编译,没有错误。
2,编译连接都没有错误,但在运行时出错修改运行,出现无限循环输出乱码情况,再次,修改后,出现一个更严重的情况,只要我一运行yinzi.exe程序,电脑就发出do的报警声,再次修改,……….,再后面,程序可以运行,并且可以输出一些正常的结果3,在根据输入的ASCII字符转换成整数时,如下代码inte:dec simov bx,nummov ax,10 此行代码错误mul bxadd al,string[di]adc ah,00hmov num,axinc dicmp di,sijb inte程序运行结果是:1,能正确求出两位数的因子,如12,为1,2,3,4,6,12等2,输入三位数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:接收用户一个正整数,将数据保存到AX2、函数outpot:将AX中的数据在屏幕上显示出来3、函数sort:将BX所指向的一批数据进行排序,数据个数在AX中从键盘接收用户一批数据输入,对该批数据从小到大排序,将原数据和排序后的数据在屏幕上显示出来。
实验程序代码n dw 0000hdata dw 100 dup(?)num dw 0buffer db 5 dup(?) ;输入ASCII转换成整数的缓冲区string0 db 'how many datas: $'string1 db 'input data: $'string2 db 'order: $'data1 endsstack segment para stack 'stack'db 100 dup(?)stack endscode segmentassume ds:data1,cs:codestart:mov ax,data1mov ds,axmov dx,offset string0mov ah,9int 21h ;提示输入多少数据call inputmov n,ax ;数据个数存入到变量n中mov dl,0ahmov ah,2int 21h ;换行mov cx,nmov di,0datain:call inputmov data[di],axadd di,2loop datain ;循环输入几个数据打印出,并存入到data[]中 mov dl,0ahmov ah,2int 21h ;换行mov dx,offset string1mov ah,9int 21h ;提示输出排序前的mov si,0mov cx,nagain1:mov ax,data[si]call outputadd si,2loop again1mov dl,0ahmov ah,2int 21h ;换行mov dx,offset string2mov ah,9int 21h ;提示输出排序后的mov cx,ncall sort ;对data[]排序mov si,0mov cx,nagain2:mov ax,data[si]call outputadd si,2loop again2jmp nextinput proc near ;*****接收输入的整数存入AX中,参数buffer[],num********push dipush bxmov si,0mov di,0rein:mov ah,01hint 21hcmp al,20hje inte ;空格表示输入结束sub al,30hmov buffer[si],alinc sicmp si,5jb reindec siinte:mov bx,nummov ax,10mul bxadd al,buffer[di]adc ah,00hmov num,axmov buffer[di],00h ;清零inc dicmp di,sijb intemov ax,num ;将整理好的整数放到AX中mov num,0000h;用完num清0pop bxpop diretinput endp ;***** 用到的寄存器ax,si,di,bx****************output proc near ;*****打印出AX中的数据,传入参数AX即可******** push cxpush sipush dxmov cx,10mov si,4boa1:cmp ax,10jb boa2xor dx,dxdiv cxor dl,30hmov buffer[si],dldec sijmp boa1boa2:or al,30hmov buffer[si],alg:mov dl,buffer[si] ;打出输出ASCIImov ah,2int 21hmov buffer[si],0 ;打印完后清零,避免重叠inc sicmp si,4jbe gmov dl,20hmov ah,2int 21h ;空格隔开pop dxpop sipop cxretoutput endp ;***** 用到的寄存器ax,cx,si,dx**************sort proc near ;********* 字序列的冒泡排序子程序,参数data[],cx(元素个数) *********dec cx ;比较遍数loop1:mov di, cx ;比较次数mov bx, 0loop2:mov ax, data[bx] ;相邻两数cmp ax, data[bx+2] ;比较jbe continuexchg ax, data[bx+2] ;交换位置mov data[bx], axcontinue:add bx, 2loop loop2mov cx, diloop loop1retsort endp ; ************用到的寄存器ax,bx,di ************* next:mov ah,4chint 21hcode endsend start实验截图不断积累错误中产生的;由于我盲目的复制第二个实验里自己写的代码到第三个实验中,导致一系列错误,步步为营查找很就才查找到几个严重的错误:1,错误运行结果截图,‘*’测试用的2,不排序输出,也是这样,如错误原因:1,存入data[si]时,si是以inc si递增的;2,读取data[si]时,也是以1递增的由于data[]定义是dw,每个数据占两个字节,故导致以上错误;修改两处,用loop循环修改后:进一步完善即记得上图中的正确结果:。