title hancreat (exe)
; ---------------------------------------------------------------------
stacksg segment para stack 'stack'
dw 80 dup(?)
stacksg ends
; ---------------------------------------------------------------------
datasg segment para 'data'
namepar label byte ;‘Список параметров
maxlen db 30 ;
namelen db ? ;
namerec db 30 dup(' '), 0dh,0ah ;введенное имя, перенос/возврат
errcde db 00 ; каретки
handle dw ?
pathnam db 'C:\namefile.dat',0
prompt db 'name: '
row db 01
opnmsg db '*** Open error ***', 0dh, 0ah
wrtmsg db '*** Write error ***', 0dh, 0ah
datasg ends
; ---------------------------------------------------------------------
codesg segment para 'code'
begin proc far
assume cs:codesg, ds:datasg, ss:stacksg, es:datasg
push ds
sub ax,ax
push ax
mov ax, datasg
mov ds, ax
mov es, ax
mov ax, 0600h
call q10scr ; Очистка экрана *
call q20curs ; Установка курсора
call c10crea ; Создание файла, установка DTA
cmp errcde, 00 ; Ошибка при создании?
jz a20loop ; да - продолжить
ret ; *нет - вернуться в ДОС
a20loop:
call d10proc ; вывод запроса и ввод с клавы
cmp namelen, 00 ; конец ввода?
jne a20loop ; *нет - продолжить
call g10clse ; да -закрыть файл
ret ; и выйти в ДОС
begin endp
; Создание файла
c10crea proc near
mov ah, 3ch
mov cx, 00
lea dx, pathnam
int 21h
jc c20 ; Есть ошибка?
mov handle, ax ; *нет - запомнить номер
ret
c20: ; да -
lea dx, opnmsg ; вывод сообщения
call x10err
ret
c10crea endp
; ввод с клавы
d10proc proc near
mov ah, 40h ; вывод запроса*
mov bx, 01 ; *номер (Хэндл)
mov cx, 06 ; длина текста запроса
lea dx, prompt ; выдать запрос
int 21h
mov ah, 0ah ; функция ввода с клавы
lea dx, namepar ; список параметров
int 21h
cmp namelen, 00 ; имя введено?
jne d20 ; да -обойти
ret ; *нет - выйти
d20:
mov al, 20h ; пробел для заполнения
sub ch, ch
mov cl, namelen ; длина
lea di, namerec ;
add di, cx ; адрес+длина*
neg cx ; вычислить
add cx, 30 ; оставшуюся длину
rep stosb ; заполнить пробелом
d90:
call f10writ ; запись на диск
call e10scrl ; проверка на скроллинг
ret
d10proc endp
; проверка на скроллинг
e10scrl proc near
cmp row,18 ; Последняя строка?
jae e10 ; да - обойти
inc row ; *нет - следующая строка
jmp e10
e10:
mov ax,0601h ; Продвинуть на строку
call q10scr
e90:
call q20curs ; Установка курсора
ret
e10scrl endp
f10writ proc near
mov ah, 40h ; Функция записи на диск
mov bx, handle
mov cx, 32 ; 30 для имени+2 CR/LF
lea dx, namerec
int 21h
jnc f20 ; Ошибка записи?
lea dx, wrtmsg ; да - выдать предупреждение
call x10err
mov namelen ,00
f20:
ret
f10writ endp
; Закрытие файла на диске
g10clse proc near
mov namerec, 1ah ; маркер конца файла
call f10writ
mov ah, 3eh ; функция закрытия
mov bx, handle
int 21h
ret
g10clse endp
; Скроллинг *
q10scr proc near ; в ax - адрес элемента
mov bh, 02
mov cx, 0000
mov dx, 184fh
int 10h ; Скроллинг
ret
q10scr endp
; Установка курсора
q20curs proc near
mov ah, 02
mov bh, 00
mov dh, row
mov dl, 00
int 10h
ret
q20curs endp
; Вывод сообщения об ошибке
x10err proc near
mov ah, 40h
mov bx, 01
mov cx, 21
int 21h
mov errcde, 01 ; Установить код ошибки
ret
x10err endp
codesg ends
end begin
помогите разобраться с организацией чтения записей с файла в асме
После проделанных операций пользователь через ДОС делает
sort namefile.dat > namefile.srt
Вторая программа, hanread, должна читать записи, сделанные после сортирования, файл namefile.srt )))
Помогите, пожалуйста, разобраться. У самого не получается (((
Вот код первой проги для создания файла и записей в ней:
Код:
Это код программы для чтения, которая запускается и закрывается:
:confused:
Код:
title hanread (exe) ; Чтение записей созданных в hancreate
; ---------------------------------------------------------------------
stacksg segment para stack 'stack'
dw 80 dup(?)
stacksg ends
; ---------------------------------------------------------------------
datasg segment para 'data'
endcde db 00
handle dw ?
ioarea db 32 dup(' ')
pathnam db 'C:\namefile.srt',0
row db 00
opnmsg db '*** Open error ***', 0dh, 0ah
readmsg db '*** Read error ***', 0dh, 0ah
datasg ends
; ---------------------------------------------------------------------
codesg segment para 'code'
begin proc far
assume cs:codesg, ds:datasg, ss:stacksg, es:datasg
push ds
sub ax,ax
push ax
mov ax, datasg
mov ds, ax
mov es, ax
mov ax, 0600h
call q10scr
call q20curs
call e10open
cmp endcde, 00 ; Ошибка открытия?
jnz a90 ; да - завершить программу
a20loop:
call f10read ; чтение записи с диска
cmp endcde, 00 ; Ошибка чтения?
jnz a90 ; да - выйти
call g10disp ; *нет - выдать имя,
jmp a20loop ; и продолжить
a90: ret
begin endp
; Открытие файла
e10open proc near
mov ah, 3dh
mov cx, 00
lea dx, pathnam
int 21h
jc e20
mov handle, ax
ret
e20:
mov endcde, 01
lea dx, opnmsg
call x10err
ret
e10open endp
; Чтение дисковой записи
f10read proc near
mov ah, 3fh
mov bx, handle
mov cx, 32 ; 30 для имени и 2 для CR/LF
lea dx, ioarea
int 21h
jc f20 ; Ошибка при чтении?
cmp ah, 00 ; Конец файла?
je f30
cmp ioarea, 1ah ; Маркер конца файла?
je f30 ; да - выйти
ret
f20:
lea dx, readmsg ; нет - выдать сообщение об ошибке
call x10err
f30:
mov endcde, 01 ; код завершения
f90:
ret
f10read endp
; ўлў®¤ * нЄа *
g10disp proc near
mov ah, 40h
mov bx, 01 ; Установить номер
mov cx, 32 ; и длину
lea dx, ioarea
int 21h
cmp row, 20 ; последняя строка?
jae g90 ; да - обойти
inc row
ret
g90:
mov ax, 0601h
call q10scr ; скроллинг
call q20curs ; установка курсора
ret
g10disp endp
; скроллинг экрана*
q10scr proc near
mov bh, 02
mov cx, 0000
mov dx, 184fh
int 10h
ret
q10scr endp
; установка курсора
q20curs proc near
mov ah, 02
mov bh, 00
mov dh,row
mov dl, 00
int 10h
ret
q20curs endp
; Вывод сообщения об ошибке
x10err proc near
mov ah, 40h
mov bx, 01
mov cx, 20
int 21h
ret
x10err endp
codesg ends
end begin
; ---------------------------------------------------------------------
stacksg segment para stack 'stack'
dw 80 dup(?)
stacksg ends
; ---------------------------------------------------------------------
datasg segment para 'data'
endcde db 00
handle dw ?
ioarea db 32 dup(' ')
pathnam db 'C:\namefile.srt',0
row db 00
opnmsg db '*** Open error ***', 0dh, 0ah
readmsg db '*** Read error ***', 0dh, 0ah
datasg ends
; ---------------------------------------------------------------------
codesg segment para 'code'
begin proc far
assume cs:codesg, ds:datasg, ss:stacksg, es:datasg
push ds
sub ax,ax
push ax
mov ax, datasg
mov ds, ax
mov es, ax
mov ax, 0600h
call q10scr
call q20curs
call e10open
cmp endcde, 00 ; Ошибка открытия?
jnz a90 ; да - завершить программу
a20loop:
call f10read ; чтение записи с диска
cmp endcde, 00 ; Ошибка чтения?
jnz a90 ; да - выйти
call g10disp ; *нет - выдать имя,
jmp a20loop ; и продолжить
a90: ret
begin endp
; Открытие файла
e10open proc near
mov ah, 3dh
mov cx, 00
lea dx, pathnam
int 21h
jc e20
mov handle, ax
ret
e20:
mov endcde, 01
lea dx, opnmsg
call x10err
ret
e10open endp
; Чтение дисковой записи
f10read proc near
mov ah, 3fh
mov bx, handle
mov cx, 32 ; 30 для имени и 2 для CR/LF
lea dx, ioarea
int 21h
jc f20 ; Ошибка при чтении?
cmp ah, 00 ; Конец файла?
je f30
cmp ioarea, 1ah ; Маркер конца файла?
je f30 ; да - выйти
ret
f20:
lea dx, readmsg ; нет - выдать сообщение об ошибке
call x10err
f30:
mov endcde, 01 ; код завершения
f90:
ret
f10read endp
; ўлў®¤ * нЄа *
g10disp proc near
mov ah, 40h
mov bx, 01 ; Установить номер
mov cx, 32 ; и длину
lea dx, ioarea
int 21h
cmp row, 20 ; последняя строка?
jae g90 ; да - обойти
inc row
ret
g90:
mov ax, 0601h
call q10scr ; скроллинг
call q20curs ; установка курсора
ret
g10disp endp
; скроллинг экрана*
q10scr proc near
mov bh, 02
mov cx, 0000
mov dx, 184fh
int 10h
ret
q10scr endp
; установка курсора
q20curs proc near
mov ah, 02
mov bh, 00
mov dh,row
mov dl, 00
int 10h
ret
q20curs endp
; Вывод сообщения об ошибке
x10err proc near
mov ah, 40h
mov bx, 01
mov cx, 20
int 21h
ret
x10err endp
codesg ends
end begin