串处理与子程序_第1页
串处理与子程序_第2页
串处理与子程序_第3页
串处理与子程序_第4页
串处理与子程序_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、南昌大学实验报告(2)串处理与子程序学生姓名 温帅学 号:01专业班级:电nmi班实验类型:验证综合设计口创新 实验日期:2012/11/14, 2012/11/21实验 成绩:一、实验目的1. 掌握汇编语言堆栈传递参数的子程序调用方法,主程序与子程序之间的 调用关系及调用方法,熟悉串操作指令的功能与应用;2. 分析和理解高级语言(C+)中函数调用参数传递方法,掌握子程序调用 过程中近程调用与远程调用的区别;3掌握高级语言(C+亠)与汇编语言的方法,串操作指令的寻址方式及使用 方法,编写常用的字符串处理程序。二、实验内容1. 字符串统计。从键盘最多输入80个字符存放在STR开始的存储区中,统

2、计其中含有小写字母的个数,将统计结果以两位十进制数显示在屏幕上。2. 删除重复字符。从键盘最多输入80个字符存放在STR开始的存储区中, 删除其中重复的字符,输岀删除处理后的字符串。3. 采用C+中嵌入汇编代码的方法实现用汇编代码计算C+中输入的两个整 数之和并输出结果。4. C+中调用汇编程序,该汇编程序实现在数组中查找某个数,如果找到, C+程序中输出"Found!",否则输出Not foundPo5. 将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码, 在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子 程序DISP实现

3、显示。6 编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序 统讣字符串中字符h的个数子程序的参数是字符串的首地址TABLE,字符串长度 N及字符"b子程序返回字符” b的个数参数传送采用堆栈实现主程序在子程 序返回后,显示字符"b"及其个数(设为一位十六进制数)。三. 实验要求1. 认真预习有关串操作的指令极其寻址方式的特点,能够正确使用串操作 指令,并准备好数据。2. 依题意分析给岀程序设计算法。四. 实验环境PC微机DOS操作系统或Windows操作系统 ,或宏汇编集成环境RADASM五. 实验步骤1. 用1号系统调用从键盘键入一个字符串,

4、然后统计其中小写字母的个数。 程序每次执行,都能得到不同的结果。2. 要求编写一个在同一个字符串中删除字符,并将其余字符向前递补的程 序。六. 实验报告要求1、对照参考程序,画出程序流程图。2、总结字符串处理的编程方法,提岀改进和完善此类程序的设讣方案。七. 思考题1 如果要求以INT21H的10号功能调用来实现字符串的输入,请修改程序;解:把 AGAIN: MOVINT 21HCMP AL,ODHJZ DONEMOV DI,ALMOV STR,78LEA DX,STRMOV AH,10INT21HMOV CL,STR+1在输岀的时候加上一个FIGURE就行了。INC DIINC CLJMP

5、AGAIN2如果要统计输入的数字字符个数,指出程序修改的地方;解:在数据段中定义一个FIGURE DBO把NEXT: LOOPCYCLENEXT: CMP AL/O1JL NXET1CMP AL,9JG NXET1INC FIGURENXET 1;LOOP CYCLE3如果输入的小写字母数小于10 (如输入了 8个小写字符,这时候参考程序 会输出小写字母个数是08)时候,如何修改程序,使得输出小写字母只有一位 数而不是两位(如输入小写字母个数为个时输出8而不是08)o解:在 MOV ALBL之前心比较BL大小 CMP BL,9MOV AHZO儿 E LOO PlMOV CL JODIV CLL

6、00P1: ADD BL,30HMOV BX,AXMOV DL,BLMOV AH,2INT21H参考程序清单1.统计小写字母个数的程序清单:DATASEGMENTMSG1DB 'Input a stringiOAHDH/S1MSG2DB 'The number of lowercase letter is:$'STRDB 80 DUP()DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATASTART:MOV AX, DATAMOV DS, AX ;输出提示LEA DX,MSG1MOV AH,9INT21HLEADI, STRMOVCL,

7、0;CL用来记录输入字符数AGAIN: MOVAH, 1INT21HCMPAL,ODHJZDONE;输入回车键则转DONEMOVDI,ALINCDIINCCLJMPAGAINDONE: LEASI,STRMOVCH,0;cx保存输入字符数MOV BL,0 ;BL用来统计小写字符个数CLDCYCLE: LODSBCMP AL/a1JB NEXTCMP AL/z1JA NEXTINC BLNEXT: LOOP CYCLE;回车换行MOV AH,2 MOV DL,OAHINT21HMOV DL,ODHINT21H;输出提示LEA DX,MSG2MOV AH,9INT21H;以下显示输入小写字母个数的

8、两位十进制数MOV AL,BL ;小写字符个数送ALMOV AH,0 ;AX存放小写字符个数MOV CL,10DIV CL;十位数在AL中,个位数在AH中MOV BX,AX ;十位数在BL中个位数在BH中MOV DL,BLMOV AH,2OR DL,30HINT 21H;输岀小写字母个数的十位数字MOV DL,BHOR DL,30HMOV AH,2INT 21H;输出小写字母个数的个位数字MOV AH,4CHINT 21HCODEENDSEND START2.删除字符串中重复字符的源程序清单:DATA SEGMENTSTR DB 80 DUP()LEN DWDATA ENDSCODE SEGM

9、ENTASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX, DATAMOV DS,AXMOV ES,AX;初始化数据段和附加段为同一段值LEA SI,STR;SI<=输入宙的首地址;从键盘输入字符串MOV CL,0 ;CL用来存放输入字符数AGAIN: MOV AH,1INT21HCMP AL,ODH ;回车结束输入JZ IN_DONEMOV SI,ALINC SIINC CLJMP AGAININ_DONE: MOVMOVCH,0 ;CX存放输入字符数LEN,CX;将输入字符数保存到LEN;将输入字符串中重复出现字符替换为0LEA SI,STR ;SI

10、<=输入串的首地址MOV DI,SIINC DIAGN:CMP CX,1JZ OK;只有剩一个字符就结束替换PUSH CX;保护外层循环计数MOV AL,SIAND AL,ALJZ NEXT ;当前字符已被替换为0LI: CMP AL,DIJNZ L2MOV BYTE PTRDI,0L2: INC DILOOP LI;内部循环,扫描当前字符后面是否与当前字符相同,相同则用0替换NEXT: INC SIMOV DI,SIINC DIPOP CXLOOP AGNOK:;将那些被替换成0的字符去掉LEA SI,STR ;SI<=输入串的首地址MOV CX 丄 ENRPT: AND CX,

11、CXJZ RTN;CX=O结束子程序MOV AL,SIAND AL,ALJNZ NEXT1 ;当前字符不是被替换为0的字符PUSH CXMOV DI,SIXOR BX,BXCLDREPZ SCASBJNZ L3POP CXJMP RTN;后面全是0,不用再继续L3: DEC DIMOVAL,DIMOV,alMOVBYTE PTRDI,0POPYT1 .CX,入I丄INCSIDECCXJMPRPTRTN:;回车换行MOV AH,2MOV DL,0AHINT 21HMOV AH,2MOV DL,ODHINT 21H;输出结果LEA SI,STR ;SI<=输入串的首地址MOV CX,LENM

12、OV AH,2LOP: MOV DL,SICMP DL,0JZ EXITINT21HINC SILOOP LOPEXIT:MOV AH,4CHINT 21HCODE ENDSEND START串处理指令与子程序-子程序一. 实验目的1. 掌握主程序与子程序之间的调用关系及调用方法;2. 掌握子程序调用过程中近程调用与远程调用的区别;3. 掌握通过堆栈转送参数的方法。二. 实验内容1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码, 在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子 程序DISP实现显示。2 编写一个主程序,从键盘接收若干个字符

13、,然后用远调用的方法,调用子程序 统讣字符帘中字符h的个数子程序的参数是字符吊的首地址TABLE,字符串长度 N及字符子程序返回字符” b的个数参数传送釆用堆栈实现主程序在子程 序返回后,显示字符"b"及其个数(设为一位十六进制数)。三. 实验要求一 1.第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序 时,子程序乂调用了 DISP子程序,这叫子程序的嵌套调用。实验过程中可以从 堆栈的内容看到两个子程序的返回地址值。山于是近调用,地址值只包括返回地 址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。2. 第二个程序是利用远调用的方法调用子程序的。在

14、远调用悄况下,主程 序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程 序中的CS值是不同的。子程序调用后,堆栈中保留了返回地址的段地址及段内 偏移量。3. 第二个程序中,主程序与子程序之间参数的传送是曲堆栈实现的。一段 是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如 堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通 过堆栈返回。有关该方法的原理此处不再介绍。4. 预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序 的流程图;熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。四. 实验环境PC微机DOS操作系统

15、或Windows操作系统,或宏汇编集成环境五. 实验步骤1. 编辑、汇编两个源程序,生成相应的可执行文件(.EXE)2. 用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用 时堆栈的变化。特别是通过堆栈传送的参数和子程序取岀的参数是返回参数的详 细过程。3. 检查程序执行的结果是否正确。子程序HEXASC子程序DISP主程序C:Usersmasm5.0>MfiSM CONV.fiSMMicrosoft (R) Macro Assembler Version 5.00Copyright (C) Microsoft Corp 1981-1985, 1987. fill rig

16、hts reserved.Object filename CONV.OBJ:Source listing NUL.LST1:Cross-reference INUL.CRF:50390 亠 415082 Bytes symbol space free0 Warning Errors0 Severe ErrorsC:Usersmasm5.0>LINK CONV.OBJMicrosoft (R) Overlay Linker Version 3.60Copyright (C) MicrosofI Corp 1983-1987. All rights reserved.Run File CON

17、V.EXE 1:List File INUL.MAPI:Libraries .LIBI:LINK : warning L4021: no stack segmentC:Usersmasmb.0>CONV.EXEA1C3D400000O33445566|C:Usersmasm5.0>DEBUG CONV.EXE-U 03B1 A2C0000B82B14MOV1 A2C00038ED8MOVDS , nx162C0005B90AO0MOVCX.OOOA1A2C00088D1E0O00LI: 口BX.0000142C00GC8A07MOVAL.BK142C000EE8070OCALL00

18、181A2C001143TNCBX142C0012卜?卜81 OOP000(:16 2(:001 ABA ACMOV1A2C0016CD21INT211A2C00188AD0MOVDL. AL142C001A51PUSHCX142C001BB104MOVCL.Ot142C001DD2EASHRDI CL1 A2C001卜59POPCX14 2(:002()1B090Ocni 1092(:16 2C00238HD0MOVDI , HL1A2C002580匚20F口 NDDL.DF142C0028E8010OCALL002C142C002BC3RET142C002C80rO09CMPDL .091

19、厶?C002F7603JBE0(134142C00318WC20fni)i)1)1 .0/1A2C003A80C230OIJI)1)1 ,30162C0007B6 02MOVfill, 02142C0039CD21工NT21丄厶2C0O9BC3RETG=03Bfix 024113X 0000 CX000fl l)X0041 SP-FPPCBP 000® Sl-0000 l)T-0000l)S 1A2B J-S-141B SS142B CS1420LP-003BNV UP tl PINZ NF) PtNC1 A2C:003BC3RET六. 实验报告要求1. 说明用堆栈传送参数的过程及其

20、具体方法。(1) 在主程序中首先把子程序需要的数据全部入栈,这样子程序就可以使用To(2) CALL子程序之后,在子程序中,我们先把BP入栈,利用BP在堆栈段里寻址把需要的数据赋给相应的寄存器。这样就实现了从主程序到子 程序的数据传送。(3) 把在子程序中得到的数据存入堆栈段中相应的内存单元,把BP出栈后返回主程序,在主程序中,我们把需要的数据出栈,就完成了子程序 到主程序的数据传送。具体操作如例题:主程序;PUSH SIPUSH CXPUSH AX;参数送堆栈CALL CHECKPOP AX :统计个数在AL中子程序:PUSH BPMOVBP,SPMOVSbBP+10MOVCX,BP+8MO

21、VAX,BP+6o o oo oo oMOVPOPBP+10, AXBPRET2. 分析实验结果及所遇到问题,并说明解决的方法。解:(1)标点符号使用的错误,应全部替换为在英文输入的时候的标点符 号。(2)在调用子程序的时候忘记了定义一个主程序。近调用和远调用不 分清楚。远调用的时候没有结束与之对应的代码段。导致编译出错。(3)在使用DOS功能的时候,把九号功能当成十号功能使用了,这使 得输出的结果完全不一样。七. 思考题分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程 有何不同。,解;在近调用的时候,CS的值是不变的。而在远调用的时候,CS的值是改变 的,所以在入栈的时候

22、,近调用SP+2,远调用SP+4.参考程序清单1码型转换程序清单:DATA SEGMENTBUF DBOABH, OCDH, ODEH, 01H, 02H, 03HDB3AH, 4BH, 5CH, 6FHDATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXMOV CX, 10LEA BX, BUFAGAIN: MOV AL, BXCALL HEXASCINC BXLOOP AGAINMOV AH, 4CHINT21HHEXASC PROC NEARMOV DL, ALPUSH CXMOV CL,

23、4SHRDL, CLPOP CXCALL DISP :显示高位HEX数MOVDL, ALANDDL, OFHCALLDISPRETHEXASC ENDPDISPPROPCMPDL, 9JBENEXTADDDL, 7NEXT: ADDDL, 30HMOVAH, 2INT 21H:显示RETDISP ENDPCODE ENDSEND START2.统计并显示某键入字符的个数的程序:DATA SEGMENTCHAR DB bBUF DB 50H, 50H DUP()DATA ENDSMCODE SEGMENTASSUME CS: MCODE, DS: DATAMOVAX, 1DATAMOVDS,AX

24、LEADX,BUFMOVAH,9INT21HLEASIBUFMOVCL,Sl+lMOVCH,0; CX中为字符串长度INCSIINCSI;SI指向串首址TABLEMOVAL,CHARMOVAH,0; AX中为待查字符PUSHSIPUSHCXPUSHAX;参数送堆栈CALLCHECKPOPAX:统计个数在AL中MOVDL,CHARMOVAH,2INT21HMOVDL,ALANDDL,OFHCMPDL,9JBENEXTADDDL,7ADDDL, 30HMOVAH,2INT21HMOVAH,4CHINT21HNEXT:显示统讣个数MCODE ENDSSCODE SEGMENTASSUME CS: S

25、CODEPROCFARPUSHBPMOVBP,SPMOVSb |BP+10MOVCX,BP+8MOVAX,BP+6XORAH,AHCMPAL.SIJNENEXT1INCAHINCSILOOPAGAINMOVAL,AHMOVBP+10, AXPOPBPRET4ENDPENDSTARTCHECKAGAIN:NEXT1:CHECK实验3中删除输入串中重复字符实例换成子程序书写形式DATA SEGMENTSTR DB 80 DUP()LEN DWDATA ENDSSTACKTOSSEGMENT STACKDW 100 DUP()EQU THIS WORDSTACKENDSCODE SEGMENTASS

26、UME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOV AX, DATAMOV DS,AXMOV ES,AX ;初始化数据段和附加段为同一段值MOV AX,STACKMOV SS,AX ;初始化堆栈段LEA SP,TOS ;初始化栈顶指针LEA SI,STR ;SI<=接收串的首地址;调用IN_STR子程序从键盘输入字符串CALL IN_STR;调用REPLACE子程序将输入字符串中重复出现字符替换为0CALL REPLACE;调用DELE子程序将那些被替换成0的字符去掉CALL DELE;调用ENDLINE子程序现实回车换行CALL ENDLINE;

27、调用PRTSTR子程序输出结果CALL PRTSTRMOV AH,4CHI NT 21H子程序:IN_STR功能:从键盘输入字符串,以回车结束输入入口参数:Sl =输入字符串的首地址出口参数:Sl =输入字符吊的首地址cx =输入字符个数IN_STR PROC NEAR;保护现场PUSH AXPUSH SIMOV CL,0 ;CL用来存放输入字符数AGAIN: MOV AH,1INT21HCMPAL,0DHJZ IN_DONEMOVINCINCJMPIN_DONE: MOV,alSICLAGAINCH,0;CX存放输入字符数;恢复现场POP SIPOP AXRETIN_STRENDP; 子程序

28、:REPLACE;功能:把字符串中重复出现的字符用o替代;入口参数:Sl=字符串的首地址;CX =字符个数;出口参数:无REPLACE;将串中重复出现的字符用0替换PROC NEAR;保护现场PUSH AXPUSH CXPUSH SIPUSH DIMOV DI,SIINC DIAGN:CMP CX,1JZ OK;只有剩一个字符就结束替换PUSH CX;保护外层循环计数MOV AL,SIAND AL,ALJZ NEXT;当前字符已被替换为0LI: CMP AL,DIJNZ L2MOV BYTE PTRDI,0L2: INC DILOOP LI;内部循环,扫描当前字符后面是否与当前字符相同,相同则用0替换N

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论