. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->汇编语言学习交流区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  显示文本文件内容  [待解决] 回复[ 1次 ]   点击[ 436次 ]  
cnhnyu
[帖 主]   [ 发表时间:2007-11-20 09:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2007-10-22 14:47
下面的程序演示了如何利用8086汇编显示一个文本文件的内容。该程序接受命令行参数,显示参数所指定的文件的内容,有点类似dos下面的type命令,或者是linux下的cat命令,不过,程序比较简单,功能比type和cat命令都要弱,程序只能显示64k以下的文本文件内容,对于64k以上的则无能为力。另外,该程序编译成exe文件之后,必须利用exe2bin或者是debug转换成.com文件,否则,无法正常运行,程序代码及注释如下:

; list.asm
; 该程序编译成exe之后,必须转换为com文件,否则无法正常运行
code segment
        assume cs:code, ds:code
        org 100h

main proc far
        jmp start
msg        db        'Press any key to continue...', 0dh, 0ah, 24h
error        db        'Error!!!!', 0dh, 0ah, 24h
line        db        ?
start:
        mov si, 80h              ; 指向psp的80h处
        lodsb                    ; 获取参数的长度
        xor ah, ah
        add si, ax               ; si 指向参数末尾
        mov byte ptr [si], 0     ; 将参数末尾的回车变为0,构成以0结尾的ASCII串

        mov dx, 82h              ; 命令行参数首地址
        mov ax, 3d00h            ; 以只读方式打开文件
        int 21h
        jc error                 ; 打开错误,退出

        mov bx, ax               ; 文件句柄存入bx
        mov ah, 3fh              ; 读文件
        mov cx, 65535            ; 读取的字节数
        mov dx, offset buffer    ; 数据缓冲区地址
        int 21h
        jc error

        mov si, dx               ; 数据缓冲区首地址送入si
        mov di, ax               ; 实际读入的字节数送入di
disp_loop:
        cmp di, 0                ; 读完了吗?
        jz exit                  ; 读完了退出
        dec di                   ; 没有,di减一,继续
        lodsb                    ; 从缓冲区读取一个字节到al
        cmp al, 09h  ; tab       ; 是 tab键吗
        jnz next                 ; 不是继续
        mov al, 20h              ; 是tab键,转换为空格
next:
        mov ah, 0eh              ; 在屏幕上显示该字节内容
        int 10h
        cmp al, 0ah              ; 一行显示完了吗
        jnz disp_loop            ; 没有,继续
        inc byte ptr line        ; 已经显示一行,行数加1
        cmp line, 23             ; 已经显示一屏了吗,(23行为一屏幕)
        jnz disp_loop            ; 没有,继续

        mov line, 0              ; 行数清0
        mov ah, 9                
        mov dx, offset msg             
        int 21h                  ; 显示提示信息:press any key to continue
        mov ah, 0                ; 接受一个键盘输入
        int 16h
        jmp disp_loop            ; 继续显示下一屏幕
error:
        mov ah, 9
        mov dx, offset error
        int 21h
exit:
        mov ah, 4ch
        int 21h
main endp
buffer        db        ?

code ends
        end main

原文来自http://www.anijh.cn
sunshine
[第1楼]   [ 回复时间:2007-11-22 09:25 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
学习一下
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved