汇编实验4.1文件代号下的文件管理中为什么buf_size为80而buf可以容纳200个字节,矛盾吗?(不矛盾)

文件代号下的文件管理

data segment
Pgsize dw ?
buf_size db 80
s_buf db ?
buf db 200 dup(?)
cur dw ?
handle dw ?
mess_getname db 0dh,0ah," Please input filename:$"
mess_err1 db 0ah,0dh," Illegal filename ! $"
mess_err2 db 0ah,0dh," file not found ! $"
mess_err3 db 0ah,0dh," file read err! $"
········
data ends

上面的
buf_size db 80
s_buf db ?
buf db 200 dup(?)
看起来很奇怪,通过做这个实验,我明白了buf_size和实际的buf大小是可以不同的,源代码中的buf_size为了增加可读性,改为filename_buf_size可能会更好一些,因为它定义为80,仅仅是为了约束输入的文件名不能超过79个字符(加上回车一共最多80个字符),而后面读取文件内容时,用到了DOS中的ah=3fh的功能,它可以一次读取200的字符到缓冲区中,然后再慢慢一行一行显示在屏幕上。
(当一个buf有两种以上不同的用途时,或者存放字符或者字符串的最大长度不同时,尤其是约束输入的字符串不能长于某个个数而buf作另外的用途可以容纳更多字符是,实际定义的buf大小就会比声明的输入缓冲区长度要大)
本例子中,buf作为键盘输入缓冲区,最大为80,作为读入文件数据缓冲区时,最大为200.
;-------------------------------------------------------------------------
getline proc near
push ax
push bx
push cx
push dx
mov dx,offset mess_getname
mov ah,09h
int 21h
mov dx,offset buf_size
mov ah,0ah
int 21h
;读入文件名,文件名本身不超过79字符
mov dx,offset crlf
mov ah,09h
int 21h
mov bl,s_buf
mov bh,0
mov [buf+bx],0
pop dx
pop cx
pop bx
pop ax
ret
getline endp
;---------------------------------------------------------------------

;-------------------------------------------------------------------------
read_block proc near
push bx
push cx
push dx
cmp cur,200
jnz back

mov cx,200
mov bx,handle
mov dx,offset buf
mov ah,3fh
int 21h
;读文件内容,一次读入200个字节到buf中
mov cur,0
mov ax,1
jnc back
mov cur,200
mov ax,0
back:
pop dx
pop cx
pop bx
ret
read_block endp
;-----------------------------------------------

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

格式:
MOV DX,已定义缓冲区的偏移地址
MOV AH, 0AH
INT 21H
功能:从键盘接收字符,并存放到内存缓冲区。
在使用0AH号功能调用时,应当注意以下问题。.
①执行前先定义一个输入缓冲区,缓冲区内第一个字节定
义为允许最多输入的字符个数,字符个数应包括回车符
0DH在内,不能为“0” 值。第二个字节保留,在执行程
序完毕,后存入输入的实际字符个数。从第三个字节开始存
入从键盘上接收字符的ASCII码。若实际输入的字符个数
少于定义的最大字符个数,则缓冲区其他单元 自动清0.
若实际输入的字符个数大于定义的字符个数,其后输入的
字符丢弃不用,且响铃示警,直到输入回车键为止
。整
个缓冲区的长度等于最大字符个数再加2。

0A中断会向保存在dx中的地址存放来自键盘的输入。

[dx]是缓冲区最大容量,也就是从键盘最多能够输入的字符数,需要提前告诉程序。

返回值[dx+1]是你实际输入的字符个数,dx+2是字符串首。

你可能感兴趣的:(#,汇编实验)