Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

помогите разобраться с организацией чтения записей с файла в асме

26K
10 мая 2007 года
redquote
2 / / 29.03.2007
У меня проблема. Я создал прогу, которая создает файл и записывает туда строки, но программа которая должна оттуда ЭТИ данные считать у меня не получается. Все что надо туда вписал, указал нужные функции, но единственное что она делает, - запускается и закрывается )))) А должна была в коммандной строке выдавать результат ИЛИ ОШИБКУ... Одна, hancreat, создает файл namefile.dat и записывает туда строки которые введет пользователь. Она-то работает, но код ее я выложу первым на всякий случай.
После проделанных операций пользователь через ДОС делает
sort namefile.dat > namefile.srt
Вторая программа, hanread, должна читать записи, сделанные после сортирования, файл namefile.srt )))
Помогите, пожалуйста, разобраться. У самого не получается (((

Вот код первой проги для создания файла и записей в ней:
Код:
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




Это код программы для чтения, которая запускается и закрывается:
: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
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог