汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-09-17 11:08] 习题4.39

请编写程序实现统计当前工作目录下文件test.txt中数字和字母的个数。

答:
;----------------------------------------------------;
assume        cs:code,ds:data,ss:stack
data        segment
fname        db        'test.txt',0     ;文件名
buffer        db        1024 dup (0)     ;预留缓冲区
shuzi        dw        0                ;数字个数
zimu        dw        0                 ;字母个数
errmsg        db        'Error!'         ;错误信息
num        db        'numberal :$'    ;显示数字
char        db        'character:$'    ;显示字母
data        ends
stack        segment stack            ;定义栈段
        dw 128 dup (0)
stack        ends
code        segment
start:
        mov ax,data              ;指明数据段
        mov ds,ax
;打开文件
        mov ah,3dh
        mov dx,offset fname
        int 21h
        jc err
        mov bx,ax                ;BX=句柄
;获取文件长度
        xor cx,cx
        mov ax,4202h            ;调用42h功能,调用后
        int 21h                        ;文件长度在AX中
        jc err                  ;出错
        push ax                        ;保存文件长度
;
;将文件指针指向文件开始处
        mov ax,4200h
        int 21h
;把文件读入缓冲区
        pop cx                        ;从栈中把文件长度给CX
        push cx                 ;再保存
        mov ah,3fh              ;调用3fh功能
        mov dx,offset buffer    ;目标地址
        int 21h
        jc err                  ;出错信息
;关闭文件
        mov ah,3eh
        int 21h
        jc err
;计算
        pop cx                  ;恢复CX,作为统计计数
        mov bx,offset buffer    ;字符串首地址
_read:                                ;开始统计数字
        mov al,[bx]
        cmp al,0
        jz _end
        cmp al,'0'
        jb jx
        cmp al,'9'
        ja zm1
        inc shuzi               ;数字增量
        jmp jx
zm1:                                ;开始统计字母
        cmp al,'A'
        jb jx
        cmp al,'Z'
        ja zm2
        inc zimu                ;字母增量
        jmp jx
zm2:        
        cmp al,'a'
        jb jx
        cmp al,'z'
        ja jx
        inc zimu                ;字母增量
jx:        inc bx
        loop _read
_end:                           ;统计结束
        mov dx,offset num       ;显示数字个数
        mov ah,9
        int 21h
        xor dx,dx
        mov ax,shuzi
        call show               ;调用子程序
        call crlf               ;回车
        mov dx,offset char      ;显示字母个数
        mov ah,9
        int 21h
        xor dx,dx
        mov ax,zimu
        call show               ;调用子程序
        jmp over        
err:        
        mov dx,offset errmsg    ;错误信息
        mov ah,9
        int 21h
over:                           ;返回DOS
        mov ah,4ch
        int 21h
;所用子程序
;回车
crlf        proc
        mov ah,2
        mov dl,0dh
        int 21h
        mov dl,0ah
        int 21h
        ret
crlf        endp
;显示32位十进制子程序

;high16bit in DX,low16bit in AX
show        proc uses cx
        mov bx,10
        mov si,0
_divdw:
        push ax
        mov ax,dx
        xor dx,dx
        div bx
        mov cx,ax
        pop ax
        div bx
        add dl,30h
        push dx
        inc si
        mov dx,cx
        cmp ax,10
        jb _ok
        jmp _divdw
_ok:
        and ax,0fh
        cmp ax,0
        jz _pop
        add al,30h
        push ax
        inc si
_pop:        
        mov cx,si
_disp:
        pop dx
        mov ah,2
        int 21h
        loop _disp
        ret
show        endp
;
code        ends
end        start
;----------------------------------------------------;
评论次数(0)  |  浏览次数(291)  |  类型(汇编习题集) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码