当前位置:文档之家› 大学课程汇编语言的实验报告

大学课程汇编语言的实验报告

实验报告实验课程:学生姓名:学号:专业班级:电气信息类III班2011年12月20日目录(1)汇编语言程序上机过程 (2)(2)字符串处理程序实验 (6)(3)子程序实验 (13)(4)中断程序实验 (21)(5)C++调用汇编子程序 (25)南昌大学实验报告---(1)汇编语言程序上机过程学生姓名:学号:专业班级:实验类型:□验证■综合□设计□创新实验日期:2011.11.12/13实验成绩:一、实验目的熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。

了解汇编语言程序的汇编、运行环境。

二、实验内容1.掌握常用的编辑工具软件(如WORD、EDIT)、MASM和LINK的使用;2.伪指令:SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;3.利用的INT21H的1号功能实现键盘输入的方法;三、实验环境PC微机DOS操作系统或Windows操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境四、实验要求1.仔细阅读有关伪指令SEGMENT,ENDS,ASSUME,END,OFFSET,DUP的内容;2.了解利用的INT21H的1号功能实现键盘输入的方法,了解.EXE文件和.COM文件的区别及用INT21H4C号功能返回系统的方法;3.阅读下面程序段。

五、主要实验步骤程序:data segmentmessage db'This is a sample program of keyboard and disply'db0dh,0ah,'Please strike the key!',0dh,0ah,'$'data endsstack segment para stack'stack'db50dup(?)stack endscode segmentassume cs:code,ds:data,ss:stackstart:mov ax,datamov ds,axmov dx,offset messagemov ah,9int21hagain:mov ah,1int21hcmp al,1bhje exitcmp al,61hjc ndcmp al,7ahja ndand al,11011111bnd:mov dl,almov ah,2int21hjmp againexit:mov ah,4chint21hcode endsend start实验步骤:1.用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。

2.用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。

若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。

3.用TYPE命令显示1产生的.LST文件。

4.用LINK将.OBJ文件连接成可执行的.EXE文件。

5.在DOS状态下运行LINK产生的.EXE文件。

即在屏幕上显示标题并提示你按键。

每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。

按ESC键可返回DOS。

若未出现预期结果,用DEBUG检查程序。

六、思考题1、若在源程序中把INT21H的'H'省去,会产生什么现象?代码编译连接均为正常,但是运行时无法输入与输出,也无法退出。

2、把INT21H4CH号功能改为INT20H,行不行?更改后,编译链接均正常,输入输出也正常,但是按下ESC退出时会出现错误,错误如下:七、参考资料《IBM-PC汇编语言程序设计》《汇编语言实验指导书》南昌大学实验报告---(2)字符串处理实验学生姓名:学号:专业班级:实验类型:□验证■综合□设计□创新实验日期:2011.11.20/21实验成绩:___一.实验目的1.熟悉串操作指令的功能与应用;2.掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。

二.实验内容1.字符串统计。

自STRN开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。

2.在给定的字符串中,删除重复的字符,其余的字符向前递补。

三.实验要求1.认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。

2.按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。

四.实验环境PC微机DOS操作系统或Windows操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境五.实验步骤1.用1号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。

程序每次执行,都能得到不同的结果。

;COUNTDC.ASMDATA SEGMENTSTRN DB80DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DI,STRNMOV CL,0AGAIN:MOV AH,1 INT21HCMP AL,0DHJZ DONEMOV[DI],ALINC DIINC CLJMP AGAIN DONE:LEA SI,STRN MOV CH,0MOV BL,0CLDCYCLE:LODSB①CMP AL,61HMP AL,7AHCJA NEXTINC BL NEXT:LOOP CYCLE MOV AL,BLMOV AH,0MOV CL,10DIV CLXCHG AH,ALPUSH AXMOV DX,0DHMOV AH,2INT21HMOV DX,0AHMOV AH,2INT21HPOP AXMOV DL,AHOR DL,30HMOV AH,2PUSH AXINT21HPOP AXMOV DL,AL1OR DL,30H1INT21HPOP AXMOV DL,ALOR DL,30HMOV AH,2INT21HMOV AH,4CHINT21HCODE ENDSEND START编译源程序:如下,发现地29行有错误。

用EDIT命令找到错误地方,并进行修改,如下图所示:修改后保存程序,重新编译:重新编译后程序没有错误,用反汇编查看指令代码:如下图所示:运行程序,验证程序设计结果的正确性。

显示结果如下:从键盘上输入字符串“ADKJjkdjfljdeowekdjg”,共二十个字符,其中小写字母十六个,由运行结果可知,程序运行正确,实现了设计要求。

②实验2课参考教材第五章练习10的解法,但要编写一个在同一个字符串中删除字符,并将其余字符向前递补。

删除字符串中重复字符的源程序清单:MOV BYTE PTR[SI],0GOON:LOOP COMP;查出与该字符重复的所有字符,并用0NEXT1:POP DXPOP SIDEC SIDEC DXMOV CX,DXJNZ REPEAT;对所有重复字符都进行查找LEA SI,STRN;删除重复字符MOV CL,LENMOV CH,0CYCLE:MOV AL,[SI]INC CLCMP AL,0;是重复字符吗?JNZ NEXT;不是,查找下一个字符DEC CX;递补子串长度送CXJZ ALLDONECALL DELE;删除该空字符并递补DEC SINEXT:INC SI③LOOP CYCLEALLDONE:MOV DL,0AHMOV AH,2INT21HMOV DL,0DHMOV AH,2INT21HLEA DX,STRNMOV AH,9INT21HMOV AH,4CHINT21HDELE PROCPUSH SIPUSH CXCLDMOV DI,SI;空字符处为目的首址INC SI;下一个地址为源串首址REP MOVSBPOP CXPOP SIRETDELE ENDPCODE ENDSEND STARTPOP SIRETDELE ENDPCODE ENDSEND START编译源程序,检查程序的正确性,如下图所示:源程序在27行有错误,有提示的消息可知,此处需要用到变址或基址寄存器,用EDIT命令找到错误的地方,并改正:此处是寄存器直接寻址,把cl的值送给标号为LEN存储单元,所以应去掉”[]”修改程序保存再编译以检查是否还有错误:有上图编译可知,程序修改正确,接下来连接成目标程序:生成的目标程序名为DELD.EXE用反汇编命令查看程序代码:运行程序,检验程序设计的正确性:执行程序,输入字符串”DKJKLDKEIOWEJDLJAHNVL”,根据编写要求,显示的结果为“KIOWEDJAHNVL“,既删除字符串中重复的字符。

如上图所示。

南昌大学实验报告---(3)子程序实验学生姓名:学号:专业班级:实验类型:□验证■综合□设计□创新实验日期:2011.12.8/15实验成绩:一、实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。

二、实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。

要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。

2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符”b”的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符”b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。

三、实验环境PC微机DOS操作系统或Windows操作系统MASM.EXE,LINK.EXE,或宏汇编集成环境四、实验要求1.第一个实验程序用子程序的近程调用实现。

由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。

实验过程中可以从堆栈的内容看到两个子程序的返回地址值。

由于是近调用,地址值只包括返回地址的段内偏移量。

在每个子程序的执行中,检查CS值是不变的。

2.第二个程序是利用远调用的方法调用子程序的。

在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。

子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。

3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。

一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。

有关该方法的原理此处不再介绍。

4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。

五、主要实验步骤1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。

相关主题