【80X86汇编语言学习】【DOS功能调用】基本IO功能 (二)

来源:互联网 发布:淘宝网酒水经营许可证 编辑:程序博客网 时间:2024/05/16 13:01

例2:写一个程序,它先接受一个字符串,然后显示其中的数字符的个数、英文字母的个数和字符串的长度

本 实例用到的DOS系统调用如下:

1、显示字符串(9号功能调用)

功       能:在标准输出上显示一个字符串。通常情况下,标准输出就是屏幕

入口参数:DS:DX=需要输出字符串的首地址,字符串以’$‘为结束标志

出口参数:无

说       明:在显示输出的时候检查是否按Ctrl+C或者Ctrl+Break键,否则程序退出。

2、输入字符串(0AH号功能调用)

功       能:从表中输入中读取一个字符串,通常情况下,标准输入就是键盘。

入口参数:DS:DX=缓冲区首地址,

出口参数:接收到的字符串在缓冲区中

说       明:(1)缓冲区中第一个字为缓冲区最大容量,可认为是入口参数;缓冲区第二字节存放实际读入的

                          字符数(不包括回车符),可认为是出口参数的一部分,第三字节开始存放接受的字符串。

                  (2)字符串以回车符结束,回车符是字符串的最后一个字符。

                  (3)如果输入的字符数超过缓冲区所能容纳的最大值,则随后输入的字符被丢弃,并响铃,直至遇到回车符。

                  (4)按Ctrl+C或者Ctrl+Break键,则程序退出

3、显示输出(2号功能调用)

功       能:像标准输出设备中写一个字符,通常情况下,标准输出为屏幕

入口参数:DL=要输出显示的字符ASCII码

出口参数:无

说       明:按Ctrl+C或者Ctrl+Break键,否则程序退出

代码如下:

MLENGTH = 128                      ;定位常量,缓冲区最大的长度DSEGSEGMENTBUFFDBMLENGTH            ;第一个字节存放缓冲区的最大值DB?                  ;第二个字节存放实际字符串的长度DBMLENGTH DUP (0)    ;真实字符串MESSG0DB 'Please input:$'MESSG1DB'Length = $'MESSG2DB      'X = $'MESSG3DB'Y = $'DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AX              ;设置DS寄存器MOVDX,OFFSETMESSG0  ;显示提示信息CALLDISPMESS;MOVDX,OFFSETBUFF    ;调用10号调用,获取输出字符串MOVAH,10INT21HCALLNEWLINE         ;显示换行符和回车符MOVBH,0                ;清空数字字符计数器MOVBL,0                ;清空字符计数器MOVCL,BUFF+1           ;获取输入字符串的长度MOVCH,0              JCXZCOK            ;判断字符串是否为空,以回车符为结束MOVSI,OFFSETBUFF+2  ;获取存放字符串的首地址AGAIN:MOVAL,[SI]       ;获取字符 INCSI          ;指针加一CMPAL,'0'              JBNEXTCMPAL,'9'              ;判断是否是否数字JANODECINCBH                  ;数字计数累加JMPSHORTNEXTNODEC:  ORAL,20H              ;如果是字母转换为小写字母CMPAL,'a'JBNEXTCMPAL,'z'JANEXTINCBL                   ;字母计数累加NEXT:LOOPAGAIN;COK:MOVDX,OFFSETMESSG1   ;显示提示信息CALLDISPMESS     MOVAL,BUFF+1        ;获取字符串的长度XORAH,AHCALLDISPAL         ;以十进制数的形式显示CALLNEWLINE;MOVDX,OFFSET MESSG2     ;显示数字的个数CALLDISPMESSMOVAL,BHXORAH,AHCALLDISPALCALLNEWLINE;MOVDX,OFFSETMESSG3   ;显示字母的个数CALLDISPMESSMOVAL,BLXORAH,AHCALLDISPALCALLNEWLINE;MOVAX,4C00HINT21H;用十进制显示8位二进制DISPALPROCMOVCX,3      ;8位二进制数最大表示为3为十进制数MOVDL,10     ;除数为10DISP1:DIVDL                ;AX/DL=AL(商) AH(余数)XCHGAH,AL     ;交换AL,AH,使AL保存余数ADDAL,'0'    ;转换为ASCII码PUSHAX        ;将Ax保存到栈中,其中主要用到AL,后续显示过程会用到ALXCHGAH,AL     ;是AL中继续保持商MOVAH,0      ;清空AHLOOPDISP1     ;继续循环测试;MOVCX,3DISP2:POPDXCALLECHOCHLOOPDISP2RETDISPALENDPECHOCHPROCMOVAH,2INT21HRETECHOCHENDP;显示有DX所指的提示信息DISPMESSPROCMOVAH,9INT21HRETDISPMESSENDP;显示换行符和回车符NEWLINE PROCPUSHAXPUSHDXMOVDL,0DHMOVAH,2 INT21HMOVDL,0AHMOVAH,2 INT21HPOPDXPOPAXRETNEWLINE ENDPCSEGENDSEND START


0 0
原创粉丝点击