1、汇编语言程序设计实验报告ASSEMBLY LANGUAGE PROGRAMMING班级:计科 1103 班学号:2011014257姓名:朱楠北京化工大学信息科学与技术学院二一三年六月实验一 汇编语言源程序的建立、汇编、连接和运行1、实验目的:1.学习汇编语言源程序的编辑、汇编、连接、运行全过程。2.了解汇编程序、连接程序、DOS 系统装入和返回功能。掌握 MASM、LINK的应用。3.掌握汇编语言程序结构,熟悉汇编语言的一些常用语法规则,初步掌握汇编语言程序的开发过程。4.掌握 DOS 系统功能调用的基本方法。2、实验原理:调用 DOS 系统功能 21h 的简单输入输出功能。3、实验内容:1
2、.从键盘输入一个字符并回显到显示器上。 源程序: code segmentassume cs:codestart:mov ah,1int 21hmov ah,4chint 21hcode endsend start2.显示输出一个字符 Q 源程序:code segmentassume cs:codestart:mov ah,2mov dl,Qint 21hmov ah,4chint 21hcode endsend start3.在屏幕上显示输出“I love DOTA ” 源程序:data segmentznzn1 dbI LOVE DOTA$data endscode segmentassu
3、me cs:code,ds:datastart:mov ax,datamov ds,axlea dx,znzn1mov ah,9hint 21hmov ah,4chint 21hcode endsend start4.编写一个程序,要求从键盘输入一个小写字母,以其大写字母形式显示,否则显示 ERROR 源程序 data segmentstring db error!$data endscode segment assume cs:code,ds:datastart:mov ax,datamov ds,axmov ah,7int 21hcmp al,ajnl next1jmp next2next
4、1:cmp al,zjg next2mov ah,2sub al,20hmov dl,alint 21hmov ah,4chint 21hnext2:mov ah,9lea dx,stringint 21hmov ah,4chint 21hcode endsend start5.在屏幕上输出 10 个“T” 源程序:code segmentassume cs:codestart:mov cx,10again:mov ah,2mov dl,tint 21hloop againmov ah,4chint 21hcode endsend start4、结果与分析:按要求输入输出,完成实验要求。5、问
5、题讨论:初步体验汇编与 c 语言以及 c+的不同,结构较简单6、实验扩展(XB2):7、结论:8、实验心得:9、参考文献:IBM-PC 汇编语言程序设计(第二版)10、技术支持:实验二 调试程序 DEBUG 的使用1、实验目的:熟悉 DEBUG 的主要命令,学会使用 DEBUG 进行程序调试2、实验原理:1.DEBUG 程序的调用在 DOS 提示符下,可键入命令:C.DEBUG d:path文件名参数 1参数 2其中文件名是被调试文件的名字,他必须是可执行文件(EXE) ,两个参数是运行被调试文件是所需要的命令参数,在 DEBUG 程序调入后,出现提示符“_”此时,可键入所需的 DEBUG 命
6、令。2.DEBUG 的主要命令(1)显示内存单元内容的命令 D,格式为:-D地址或-D范围(2)修改内存单元内容的命令 E,他有两种格式: -E 地址 内容表和-E 地址(3)检查和修改寄存器内容的命令和标志位状态,格式为:-R,-R 寄存器名,-RF(4)运行命令 G,格式为:-G = 地址 1地址 2地址 3.(5)退出 DEBUG 命令 Q,格式为:Q3、实验内容:1.从键盘输入一个字符,与 x,y,z 比较,相等则输出 10 个*或 或$ 源程序:code segmentassume cs:codestart:mov ah,7int 21hcmp al,xjz start1cmp al
7、,yjz start2cmp al,zjz start3mov ah,4chint 21hstart1:mov cx,10again1:mov ah,2mov dl,*int 21hloop again1mov ah,4chint 21hstart2:mov cx,10again2:mov ah,2mov dl,int 21hloop again2mov ah,4chint 21hstart3:mov cx,10again3:mov ah,2mov dl,$int 21hloop again3mov ah,4chint 21hcode endsend start2.将输入的字符串转换为大写字符
8、串显示 源程序:data segmentstring db 100db 0db 100 dup($)data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov dx,offset stringmov ah,0ahint 21hmov ah,2mov dl,13int 21hmov dl,10int 21hmov di,0add di,2next:cmp stringdi,13jz next1mov cl,stringdisub cl,20hmov stringdi,clinc dijmp nextnext1:
9、mov ah,9mov dx,offset stringadd dx,2int 21hmov ah,4chint 21hcode endsend start3.接收一个字符,找出它的前导字符和后续字符,按顺序显示这三个字符,有提示信息 源程序:data segmentstr1 db plese input one character$str2 db ?,?,?,$data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlea dx,str1mov ah,9int 21hmov ah,2mov dl,13int 2
10、1hmov dl,10int 21hmov ah,7int 21hmov dl,alsub dl,1mov str20,dlcmp str20,ajb next1jmp next4next1:mov str20,#next4:mov str21,aladd al,1mov str22,alcmp str22,zja next2jmp next3next2:mov str22,#jmp next3next3:lea dx,str2mov ah,9int 21hmov ah, 4chint 21hcode endsend start4.从键盘接收一串字符,在下一行输出剔除其中数字字符的字符串,有提
11、示信息。 源程序:data segmentstr1 db Plese input a string.$array db 100 dup(?) data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlea dx,str1mov di,0mov ah,9int 21hagain:mov ah,1int 21hcmp al,13jz exitcmp al,0jb nextcmp al,9ja nextjmp againnext:mov arraydi,alinc dijmp againexit:mov ah,2mov
12、 dl,13mov dl,10int 21hmov cx,dimov si,0inc cxagain1:mov ah,2mov dl,arraysiinc siint 21hloop again1mov ah,4chint 21hcode endsend start5.判断某正整数是否为素数,是输出一,否则输出 n 源程序:code segmentassume cs:codestart:mov bx,0next:mov ah,1int 21hcmp al,13je exitsub al,30hmov ah,0xchg ax,bxmov cx,10mul cxxchg ax,bxadd bx,a
13、xjmp nextexit:mov cx,2next3:cmp cx,bxjz next2mov ax,bxsub dx,dxdiv cxcmp dx,0jz next1inc cxjmp next3next1:call changemov ah,2mov dl,nint 21hmov ah,4chint 21hnext2:call changemov ah,2mov dl,yint 21hmov ah,4chint 21hchange proc nearmov ah,2mov dl,13int 21hmov dl,10int 21hretchange endpcode endsend sta
14、rt4、结果与分析程序 1 运行截图:程序 2 运行截图:程序 3 运行截图:程序 4 运行截图:程序 5 运行截图:五、问题讨论:第三个程序中,考虑到第一个或最后一个字符找不到他的前导字符和后续字符,所以用#代替六、实验扩展(XB2):七、结论:八、实验心得:九、参考文献:IBM-PC 汇编语言程序设计(第二版)十、技术支持:实验三 数据统计及查找1、实验目的:1.熟悉汇编语言程序的开发方法和过程。2.掌握汇编语言程序设计中分支及循环程序设计的基本方法。3.掌握汇编语言程序设计中数据分类统计的基本方法。二、实验原理:运用存储器寻址方式寻址,找到内存中的相应字符做统计。三、实验内容: 源程序:
15、11.data segmentNum_Dight dw 0Num_Letter dw 0Num_Others dw 0data endscode segmentassume cs:code,ds:datastart:mov ax,0fff0hmov ds,axmov di,0mov cx,100again:mov bx,ds:dicmp bx,0jb l1cmp bx,9jbe l2cmp bx,Ajb l1cmp bx,Zjbe l3cmp bx,ajb l1cmp bx,zjbe l3jmp l1l1:mov ax,datamov ds,axinc Num_Othersmov ax,0ff
16、f0hmov ds,axinc diloop againmov ah,4chint 21hl2:mov ax,datamov ds,axinc Num_Dightmov ax,0fff0hmov ds,axinc diloop againmov ah,4chint 21hl3:mov ax,datamov ds,axinc Num_Lettermov ax,0fff0hmov ds,axinc diloop againmov ah,4chint 21hcode endsend start12.data segmentstr db he34ll434o43 w43or35l3d!data end
17、scode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov di,0mov cx,24again:mov dl,strdicmp dl,0jb nextcmp dl,9ja nextnext1:inc diloop againjmp exitnext:mov ah,2mov dl,strdiint 21hjmp next1exit:mov ah,4chint 21hcode endsend start 流程图:先将 0fff0h 给到段地址,置循环次数 100 次,偏移量依次加一找到字母后相应的变量加一找到数字后相应的变量加
18、一既不是字母也不是数字的其他字符相应的变量加一四、结果与分析:5、问题讨论:6、实验扩展:7、结论:可以熟练运用 dos 系统功能调用(int 21h)的综合运用,同时了解了汇编语言的分支结构程序写法。8、实验心得:实验有错误,首先要自己尝试着调,这样才会有比较大的进步。实在不会,也可以找同学讨论讨论,在讨论中互相学习。九、参考文献:IBM-PC 汇编语言程序设计第二版十、技术支持:实验四 字符串搜索1、实验目的:1、进一步熟悉汇编语言程序的开发方法和过程。2、掌握汇编语言程序设计中字符串搜索的基本方法2、实验原理:使用串比较指令判断子串在主串中相匹配的位置3、实验内容: 源程序:13. da
19、ta segmentstr1 db Enter keyword:$str2 db Enter sentence:$str3 db Match at location:$str4 db No match!$str5 db H of the sentence$buf1 db 100db 0db 100 dup(?)buf2 db 100db 0db 100 dup(?)data endscode segmentassume cs:code,ds:data,es:datastart:mov ax,datamov ds,axmov es,axmain proc farcall enterkcall c
20、rlfrepeat:call enterscall compjmp repeatmain endpenterk proc nearmov dx,offset str1mov ah,9int 21hmov di,0newchar1:mov ah,1int 21hcmp al,13jz exit2mov buf1di,alinc dijmp newchar1exit2:mov cx,diretenterk endpcrlf proc nearmov ah,2mov dl,13int 21hmov dl,10int 21hretcrlf endpenters proc nearlea dx,str2
21、mov ah,9int 21hmov di,0newchar:mov ah,1int 21hcmp al,27jz exitcmp al,13jz exit1mov buf2di,alinc dijmp newcharexit1:mov ax,diretenters endpcomp proc nearpush cxlea di,buf2mov bx,dimov dx,cxmov cx,axinc axagain:mov di,bxlea si,buf1mov cx,dxcldrepe cmpsbjz next1inc bxdec axmov cx,axloop againcall crlfm
22、ov ah,9mov dx,offset str4int 21hcall crlfexit3:pop cxretcomp endpnext1:call changejmp exit3change proc nearcall crlfmov ah,9mov dx,offset str3int 21hlea di,buf2sub bx,diadd bx,1mov ch,4rotate:mov cl,4rol bx,clmov al,bland al,0fhadd al,30hcmp al,3ahjl printitadd al,7printit:mov dl,almov ah,2int 21hde
23、c chjnz rotatemov ah,9mov dx,offset str5int 21hcall crlfretchange endpexit:mov ah,4chint 21hcode endsend start14. data segmentstr1 db Please input the password:$str2 db Password error!$str3 db Welcome to use!$key db zk123456,100 dup(?)buf1 db 100 dup(?)data endscode segmentassume cs:code,ds:data,es:
24、datastart:mov ax,datamov ds,axmov es,axmov bx,0lea dx,str1mov ah,9int 21hlea si,buf1next1:mov ah,7int 21hmov si,alinc sicmp al,13jz next2mov ah,2mov dl,*int 21hjmp next1next2:lea bp,buf1sub si,bpcmp si,9ja nexttlea si,buf1lea di,keymov cx,8cldrepz cmpsbjz next3nextt:mov ah,2mov dl,13int 21hmov dl,10
25、int 21hmov dx,offset str2mov ah,9int 21hcmp bx,2jz exitinc bxmov ah,2mov dl,13int 21hmov dl,10int 21hmov dx,offset str1mov ah,9int 21hlea si,buf1jmp next1next3:mov ah,2mov dl,13int 21hmov dl,10int 21hlea dx,str3mov ah,9int 21hnext4:mov ah,7int 21hcmp al,1jnz exitjmp next4exit:mov ah,4chint 21hcode e
26、ndsend start4、结果与分析:1.2.5、问题讨论:对于输出的十六进制数开头为零的没有消去,看起来不简约6、实验扩展(XB2):7、结论:8、实验心得:9、参考文献:IBM-PC 汇编语言程序设计10、技术支持:实验七 宏指令的调用1、实验目的:1、掌握宏指令的使用。2、进一步熟悉 DOS 系统功能调用方法。2、实验原理:宏调用3、实验内容: 源程序:qp macro a,b,c,d,e,fmov ah,6mov al,fmov bh,emov ch,amov cl,bmov dh,cmov dl,dint 10hendmzgb macro a,bmov bh,0mov ah,2mo
27、v dh,amov dl,bint 10hendmcode segmentassume cs:codestart:qp 0,0,24,79,0,0qp 7,19,19,51,04fh,0qp 8,20,18,50,02fh,0next:zgb 18,20mov cx,30again:mov ah,1int 21hcmp al,27jz exitloop againqp 8,20,18,50,02fh,1jmp nextexit:mov ah,4chint 21hcode endsend start 流程图:清屏为黑色在屏幕中间显示一个品红色的矩形块在品红色矩形块内再显示一个绿色矩形块将光标至于
28、窗口左下角在光标处输入字符,当字符数超过三十个时上卷一行,光标回到原处按 ESC 键退出4、结果与分析:5、问题讨论:6、实验扩展(XB2):7、结论:8、实验心得:九、参考文献:IBM-PC 汇编语言程序设计第二版十、技术支持:【习题 18】1、实验目的:显示 8 个“I LOVE YOU FOREVER”并闪烁2、实验原理:调用 BIOS 功能,先用 6 号功能清黑屏,再用 DOS 的 21h7 号功能输入 y,最后用 BIOS 功能的 13 号功能显示字符串3、实验内容: 流程图: 源程序:data segmentstring db I LOVE YOU FOREVER!len_str
29、equ $-stringdata endscode segmentassume cs:code,ds:datastart:mov ah,0mov al,3int 10hmov ah,6mov al,0mov bh,0mov ch,0mov cl,0mov dh,24mov dl,79int 10hna:mov ah,7int 21hcmp al,yjz nextjmp nanext:mov bp,seg stringmov es,bpmov bp,offset stringmov cx,len_strmov dx,0mov bl,0dahmov al,0mov ah,13hint 10hnq:
30、mov ah,7int 21hcmp al,27jz next1jmp nqnext1:mov ah,4chint 21hcode endsend start四、结果与分析:不能闪烁,可能是系统不支持五、问题讨论:六、实验扩展(XB2):七、结论:Bx,多用于基址寄存器,cx,多用于循环计数。八、实验心得:对于 BIOS 功能,对汇编有了更深的理解,以前用 c,c+ 是做不到的九、参考文献:IBM-PC 汇编语言程序设计(第二版)十、技术支持:【习题 19】一、实验目的:编写一个查询表将十六进制数 00H0FH 转化为十六进制数字的 ASCII 码字符。二、实验原理:将 015 转化为对应的
31、16 进制数三、实验内容: 流程图: 源程序:data segmentbuf db 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,Fdata endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axcall inputmov ah,2mov dl,10int 21hmov dl,13int 21hmov dl,bufbxint 21hmov ah,4chint 21hinput proc nearmov bx,0newchar:mov ah,1int 21hcmp al,13jz exitsub al,30hcbwxchg ax,bxmov cx,10mul cxxchg ax,bxadd bx,axjmp newcharexit:retinput endpcode endsend start4、结果与分析: