福建农林大学计算机与信息学院实验报告系:计算机专业:计算机科学与技术年级:2014姓名学号:实验室号__ 计算机号实验时间:2016-10-29指导教师签字:刘庆连成绩:实验四子程序设计1.实验目的(1)学习子程序的编写,主子程序的调用;(2)不同模块间程序的调用和调试。
2.实验内容1)数据段中的3个字符,调用子程序将其逐个显示出来。
子程序的功能是显示一个字符。
单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
DATA SEGMENTMAG DB ‘ABC’DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DA TASTART: MOV AX, DA TAMOV DS, AXMOV SI, 0MOV CX, 3LL: MOV DL, MAG[SI]CALL MADDINC SILOOP LLMOV AH, 4CHINT 21HMADD PROCMOV AH, 02HINT 21HRETMADD ENDPCODE ENDSEND START2)阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。
具体步骤如下:MASM S31.ASM(分别汇编)MASM S32.ASMLINK S31 S32 (将两个文件连接成为一个文件名为S31)S31.EXE (运行)3)编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。
(也可以将找到的不相等字符逐个显示,用INT 21H的02功能调用)4)编程:子程序搜索指定字符缓冲区中是否有N,如果有用Y替代。
调用子程序将BUF1,BUF2,BUF3中的N全部用Y替代。
附源程序:NAME S31.ASM不同模块间的段间调用。
从键盘输入2位非压缩BCD数,存入AX寄存器中。
为了将其转换为二进制数,编写一个子程序TRAN。
显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。
输入数据为00时结束。
EXTRN DISP: FARCODE SEGMENT PARA ‘CODE’ASSUME CS: CODESTART: MOV AH, 01HINT 21HMOV BL, ALINT 21HMOV AH, ALMOV AL, BLCMP AX, 3030HJE EXITCALL NEAR PTR TRANCALL FAR PTR dispJMP STARTEXIT: MOV AH, 4CHINT 21HTRAN PROC NEAR ;将输入的ASCII码转换成2进制数AND AX, 0F0FH ;将ASCII码转换成非压缩BCD码,;高位在AL中MOV BL, AHMOV CL, 10DMUL CLADD AL, BLRETTRAN ENDPCODE ENDSEND STARTNAME S32.ASMPUBLIC DISPCODE1 SEGMENT PARA ‘CODE’ASSUME CS: CODE1DISP PROC FARMOV BL, ALMOV BH, 00MOV CH, 4ROLL: MOV CL, 4ROL BX, CLMOV DL, BLAND DL, 0FHCMP DL, 9JBE NEXT1ADD DL, 07HNEXT1: ADD DL, 30HMOV AH, 02HINT 21HDEC CHJNZ ROLLRETDISP ENDPCODE1 ENDSEND5)编一个子程序:输入一个字符,显示出来。
6)编一个子程序:输入一个字符串,显示出来。
4.算法描述及实验步骤题1:依题输入相应的代码如下,运行->调试->单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。
题3及4,5,6按要求编写即可5.调试过程无6. 实验结果【题一】实验结果如下有上图可知,当程序运行到call语句之前,SP一直保持0000不变,而IP则一直在增加。
继续单步执行程序由上图,当程序在RET语句之前运行时,SP、IP每次都是分别按2和1递增,当运行到RET语句时,SP还是按照2来递增,而IP出现了变化,这次却减少了很多,说明指针回撤执行下一个循环。
【题二】按要求把s31 s32 分别汇编连接形成一个s31.exe文件,如下汇编s31汇编s32Link s31 s32形成一个s31.exe的文件【题三】编写代码如下运行结果如下图BUF1=’HELLO WORLD!’BUF2=’HOLLO WOLLD~’比较可知BUF1与BUF2中不同的字符有ER!,结果与预期一致【题四】编写代码如下运行结果如下图分析:有图可知,结果将BUF1和BUF2中的n改为了y完成题目要求. 【题五】编一个子程序:输入一个字符,显示出来编写代码如下【题六】编一个子程序:输入一个字符串,显示出来编写代码如下7. 总结通过本次上机实验,学会了子程序的编写和主子程序的调用,并且掌握了在不同模块间程序的调用和调试。
在本次实验中,再一次加深了对汇编程序的汇编以及连接运行的方法。
附录:【题3代码】DATA SEGMENTBUF1 DB'HELLO WORLD!'LEN =$-BUF1BUF2 DB'HOLLO WOLLD~'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX, DATAMOV DS, AXLEA SI, BUF1LEA DI, BUF2MOV CX,LENCALL CMPPMOV AH, 4CHINT 21HCMPP PROC NEAR ;子程序L1:MOV DL,[SI]CMP DL,[DI]JZ NEXTMOV AH,02HINT 21HNEXT:INC SIINC DILOOP L1RET ;子程序返回CMPP ENDPCODE ENDSEND START【题4代码】DATA SEGMENTBUF1 DB'aaanaannaaan',0ah,0dh,'$'LEN1 =$-BUF1BUF2 DB'bbnnnbbbbnnn', '$'LEN2 =$-BUF2DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATA START: MOV AX, DATAMOV D S, AXLEA SI, BUF1MOV C X, LEN1CALL CMMPLEA SI, BUF2MOV C X, LEN2CALL CMMPMOV A H, 4CHINT 21HCMMP PROCMOV DX, SICMP1:CMP BYTE PTR[SI], 'n'JNE NOTNMOV A L, 'y'MOV[SI], ALNOTN:INC SILOOP CMP1MOV A H, 09H ;显示字符串INT 21HRETCMMP ENDPCODE ENDSEND START【题5代码】STACKS SEGMENT STACKDW128 DUP(?)STACKS ENDSCSEG SEGMENT PARA PUBLIC 'CODE'ASSUME CS:CSEGSTART: MOV AH,01INT 21HMOV DL,ALMOV AH,02INT 21HMOV AL,0MOV AH,4CHINT 21HCSEG ENDSEND START【题6代码】STACKS SEGMENT STACKDW 128 DUP(?)STACKS ENDSDSEG SEGMENTMSG DB 0DH,0AH,'$'BUF DB 20,?,20 DUP(?)DSEG ENDSCSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEGMOV DS,AX LEA DX,BUF MOV AH,0AH INT 21HLEA DX,MSG MOV AH,09 INT 21HLEA DX,BUF+2 INT 21H MOV AL,0 MOV AH,4CH INT 21H CSEG ENDSEND START。