下面的程序演示了如何利用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 |