串处理与子程序Word格式.docx
- 文档编号:18124376
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:24
- 大小:185.66KB
串处理与子程序Word格式.docx
《串处理与子程序Word格式.docx》由会员分享,可在线阅读,更多相关《串处理与子程序Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
把AGAIN:
MOVAH,1MOVSTR,78
INT21HLEADX,STR
CMPAL,0DHMOVAH,10
JZDONEINT21H
MOV[DI],ALMOVCL,STR+1
INCDI
INCCL
JMPAGAIN
2.如果要统计输入的数字字符个数,指出程序修改的地方;
解:
(1)在数据段中定义一个FIGUREDB0
NEXT:
CMPAL,'
0'
(2)把JLNXET1
NEXT:
LOOPCYCLECMPAL,'
9'
JGNXET1
INCFIGURE
NXET1;
LOOPCYCLE
(3)在输出的时候加上一个FIGURE就行了。
3.如果输入的小写字母数小于10(如输入了8个小写字符,这时候参考程序会输出小写字母个数是08)时候,如何修改程序,使得输出小写字母只有一位数而不是两位(如输入小写字母个数为个时输出8而不是08)。
在MOVAL,BL之前心比较BL大小CMPBL,9
MOVAH,0JLELOOP1
MOVCL,10..............
DIVCLLOOP1:
ADDBL,30H
MOVBX,AXMOVDL,BL
MOVAH,2
INT21H
参考程序清单
1.统计小写字母个数的程序清单:
DATASEGMENT
MSG1DB'
Inputastring:
'
0AH,0DH,'
$'
MSG2DB'
Thenumberoflowercaseletteris:
STRDB80DUP()
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
;
输出提示
LEADX,MSG1
MOVAH,9
LEADI,STR
MOVCL,0;
CL用来记录输入字符数
AGAIN:
MOVAH,1
CMPAL,0DH
JZDONE;
输入回车键则转DONE
MOV[DI],AL
INCDI
DONE:
LEASI,STR
MOVCH,0;
CX保存输入字符数
MOVBL,0;
BL用来统计小写字符个数
CLD
CYCLE:
LODSB
a'
JBNEXT
z'
JANEXT
INCBL
NEXT:
LOOPCYCLE
回车换行
MOVAH,2
MOVDL,0AH
MOVDL,0DH
LEADX,MSG2
以下显示输入小写字母个数的两位十进制数
MOVAL,BL;
小写字符个数送AL
MOVAH,0;
AX存放小写字符个数
MOVCL,10
DIVCL;
十位数在AL中,个位数在AH中
MOVBX,AX;
十位数在BL中,个位数在BH中
MOVDL,BL
ORDL,30H
INT21H;
输出小写字母个数的十位数字
MOVDL,BH
输出小写字母个数的个位数字
MOVAH,4CH
CODEENDS
ENDSTART
2.删除字符串中重复字符的源程序清单:
STRDB80DUP()
LENDW
DATAENDS
CODESEGMENT
CODE,DS:
DATA,ES:
MOVAX,DATA
MOVDS,AX
MOVES,AX;
初始化数据段和附加段为同一段值
LEASI,STR;
SI<
=输入串的首地址
从键盘输入字符串
MOVCL,0;
CL用来存放输入字符数
AGAIN:
MOVAH,1
CMPAL,0DH;
回车结束输入
JZIN_DONE
MOV[SI],AL
INCSI
JMPAGAIN
IN_DONE:
CX存放输入字符数
MOVLEN,CX;
将输入字符数保存到LEN
将输入字符串中重复出现字符替换为0
=输入串的首地址
MOVDI,SI
AGN:
CMPCX,1
JZOK;
只有剩一个字符就结束替换
PUSHCX;
保护外层循环计数
MOVAL,[SI]
ANDAL,AL
JZNEXT;
当前字符已被替换为0
L1:
CMPAL,[DI]
JNZL2
MOVBYTEPTR[DI],0
L2:
LOOPL1;
内部循环,扫描当前字符后面是否与当前字符相同,相同则用0替换
POPCX
LOOPAGN
OK:
将那些被替换成0的字符去掉
MOVCX,LEN
RPT:
ANDCX,CX
JZRTN;
CX=0结束子程序
JNZNEXT1;
当前字符不是被替换为0的字符
PUSHCX
XORBX,BX
REPZSCASB
JNZL3
JMPRTN;
后面全是0,不用再继续
L3:
DECDI
MOVAL,[DI]
MOV[SI],AL
NEXT1:
DECCX
JMPRPT
RTN:
INT21H
输出结果
MOVCX,LEN
LOP:
MOVDL,[SI]
CMPDL,0
JZEXIT
LOOPLOP
EXIT:
串处理指令与子程序
-------子程序
一.实验目的
1.掌握主程序与子程序之间的调用关系及调用方法;
2.掌握子程序调用过程中近程调用与远程调用的区别;
3.掌握通过堆栈转送参数的方法。
二.实验内容
1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。
2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。
三.实验要求
1.第一个实验程序用子程序的近程调用实现。
由于在调用HEXASC子程序时,子程序又调用了DISP子程序,这叫子程序的嵌套调用。
实验过程中可以从堆栈的内容看到两个子程序的返回地址值。
由于是近调用,地址值只包括返回地址的段内偏移量。
在每个子程序的执行中,检查CS值是不变的。
2.第二个程序是利用远调用的方法调用子程序的。
在远调用情况下,主程序与子程序处在不同的逻辑代码段中,可在子程序执行中查看CS值,它与主程序中的CS值是不同的。
子程序调用后,堆栈中保留了返回地址的段地址及段内偏移量。
3.第二个程序中,主程序与子程序之间参数的传送是由堆栈实现的。
一段是将参数(此处是串首址TABLE,串的长度N及待统计的字符“b”)顺序压如堆栈,在子程序调用后,通过BP指针对堆栈中的参数访问,并将统计的结果通过堆栈返回。
有关该方法的原理此处不再介绍。
4.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图;
熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。
,,或宏汇编集成环境
1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE)
2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈的变化。
特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。
3.检查程序执行的结果是否正确。
1.说明用堆栈传送参数的过程及其具体方法。
(1)在主程序中首先把子程序需要的数据全部入栈,这样子程序就可以使用了。
(2)CALL子程序之后,在子程序中,我们先把BP入栈,利用BP在堆栈段里寻址把需要的数据赋给相应的寄存器。
这样就实现了从主程序到子程序的数据传送。
(3)把在子程序中得到的数据存入堆栈段中相应的内存单元,把BP出栈后返回主程序,在主程序中,我们把需要的数据出栈,就完成了子程序到主程序的数据传送。
具体操作如例题:
主程序;
PUSHSI
PUSHCX
PUSHAX;
参数送堆栈
CALLCHECK
POPAX:
统计个数在AL中
子程序:
PUSHBP
MOVBP,SP
MOVSI,[BP+10]
MOVCX,[BP+8]
MOVAX,[BP+6]
。
。
MOV[BP+10],AX
POPBP
RET
2.分析实验结果及所遇到问题,并说明解决的方法。
(1)标点符号使用的错误,应全部替换为在英文输入的时候的标点符号。
(2)在调用子程序的时候忘记了定义一个主程序。
近调用和远调用不分清楚。
远调用的时候没有结束与之对应的代码段。
导致编译出错。
(3)在使用DOS功能的时候,把九号功能当成十号功能使用了,这使得输出的结果完全不一样。
分析远程调用与近程调用的区别,在用DEBUG有关命令观察时,执行过程有何不同。
,
解;
在近调用的时候,CS的值是不变的。
而在远调用的时候,CS的值是改变的,所以在入栈的时候,近调用SP+2,远调用SP+4.
参考程序清单
1.码型转换程序清单:
;
BUFDB0ABH,0CDH,0DEH,01H,02H,03H
DB3AH,4BH,5CH,6FH
ASSUMECS:
CODE,DS:
START:
MOVAX,DATA
MOVDS,AX
MOVCX,10
LEABX,BUF
AGAIN:
MOVAL,[BX]
CALLHEXASC
INCBX
LOOPAGAIN
MOVAH,4CH
HEXASCPROCNEAR
MOVDL,AL
PUSHCX
MOVCL,4
SHRDL,CL
POPCX
CALLDISP;
显示高位HEX数
ANDDL,0FH
CALLDISP
RET
HEXASCENDP
DISPPROP
CMPDL,9
JBENEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H;
显示
DISPENDP
2.统计并显示某键入字符的个数的程序:
;
CHARDB‘b’
BUFDB50H,,50HDUP()
MCODESEGMENT
MCODE,DS:
DATA
LEADX,BUF
MOVAH,9
LEASIBUF
MOVCL,[SI+1]
MOVCH,0;
CX中为字符串长度
INCSI
INCSI;
SI指向串首址TABLE
MOVAL,CHAR
MOVAH,0;
AX中为待查字符
PUSHAX;
CALLCHECK
POPAX:
MOVDL,CHAR
MOVDL,AL
ANDDL,0FH
MOVAH,2
显示统计个数
MCODEENDS
SCODESEGMENT
SCODE
CHECKPROCFAR
PUSHBP
XORAH,AH
CMPAL.[SI]
JNENEXT1
INCAH
NEXT1:
MOVAL,AH
MOV[BP+10],AX
RET4
CHECKENDP
实验3中删除输入串中重复字符实例换成子程序书写形式
STACKSEGMENTSTACK
DW100DUP()
TOSEQUTHISWORD
STACKENDS
DATA,SS:
STACK
MOVAX,STACK
MOVSS,AX;
初始化堆栈段
LEASP,TOS;
初始化栈顶指针
=接收串的首地址
调用IN_STR子程序从键盘输入字符串
CALLIN_STR
调用REPLACE子程序将输入字符串中重复出现字符替换为0
CALLREPLACE
调用DELE子程序将那些被替换成0的字符去掉
CALLDELE
调用ENDLINE子程序现实回车换行
CALLENDLINE
调用PRTSTR子程序输出结果
CALLPRTSTR
;
=========================================================
子程序:
IN_STR
功能:
从键盘输入字符串,以回车结束输入
入口参数:
SI=输入字符串的首地址
出口参数:
SI=输入字符串的首地址
CX=输入字符个数
IN_STRPROCNEAR
保护现场
PUSHAX
CMPAL,0DH
CX存放输入字符数
恢复现场
POPSI
POPAX
RET
IN_STRENDP
REPLACE
把字符串中重复出现的字符用0替代
SI=字符串的首地址
CX=字符个数
无
REPLACEPROCNEAR;
将串中重复出现的字符用0替换
保护现场
PUSHDI
POPDI
REPLACEENDP
DELE
去掉字符串中为0的字符
=========================================================
DELEPROCNEAR
PUSHBX
恢复现场
POPBX
DELEENDP
PRTSTR
输出字符串
PRTSTRPROCNEAR
JZEXT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 处理 子程序