《大学课程汇编语言的实验报告-.pdf》由会员分享,可在线阅读,更多相关《大学课程汇编语言的实验报告-.pdf(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验报告实验课程:学生姓名:学号:专业班级:电气信息类III班2011 年 12 月 20 日1目录(1)汇编 语 言 程序 上 机 过 程.2(2)字符 串 处 理程 序 实 验.6(3)子程 序 实 验.13(4)中断 程 序 实验.21(5)C+调 用 汇 编子 程 序.252南昌大学实验报告-(1)汇 编 语言 程 序 上 机 过 程学生姓名:学号:专业班级:实验类型:验证 综合 设计 创新实验日期:2011.11.12/13实验成绩:一、实验目的熟练掌握汇编语言程序的编辑、调试和运行的过程和方法。了解汇编语言程序的汇编、运行环境。二、实验内容1 掌握常用的编辑工具软件(如WORD、E
2、DIT)、MASM 和LINK 的使用;2 伪指令:SEGMENT,ENDS,ASSUME,END,OFFSET,DUP;3 利用的 INT 21H的1号功能实现键盘输入的方法;三、实验环境PC 微机DOS 操作系统或Windows 操作系统MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境四、实验要求1 仔细阅读有关伪指令SEGMENT,ENDS,ASSUME,END,OFFSET,DUP的内容;2 了解利用的 INT 21H的1号功能实现键盘输入的方法,了解.EXE文件和.COM文件的区别及用INT 21H 4C号功能返回系统的方法;3 阅读下面程序段。五、主要实验步骤
3、程序:datasegmentmessagedbThis is asample program of keyboard and displydb0dh,0ah,Pleasestrike the key!,0dh,0ah,$dataendsstack segmentparastack stackdb50 dup(?)stack endscode segmentassumecs:code,ds:data,ss:stackstart:movax,datamovds,axmovdx,offset messagemovah,9int21hagain:movah,13int21hcmpal,1bhjeexi
4、tcmpal,61hjcndcmpal,7ahjandand al,11011111bnd:movdl,almovah,2int21hjmp againexit:movah,4chint21hcode endsendstart实验步骤:1 用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为ASM。2 用 MASM 对源文件进行汇编,产生OBJ 文件和 LST 文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。3 用 TYPE 命令显示1 产生的 LST 文件。44 用 LINK 将 OBJ 文件连接成可执行的EXE 文件。5 在 DOS 状态下运行LINK 产生的
5、 EXE 文件。即在屏幕上显示标题并提示你按键。每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。按 ESC 键可返回DOS。若未出现预期结果,用DEBUG 检查程序。5六、思考题1、若在源程序中把INT 21H的H省去,会产生什么现象?代码编译连接均为正常,但是运行时无法输入与输出,也无法退出。2、把 INT 21H4CH号功能改为INT 20H,行不行?更改后,编译链接均正常,输入输出也正常,但是按下ESC 退出时会出现错误,错误如下:七、参考资料IBM-PC 汇编语言程序设计汇编语言实验指导书6南昌大学实验报告-(2)字 符 串 处 理 实 验学生姓名:学号:专业班级:实验类型:
6、验证 综合 设计 创新实验日期:2011.11.20/21实验成绩:_一.实验目的1熟悉串操作指令的功能与应用;2掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。二实验内容1字符串统计。自STRN 开始的存储区中,有一个字符串,统计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。2在给定的字符串中,删除重复的字符,其余的字符向前递补。三.实验要求1认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作指令,并准备好数据。2按正常的方法将删除字符程序编成子程序,规定子程序的入口和出口参数。四实验环境PC 微机DOS 操作系统或Windows 操作系统MASM.
7、EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境五实验步骤1.用 1 号系统调用从键盘键入一个字符串,然后统计其中小写字母的个数。程序每次执行,都能得到不同的结果。;COUNTDC.ASMDATASEGMENTSTRNDB 80 DUP(?)DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DI,STRNMOV CL,07AGAIN:MOV AH,1INT 21HCMP AL,0DHJZDONEMOV DI,ALINC DIINC CLJMP AGAINDONE:LEA SI,STRNMOV
8、 CH,0MOV BL,0CLDCYCLE:LODSB CMP AL,61HMP AL,7AHCJA NEXTINC BLNEXT:LOOP CYCLEMOV AL,BLMOV AH,0MOV CL,10DIV CLXCHG AH,ALPUSH AXMOV DX,0DHMOV AH,2INT 21HMOV DX,0AHMOV AH,2INT 21HPOPAXMOV DL,AHORDL,30HMOV AH,2PUSHAXINT 21HPOPAXMOV DL,AL1ORDL,30H1INT21HPOPAXMOV DL,AL8OR DL,30HMOV AH,2INT 21HMOV AH,4CHINT
9、 21HCODEENDSEND START编译源程序:如下,发现地29 行有错误。用 EDIT 命令找到错误地方,并进行修改,如下图所示:修改后保存程序,重新编译:9重新编译后程序没有错误,用反汇编查看指令代码:如下图所示:运行程序,验证程序设计结果的正确性。从键盘上输入字符串“ADKJjkdjfljdeowekdjg”,共二十个字符,其中小写字母十六个,显示结果如下:由运行结果可知,程序运行正确,实现了设计要求。实验 2 课参考教材第五章练习10 的解法,但要编写一个在同一个字符串中删除字符,并将其余字符向前递补。删除字符串中重复字符的源程序清单:REPEAT:PUSH SI PUSH CX
10、PUSH CX;CX 为内循环计数POPDX;DX为外循环计数DECCXMOVAL,SICMP AL,0JENEXT1;若为空字符,则跳过COMP:DEC SICMP AL,SIMOV BYTE PTRSI,0GOON:LOOP COMP;查出与该字符重复的所有字符,并用0NEXT1:POPDXPOPSIDEC SIDEC DXMOV CX,DXJNZ REPEAT;对所有重复字符都进行查找LEA SI,STRN;删除重复字符;DELD.ASMDATASEGMENTSTRNDB 80 DUP(?)LENDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES
11、:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,STRN1MOV CL,0AGAIN:MOV AH,1 INT 21HCMP AL,0DHJZDONEMOV SI,ALINC SIINC CLJMP AGAINDONE:MOV CH,0MOV LEN,CLDEC SIMOV BYTE PTR SI+1,$10MOV CL,LENMOV CH,0CYCLE:MOV AL,SIINC CLCMP AL,0;是重复字符吗?JNZ NEXT;不是,查找下一个字符DEC CX;递补子串长度送CXJZALLDONECALL DELE;删除该空字符并递补DEC
12、SINEXT:INC SI LOOP CYCLEALLDONE:MOVDL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HLEA DX,STRNMOV AH,9INT 21HMOV AH,4CHINT 21HDELEPROCPUSH SIPUSH CXCLDMOV DI,SI;空字符处为目的首址INC SI;下一个地址为源串首址REP MOVSBPOPCXPOPSIRETDELEENDPCODEENDSENDSTARTPOPSIRETDELEENDPCODEENDSEND START编译源程序,检查程序的正确性,如下图所示:11源程序在27 行有错误,有
13、提示的消息可知,此处需要用到变址或基址寄存器,用EDIT 命令找到错误的地方,并改正:修改程序保存再编译以检查是否还有错误:有上图编译可知,程序修改正确,接下来连接成目标程序:此处是寄存器直接寻址,把cl的值送给标号为LEN 存储单元,所以应去掉”12生成的目标程序名为DELD.EXE用反汇编命令查看程序代码:运行程序,检验程序设计的正确性:执 行 程 序,输 入 字 符 串”DKJKLDKEIOWEJDLJAHNVL”,根 据 编 写 要 求,显 示 的 结 果 为“KIOWEDJAHNVL“,既删除字符串中重复的字符。如上图所示。13南昌大学实验报告-(3)子 程 序 实 验学生姓名:学号
14、:专业班级:实验类型:验证 综合 设计 创新实验日期:2011.12.8/15实验成绩:一、实验目的1.掌握主程序与子程序之间的调用关系及调用方法;2.掌握子程序调用过程中近程调用与远程调用的区别;3.掌握通过堆栈转送参数的方法。二、实验内容1.将 BUF 开始的 10 个单元中的二进制数转换成两位十六进制数的ASCII 码,在屏幕上显示出来。要求码型转换通过子程序HEXAC 实现,在转换过程中,通过子程序DISP 实现显示。2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符”b”的个数.子程序的参数是字符串的首地址TABLE,字符串长度N 及字符”b”.
15、子程序返回字符”b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。三、实验环境PC 微机DOS 操作系统或Windows 操作系统MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境四、实验要求1.第一个实验程序用子程序的近程调用实现。由于在调用HEXASC 子程序时,子程序又调用了 DISP 子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS 值是不变的。2.第二个程序是利用远调用的方法调用子程序的。在远调用情况
16、下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS 值,它与主程序中的CS 值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。一段是将参数(此处是串首址 TABLE,串的长度N 及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过 BP 指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。有关该方法的原理此处不再介绍。4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。五、主要实验步骤1.编辑、汇编两个源程序,生成相应的
17、可执行文件(.EXE)2.用 DEBUG 的 R 命令,T 命令或 G 命令和 D 命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。143.检查程序执行的结果是否正确。实验内容 1 流程图:主程序子程序 HEXASC15子程序 DISP实验内容 1 结果:16实验内容2 流程图:17主程序子程序实验内容 2 结果:18实验内容 1 代码:DATASEGMENTBUFDB 0ABH,0CDH,0DEH,01H,02H,03HDB 3AH,4BH,5CH,6FHDATAENDSCODE SEGMENTASSUME CS:CODE,DS:DAT
18、ASTART:MOV AX,DATAMOV DS,AXLEA BX,BUFMOV CX,0AHLOP:MOV AL,BXCALL HEXASCINC BXLOOP LOPMOV AH,4CHINT 21HHEXASC PROC NEARPUSH CXPUSH AXMOV DL,ALMOV CL,4SHR DL,CL19CALL DISPPOPAXMOV DL,ALAND DL,0FHCALL DISPPOP CXRETHEXASC ENDPDISP PROC NEARCMP DL,9JBE NEXTADD DL,7NEXT:ADD DL,30HMOV AH,2INT 21HRETDISPEND
19、PCODEENDSEND START实验内容 2 代码:DATASEGMENTCHARDB bBUFDB 50H,?,50H DUP(?)DATAENDSMCODE SEGMENTASSUME CS:MCODE,DS:DATASTART:MOV AX,DATAMOV DS,AXLEA DX,BUFMOV AH,10INT 21HMOV DL,0AHMOV AH,2INT 21HLEA SI,BUFMOV CL,SI+1MOV CH,0INC SIINC SIMOV AL,CHARMOV AH,0PUSH SIPUSH CXPUSH AXCALL FAR PTR CHECKPOPAXPUSH A
20、XMOV DL,ALMOV CL,4SHR DL,CLCMP DL,9JBE J1ADD DL,7J1:ADD DL,30HMOV AH,2INT 21H20POPAXMOV DL,ALAND DL,0FHCMP DL,9JBE J2ADD DL,7J2:ADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HMCODE ENDSSCODESEGMENTASSUME CS:SCODECHECKPROC FARPUSH BPMOV BP,SPMOV SI,BP+10MOV CX,BP+8MOV AX,BP+6XOR AH,AHAGAIN:CMP AL,SIJNE NE
21、XT1INC AHNEXT1:INC SILOOP AGAINMOV AL,AHMOV BP+10,AXPOP BPRET 4CHECKENDPSCODEENDSEND START六、思考题分析远程调用与近程调用的区别,在用DEBUG 有关命令观察时,执行过程有何不同。答:在近程调用中 CS值不变,而在远程调用中 CS 值发生改变;近程调用中 SP+2,远程调用中 SP+4。七、参考资料IBM-PC 汇编语言程序设计汇编语言实验指导书21南昌大学实验报告-(4)中断 程 序 设 计 实 验学生姓名:学号:专业班级:实验类型:验证 综合 设计 创新实验日期:2011.12.11/16实验成绩:一
22、、实验目的:1.加 深 对 中 断 程 序 的 理 解,掌 握 中 断 程 序 结 构2.掌 握 中 断 程 序 的 设 计,调 试 方 法二、实验内容:编 制 程 序:程 序 开 始 时 要 有 输 入 数 字 的 提 示,通 过 键 盘 输 入 一 个 十 进 制 数(0-65535),用 中 断 程 序 调 用 来 读 取 键 盘 输 入 的 字 符、显 示 该 字 符。如 果 输 入 09 以 外 的 字 符 不 显 示该 字 符,并 且 继 续 输 入 的 09 紧 跟 在 前 面 的 字 符 后 面,在 屏 幕 上 面 要 以 十 六 进 制 形 式 显示;当 用 户 按 下 回
23、车 键 时 可 以 再 次 输 入 一 个 十 进 制 数,当 用 户 按 下 空 格 键 时 程 序 结 束。三、实验环境PC微机DOS操作系统或Windows操作系统MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境四、实验步骤1.编写编辑、汇编源程序,生成相应的可执行文件(.EXE),得源程序如下:DATASEGMENTCOUNTDW1MESSDBHaha!,0DH,0AH,$DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART:JMPGODW100 DUP(?)OLD_IPDW?22OLD_CS DW?GO:M
24、OVAX,CSMOVDS,AXMOVSS,AXMOVSP,OFFSETOLD_IPMOVAL,9H;取中断向量MOVAH,35HINT21HMOVOLD_CS,ES;存原中断向量段址MOVOLD_IP,BX;存原中断向量偏移量PUSHDSMOVDX,OFFSET MYINT9;新偏移量送DXMOVAX,SEG MYINT9MOVDS,AX;新段址送DSMOVAL,9HMOVAH,25HINT21H;写入新的中断向量POPDSNEXT:JMP NEXTMYINT9PROCFARPUSHAXPUSHDXIN AL,60HTEST AL,80HJNZ EXIT;以下输出输入字符的键盘扫描码PUSH
25、AXSHRAL,1SHRAL,1SHRAL,1SHRAL,1CMPAL,9JBEADD30H23ADDAL,7ADD30H:ADDAL,30HMOVDL,ALMOVAH,2INT21HPOPAXANDAL,0FHCMPAL,9JBEADD_30HADDAL,7ADD_30H:ADDAL,30HMOVDL,ALMOVAH,2INT21H;输出回车换行MOVAH,2MOVDL,0AHINT21HMOVDL,0DHINT21HEXIT:MOVAL,20HOUT20H,ALPOPDXPOPAXIRETMYINT9ENDPCODEENDSENDSTART文件命名为:INT9H.EXE此源程序段没有采用调
26、用原来键盘中断程序,若要调用则在结尾处改为:EXIT:24POPDXPOPAXJMP DWORD PTR OLD_IPMYINT9ENDPCODEENDSENDSTART2.运行 INT9H.EXE,得结果如下:没有采用调用原来键盘中断程序:在键盘上依次输入:q、w、e、r、t、y、u、i、o、p、a、s、d、f 2调 用 原 键 盘 中 断 程 序:在 键 盘 重 复 依 次 输 入 得 结 果 如 下:所得结果是相同的。25南昌大学实验报告-(5)C+调 用 汇 编 子 程 序学生姓名:学号:专业班级:电 104实验类型:验证 综合 设计 创新实验日期:2011.12.17/18实验成绩:
27、一实验目的1掌握主程序与子程序之间的调用关系及调用方法;2掌握子程序调用过程中近程调用与远程调用的区别;3掌握通过堆栈转送参数的方法。二实验内容1将 BUF 开始的 10 个单元中的二进制数转换成两位十六进制数的ASCII 码,在屏幕上显示出来。要求码型转换通过子程序HEXAC 实现,在转换过程中,通过子程序DISP 实现显示。2编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符b的个数.子程序的参数是字符串的首地址TABLE,字符串长度N 及字符”b”.子程序返回字符b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六
28、进制数)。三实验环境PC 微机DOS 操作系统或Windows 操作系统MASM.EXE,LINK.EXE,DEBUG.COM或宏汇编集成环境四实验步骤1编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2用 DEBUG 的 R 命令,T 命令或 G 命令和 D 命令检查远程调用及近程调用时堆栈的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。3检查程序执行的结果是否正确。五实验结果实验程序:1.DATASEGMENTBUFDB 0ABH,0CDH,0DEH,01H,02H,03HDB 3AH,4BH,5CH,6FHDATAENDSCODESEGMENTASSUME
29、CS:CODE,DS:DATA26START:MOV AX,DATAMOV DS,AXMOV CX,10LEABX,BUFAGAIN:MOVAL,BXCALLHEXASCINCBXLOOPAGAINMOVAH,4CHINT 21HHEXASC PROC NEARMOV DL,ALPUSHCXMOVCL,4SHRDL,CLPOPCXCALLDISP;显示高位HEX 数MOVDL,ALANDDL,0FHCALLDISPRETHEXASC ENDPDISPPROPCMPDL,9JBENEXTADDDL,7NEXT:ADDDL,30HMOVAH,2INT21H;显示RETDISPENDPCODEEND
30、SEND START2统计并显示某键入字符的个数的程序:;COUNTER.ASMDATASEGMENTCHARDB bBUFDB50H,?,50H DUP(?)DATAENDSMCODESEGMENTASSUME CS:MCODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADX,BUF27MOVAH,9INT21HLEASIBUFMOVCL,SI+1MOVCH,0;CX 中为字符串长度INCSIINCSI;SI 指向串首址TABLEMOVAL,CHARMOVAH,0;AX 中为待查字符PUSHSIPUSHCXPUSHAX;参数送堆栈CALLCHECKPOPAX:统计个
31、数在AL 中MOVDL,CHARMOVAH,2INT21HMOVDL,ALANDDL,0FHCMPDL,9JBENEXTADDDL,7NEXT:ADDDL,30HMOVAH,2INT21H;显示统计个数MOVAH,4CHINT21HM CODEENDSSCODESEGMENTASSUMECS:SCODECHECKPROCFARPUSHBPMOVBP,SPMOVSI,BP+10MOVCX,BP+8MOVAX,BP+6XORAH,AHAGAIN:CMPAL.SIJNENEXT1INCAHNEXT1:INCSILOOPAGAINMOVAL,AHMOVBP+10,AX28POPBPRET4CHECKENDPENDSTART29六.参考资料IBM-PC 汇编语言程序设计汇编语言实验指导书