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

我的博客

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

[2010-09-17 20:11] 习题4.40

图片载入中
写一个能够比较两个文本内容的程序。 设文本文件由若干行组成。文本行以回车和换行符结束。 比较以行为单位进行。如果两行不等,那么就显示着两行,并标上行号

答:
;----------------------------------------------------;
assume        cs:code,ds:data,ss:stack
data        segment
filea        db        11 dup (0),0      ;文件名存放地址
fileb        db        11 dup (0),0      ;文件名存放地址
fafh        dw        0                 ;文件a句柄
fbfh        dw        0                 ;文件b句柄
buffa        db        10 dup (0)        ;文件a缓冲
buffb        db        10 dup (0)        ;文件b缓冲
errmsg        db        'Error!$'         ;错误信息
no        db        0                 ;行号
data        ends
stack        segment stack             ;定义栈段
        dw 128 dup (0)
stack        ends
code        segment
start:
        mov ax,data               ;指定数据段
        mov ds,ax
;------------------------------------------------;
;把命令行中的文件名复制到filea和fileb
        mov cx,0                 ;计数器
        lea si,es:82h            ;装入命令名地址
        mov di,offset filea      ;目标地址
cp1:        
        mov al,es:[si]
        inc cx                   ;文件名长度计数
        cmp al,20h               ;如是空格则处理fileb
        jz jxcp
        mov [di],al              ;传送
        inc si                   ;指向下一字符
        inc di                   ;指向下一单元
        jmp cp1
jxcp:                            ;开始复制fileb
        lea si,es:82h            ;装入文件名地址
        add si,cx                ;设定文件名具体地址
        mov di,offset fileb      ;目标地址
cp2:        
        mov al,es:[si]           ;开始复制
        cmp al,0dh               ;如遇回车则结束
        jz cpok
        mov [di],al              ;
        inc si                   ;指向下一字符
        inc di                   ;指向下一单元
        jmp cp2
cpok:                                 ;复制结束
;------------------------------------------------;
;打开文件filea
        mov ax,3d02h            ;以读写方式打开filea
        mov dx,offset filea     ;文件filea首地址
        int 21h                 ;调用3dh号功能
        jc err                  ;如出错则退出
        mov fafh,ax             ;保存filea的句柄
;打开文件fileb                  
        mov ax,3d02h            ;以读写方式打开fileb
        mov dx,offset fileb     ;文件fileb首地址
        int 21h                 ;调用3dh号功能
        jc err                  ;出错则退出
        mov fbfh,ax             ;保存fileb的句柄
;------------------------------------------------;
;开始将文件信息逐行读入缓冲
r1:                                ;读filea
        mov bx,fafh             ;文件句柄复制给BX
        mov cx,1                ;每次传送一个字节
        mov dx,offset buffa     ;目标地址
        mov di,dx                ;偏移
ra:        
        mov ah,3fh              ;调用3fh功能
        int 21h
        jc err                  ;出粗则退出
        cmp byte ptr [di],0ah   ;如遇换行符则读fileb
        jz r2
        cmp byte ptr [di],0     ;如遇0则结束
        jz over
        inc di                  ;偏移+1
        inc dx                  ;目标地址+1
        jmp ra
r2:                             ;读fileb
        inc di                  ;偏移+1
        inc dx                        ;目标地址+1
        push di                 ;暂存,下一行使用
        push dx                 ;暂存

        mov bx,fbfh             ;fileb句柄装入BX
        mov cx,1                ;每次传送1字节
        mov dx,offset buffb     ;目标地址
        mov di,dx               ;偏移
rb:        
        mov ah,3fh              ;调用3fh功能
        int 21h
        jc err                  ;出错退出
        cmp byte ptr [di],0ah   ;回车则进行比较
        jz bj
        inc di                  ;偏移+1
        inc dx                  ;目标地址+1
        jmp rb
        
bj:                                ;逐行读取完成开始比较
        inc byte ptr no         ;行数加1
        call comp               ;调用比较子程序
        jnc bd                  ;不同,调用bc子程序
        call clean              ;清理缓冲区
        pop dx                  ;恢复filea偏移和
        pop di                  ;目标地址
        jmp r1
bd:                             ;显示不同行信息
        mov dl,no               ;打印行号
        add dl,30h
        mov ah,2
        int 21h
        mov dl,3ah              ;打印冒号用于分隔
        mov ah,2
        int 21h
        call show               ;显示不同行
        call crlf               ;回车
        call clean              ;清理缓冲区
        pop dx                  ;恢复filea偏移和
        pop di                  ;目标地址
        jmp r1
;------------------------------------------------;
;关闭文件filea和fileb
ok:
        mov bx,fafh             ;filea句柄复制给BX
        mov ah,3eh              ;调用3eh功能
        int 21h
        jc err                  ;出错退出

        mov bx,fbfh             ;fileb句柄复制给BX
        mov ah,3eh              ;调用3eh功能
        int 21h
        jc err                  ;出错退出
        jmp over                ;结束程序
;------------------------------------------------;
err:        mov dx,offset errmsg    ;出错信息提示
        mov ah,9
        int 21h
;------------------------------------------------;
over:        mov ah,4ch              ;返回DOS
        int 21h
;所用子程序
;回车
crlf        proc uses ax dx
        mov ah,2
        mov dl,0dh
        int 21h
        mov dl,0ah
        int 21h
        ret
crlf        endp

;比较

comp        proc uses ax bx cx dx si di
        mov si,offset buffa
        mov di,offset buffb
        mov cx,10
        clc
_cmp:
        mov al,[si]
        cmp al,[di]
        jnz ol
        inc si
        inc di
        loop _cmp
        stc
        ret
ol:
        ret
comp        endp

;显示

show        proc uses ax bx cx dx si di
        mov si,offset buffa
s1:        
        mov dl,[si]
        cmp dl,0dh
        jz jx1
        mov ah,2
        int 21h
        inc si
        jmp s1
jx1:        
        mov dl,20h
        mov ah,2
        int 21h
        mov si,offset buffb
s2:        
        mov dl,[si]
        cmp dl,0dh
        jz tc
        mov ah,2
        int 21h
        inc si
        jmp s2
tc:
        ret
show        endp

;清理缓冲
clean        proc uses ax bx cx dx si di
        mov si,offset buffa
        mov di,offset buffb
        mov cx,10
qc:        
        mov byte ptr [si],0
        mov byte ptr [di],0
        inc si
        inc di
        loop qc
        ret
clean        endp

code        ends
end        start
;----------------------------------------------------;
凑合着写的, 有时间再优化吧。
评论次数(0)  |  浏览次数(392)  |  类型(汇编习题集) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码