Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дописать в файл "хвост" и блок окружения 
:(
    Опции темы
boobie
Дата 13.10.2012, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Доброго времени суток! Передо мной стоит задачка:
Цитата

Прикладная программа вводит с клавиатуры имя существующего текстового файла, «дописывает» в него содержимое своего блока окружения, а также «хвоста», а затем выводит содержимое этого файла на экран.

Как я понимаю это задание: в консоли пишем <имя программы> <имя существующего текстового файла>, программа ДОПИСЫВАЕТ (как это реализовать - пока не знаю) в этот текстовый файл <имя существующего текстового файла> (это вроде хвост, так?) и содержимое своего блока окружения (как это сделать - вообще не представляю). Затем выводится содержимое файла на экран.  smile 
Начал решать и впал в ступор:
Код

cr    EQU    0Dh                    ;  Код ASCII возврата каретки
lf    EQU    0Ah                    ;  Код ASCII перевода строки
ASSUME   CS:_Text
_Text    SEGMENT   PUBLIC  'CODE'
        ORG    80h                ; Следующий байт имеет адрес-смещение 80h 
Lparam    DB    ?                ; Длина хвоста команды
Param        DB    ?                ; Первый байт хвоста
        ORG    100h
Start:        JMP    Begin                ; Переход через данные
;    Данные программы
Msg1        DB    'NET IMENI FAILA', cr, lf, '$'          ; Выводимые сообщение
Msg2        DB    'FAIL OTSUTSTVUET', cr, lf, '$'
Msg3        DB    'HVOCT ZAPISAN', cr, lf, '$'
Msg4        DB    'OSHIBKA ZAPIS V FAIL', cr, lf, '$'
Msg5        DB    'ZAPIS VIPOLNENA', cr, lf, '$'
Msg6        DB    'OSHIBKA CHTENIYA FAILA', cr, lf, '$'
Lname0    DB    81                ; Максимальная длина имени файла
Lname        DB    0                ; Фактическая длина имени файла
Namefile    DB    81    DUP (0)        ; Здесь размещается имя файла
Bufer        DB    512    DUP(?)        ; Буфер для копирования
Lognum1    DW    ?                ; Логический номер файла
;           Команды программы
Begin:
    MOV    CL, Lparam            ;  CL ? Длина хвоста
        CMP    CL, 0                ; Хвост отсутствует ?
        JNZ    M1                ; Если хвост есть, а если нет то :
                MOV    DX, OFFSET Msg1        ; Вывод сообщения
              MOV    AH, 9                ;    об отсутствии имени
              INT    21h                ;           файла
              JMP    Exit                ; На завершение программы
M1:        
    XOR    BX, BX            ; BX ? 0
        MOV    BL, Lparam        ; BL ? длина хвоста команды
        MOV    Param[BX], 0            ; Хвост завершается нулем
    MOV    AH, 3Dh           ; Открытие   существующего файла
        MOV    DX, OFFSET    Param+1    
        MOV    AL, 01                ;только на запись
        INT    21h
        JNC    M2                ; Если успешно
              MOV    DX, OFFSET Msg2     ;а если нет - вывод сообщения
              MOV    AH, 9                       ;об отсутствии 
              INT    21h                         ;файла
              JMP    Exit                ; На завершение программы
  ;тут будет запись хвоста в файл
M2:        
    MOV    Lognum1, AX            ; Сохранение логич. номера файла
    ;MOV    BX, Lognum1            ; BX ? логич. номер файла
        ;MOV    CL, BL            ; CX ? число записываемых байтов
    ;xor cx,cx  
    ;MOV    CX, AX            ; CX ? число записываемых байтов
        MOV    AH, 40h            ; Функция записи в файл
        MOV    DX, OFFSET Bufer        ;  DX ? адрес-смещение буфера
        INT    21h                ; Запись из буфера в файл
        JNC    M3                ; Если успешно
              MOV    DX, OFFSET Msg4     ;а если нет - вывод сообщения
              MOV    AH, 9                       ;об ошибке записи в файл
              INT    21h                         ;файла
              JMP    Exit                ; На завершение программы

M3:  ;ЗДЕСЬ ПОКА БУДЕТ ВЫВОД СООБЩЕНИЯ ОБ УСПЕШНОЙ ЗАПИСИ В ФАЙЛ ХВОСТА
      ;И ЗАКРЫТИЕ ФАЙЛА. В ДАЛЬНЕЙШЕМ - ДОПИСЫВАНИЕ БЛОКА ОКРУЖЕНИЯ

    MOV    DX, OFFSET Msg2     ;ВЫВОД СООБЩЕНИЯ ОБ
    MOV    AH, 9                       ;УСПЕШНОЙ ЗАПИСИ 
    INT    21h                         ;ХВОСТА
    
    mov ah,3Eh               ;Закрываем файл
    mov bx,Lognum1
    int 21h
    
    JMP    Exit        ; На завершение программы 
Exit:              MOV    AX, 4C00h                 ;  Возврат в DOS с
                    INT     21h                ;    кодом завершения 0
_Text        ENDS
END        Start

Т.е я не могу записать "хвост" с именем файла в файл. Споткнулся в самом начале, т.е. программа ничего не пишет, а должна ДОПИСЫВАТЬ.
Файловая система - FAT32. В NTFS даже корректная программа, скорее всего, работать не будет...
Как решить задачку?

Это сообщение отредактировал(а) boobie - 13.10.2012, 09:28
PM   Вверх
ФедосеевПавел
Дата 13.10.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Тип файовой системы тебя в таком контексте волновать не должен, для этого есть ОС.
Схематично дозапись выглядит так:
1. OPEN int 21h Fn=3dh, на чтение и запись (AX=2)
2. LSEEK int 21h Fn=42h, установить указатель на конец файла.
3. WRITE int 21h Fn=40h
................................
N. WRITE int 21h Fn=40h
N+1. CLOSE int 21h Fn=3eh

Как добраться до копии переменных окружения:
1. В PSP по адресу (по смещению) 2Ch находится номер параграфа (сегмента) строки среды (переменных окружения), создаваемой DOS для выполняемой программы.
2. Каждая пременная отделена от следующей числом 00h, а если за таким разделителем следует ещё один 00h, то блок переменных окружения закончился.

Т.к. всё сразу отладать невозможно, то выполняй поэтапно:
1. Вывод на экран переменных окружения.
2. Вывод в файл.

Ещё, судя по
Цитата(boobie @  13.10.2012,  08:27 Найти цитируемый пост)
Прикладная программа вводит с клавиатуры имя существующего текстового файла, 

речь идёт о:
1. запуск прикладной программы
2. вывод на экран строки "введите имя файла"
3. ввод строки с именем файла
Но никак не о параметре программы.
PM   Вверх
boobie
Дата 13.10.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Тогда что такое "хвост" и зачем он тут нужен? smile 
Цитата

Тип файовой системы тебя в таком контексте волновать не должен, для этого есть ОС.
Схематично дозапись выглядит так:
1. OPEN int 21h Fn=3dh, на чтение и запись (AX=2)
2. LSEEK int 21h Fn=42h, установить указатель на конец файла.
3. WRITE int 21h Fn=40h
................................
N. WRITE int 21h Fn=40h
N+1. CLOSE int 21h Fn=3eh

Спасибо! А можно еще по-подробней, если не сложно? Т.е. немного конкретней, относительно данной задачи  smile 

Это сообщение отредактировал(а) boobie - 13.10.2012, 11:20
PM   Вверх
ФедосеевПавел
Дата 13.10.2012, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Ну всю задачу за тебя решать не буду, а пример добавления четырёх строк в файл приведу. Файл должен уже существовать.
Код
.model    medium
.stack    800h
.data
azFileName    db    "text.txt", 0
hFile        dw    ?
azString1    db    "My first added string", 0
azString2    db    "My second added string", 0
azCR_LF    db    0dh, 0ah, 0
.code

;запись ASCIIZ-строки ds:dx в открытый файл hFile
FWrite    PROC

    mov    si,    dx                      ; найдем длину ASCIIZ-строки
@@001:
    test    BYTE PTR [si],    0FFh
    jz    @@002
    inc    si
    jmp    @@001
@@002:
    sub    si,    dx
    mov    cx,    si                ; в cx - длина строки

    cmp    cx,    0000h
    jz    @@EmptyString
    mov    ah,    40h
    mov    bx,    hFile
;    lea    dx,    azString
;    mov    cx,    cx
    int    21h
@@EmptyString:
    ret    
FWrite    ENDP

main    proc
    mov    ax,    _DATA
    mov    ds,    ax

    ;OPEN
    mov    ah,    3dh    ;open file
    mov    al,    02h    ;mode: read+write
    lea    dx,    azFileName
    int    21h
    jc    @@EndOfProg
    mov    hFile,    ax
    ;LSEEK
    mov    ah,    42h
    mov    bx,    hFile
    mov    al,    02h    ;to end of file
    mov    cx,    0000h
    mov    dx,    0000h
    int    21h
    jc    @@CloseFile
    ;WRITE
    lea    dx,    azString1
    call    FWrite
    jc    @@CloseFile

    lea    dx,    azCR_LF
    call    FWrite
    jc    @@CloseFile

    lea    dx,    azString2
    call    FWrite
    jc    @@CloseFile


    lea    dx,    azCR_LF
    call    FWrite
    jc    @@CloseFile

@@CloseFile:
    mov    ah,    3eh
    mov    bx,    hFile
    int    21h
@@EndOfProg:
    mov    ax,    4c00h
    int    21h
main    ENDP

end main


Что такое "хвост" в контексте данной задачи, наверное, стоит уточнить у преподавателя.

Это сообщение отредактировал(а) ФедосеевПавел - 13.10.2012, 12:51
PM   Вверх
boobie
Дата 13.10.2012, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Tasm 5 (линковщик) ругается - stack segment present.
PM   Вверх
ФедосеевПавел
Дата 13.10.2012, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Прошло уже 2 часа. Наверное, ты и сам разобрался - у меня пример exe программы, а не com. Она линкуется без параметров:
tlink myprog.obj
PM   Вверх
boobie
Дата 14.10.2012, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Цитата(ФедосеевПавел @ 13.10.2012,  14:53)
Прошло уже 2 часа. Наверное, ты и сам разобрался - у меня пример exe программы, а не com. Она линкуется без параметров:
tlink myprog.obj

Ой... Я теперь пару дней разбиратся буду  smile . Я с АСМом не очень-то дружу...
PM   Вверх
boobie
Дата 14.10.2012, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Написал программулину, которая записывает в файл "хвост":
Код

cr    EQU    0Dh                    ;  Код ASCII возврата каретки
lf    EQU    0Ah                    ;  Код ASCII перевода строки
           ASSUME    CS:_Text                      
_Text  SEGMENT      PUBLIC    'CODE'
        ORG    80h            ; Следующий байт имеет адрес-смещение 80h 
Lparam    DB    ?            ; Длина хвоста команды
Param        DB    ?            ; Первый байт хвоста
        ORG    100h
Start: JMP BEGIN  
Msg1        DB    'HET XBOCTA - ERROR! EXIT!', cr, lf, '$'
Msg2        DB    'VVEDITE IMYA FAILA!', cr, lf, '$'
Msg3        DB    'NE UDALOS OTKRIT FAIL!', cr, lf, '$'
Msg4        DB    'HVOST ZAPISAN!', cr, lf, '$'
Msg5        DB    'HVOST NE ZAPISAN!', cr, lf, '$'
PEREHOD DB CR,LF,'$'
Lname0    DB    81                ; Максимальная длина имени файла
Lname        DB    0                ; Фактическая длина имени файла
Namefile    DB    81    DUP (0)        ; Здесь размещается имя файла
Bufer        DB    512    DUP(?)        ; Буфер для копирования
Lognum1    DW    ?                ; Логический номер файла 1
BEGIN:        
    XOR    CX, CX        ; Обнуление CX 
        MOV    CL, Lparam        ;  CL ? Длина хвоста
        CMP    CX, 1            ; Хвост отсутствует ? (ПРОБЕЛ НЕ СЧИТАЕТСЯ)
    JA UKAZHITE_IMYA
    
    MOV    DX, OFFSET Msg1     ;а если нет - вывод сообщения
    MOV    AH, 9                       ;об отсутствии 
    INT    21h                         ;ХВОСТА
    JMP    Exit                ; На завершение программы


    
    

UKAZHITE_IMYA:           
    XOR    BX, BX            ; BX ? 0
        MOV    BL, Lparam            ; BL ? длина хвоста команды

    ;MOV Param[0],0AH
    
        MOV    Param[BX], 0            ; Хвост завершается нулем
    
   
    
    
    XOR CX,CX
    MOV    DX, OFFSET Msg2     ;просьба ввести
    MOV    AH, 9                       ;имя
    INT    21h                         ;существующего файла
    
    MOV    AH, 0Ah            ; Функция ввода строки
        MOV    DX, OFFSET    Lname0    ; DX ? адрес-смещение буфера ввода
        INT    21h                ; Ввод строки
        XOR    BX, BX            ; BX ? 0
        MOV    BL, Lname            ; BX ? длина имени файла
        MOV    Namefile[BX], 0        ; Запись нулевого байта
        MOV    AH, 3Dh            ;
        MOV    DX, OFFSET Namefile    ; 
        MOV    AL, 1                ;         открытие 
        INT    21h                ;              файла
    MOV    Lognum1, AX            ; Сохранение логич. номера файла

    JNC ZAPISIVAEM_HVOST;ЕСЛИ УСПЕШНО - ПЕРЕХОДИМ К ЗАПИСИ ХВОСТА В ФАЙЛ
    
    MOV    DX, OFFSET Msg3     ;а если нет - вывод сообщения
    MOV    AH, 9                       ;об отсутствии 
    INT    21h                         ;ФАЙЛА
    JMP    Exit                ; На завершение программы

ZAPISIVAEM_HVOST:

    MOV    BX, Lognum1            ; BX ? логич. номер файла-копии
    XOR CX,CX
        MOV    CL, Lparam            ; CX ? число записываемых байтов
        MOV    AH, 40h            ; Функция записи в файл     
        MOV    DX, OFFSET Lparam+1        ;  DX ? адрес-смещение буфера
    
        INT    21h                ; Запись из буфера в файл
    
    JNC    DOPISIVAEM_OKRUZHENIE                ; Если успешно
    MOV    DX, OFFSET Msg5     ;вывод сообщения
    MOV    AH, 9                       ;о ТОМ, что 
    INT    21h                         ;ХВОСТ HE ЗАПИСАН
DOPISIVAEM_OKRUZHENIE:    
    MOV    DX, OFFSET Msg4     ;вывод сообщения
    MOV    AH, 9                       ;о ТОМ, что 
    INT    21h                         ;ХВОСТ ЗАПИСАН
  Exit:              MOV    AX, 4C00h                ;  Возврат в DOS с
                      INT     21h            ;    кодом завершения 0
_Text        ENDS
END        Start

Так вот она начинает писать с самого начала - ее не интересует, что там уже написано.
Как сделать так, чтобы она дописывала? Если размер файла 32 байта, то она запишет только 32 первых символа "хвоста", поэтому приходится "вручную" делать файл бОльшего размера. Есть какие-нибудь предложения?

И да, она работает только в FAT!
Как дописывать блок окружения - не предсавляю...

Это сообщение отредактировал(а) boobie - 14.10.2012, 13:01
PM   Вверх
ФедосеевПавел
Дата 14.10.2012, 14:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



Давай по-порядку.
1. Дозапись в файл
Попробуй посмотреть мой пример. Я его отладил и он действительно работает.

Он дописывает в конец текстового файла 'text.txt'. Это связано с тем, что после открытия файла выполняется операция перемещения указателя в конец файла (LSEEK) и только после этого перемещения записываются строки.

А в твоём примере файл открывается, а потом в него производится запись. Но указатель стоит на начале файла, поэтому в начало запись и происходит. Т.е. не дозапись, а перезапись.

Как исправить - после открытия файла добавить перемещение указателя в конец (int 21h Fn=42h - "LSEEK").
Код
    ;OPEN
    mov    ah,    3dh    ;open file
    mov    al,    02h    ;mode: read+write
    lea    dx,    azFileName
    int    21h
    jc    @@EndOfProg
    mov    hFile,    ax
    ;LSEEK
    mov    ah,    42h
    mov    bx,    hFile
    mov    al,    02h    ;to end of file
    mov    cx,    0000h
    mov    dx,    0000h
    int    21h
    jc    @@CloseFile

2. Блок окружения.
Чтобы добраться до переменных среды окружения нужно добраться до PSP.
Словесное описание:
а) int 21h Fn=62h вернёт в BX сегмент PSP.
б) в PSP по смещению 2ch находится сегмент переменных среды окружения.
в) зная адрес и формат хранения переменных среды окружения, можно их копировать в буфер, можно давать подпрограммам (прерываниям) адреса, вычислять длины строк и т.д. и т.п.
Вот пример, он не самый лучший и не самый удачный, но показывает как "добраться" до ENVIRONMENT
Код
PSP_Env    equ    2ch    ;смещение в PSP адреса среды окружения
PSP    dw    ?    ;сегмент префикса программного сегмента (PSP)
Envir    dw    ?    ;сегмент копии среды окружения
s    db    256 dup (?), '$'
asCR_LF    db    0dh, 0ah, '$'    ;символ перевода строки
..............................................................................
    ;получение PSP
    mov    ah,    62h
    int    21h
    mov    PSP,    bx
    ;получение сегмента среды окружения
    mov    es,    bx
    mov    ax,    [es]:PSP_Env
    mov    Envir,    ax

    ;вывод на экран переменных среды окружения
    mov    es,    Envir
    mov    si,    0000h
@@NewVar:
    mov    al,    [es]:si
    test    al,    al
    jz    @@EndOfEnvir
@@Process:
    mov    al,    [es]:si
    inc    si
    test    al,    al
    jnz    @@Continue
    lea    dx,    asCR_LF
    mov    ah,    09h
    int    21h
    jmp    @@NewVar
@@Continue:
    mov    dl,    al
    mov    ah,    02h
    int    21h
    jmp    @@Process
@@EndOfEnvir:





Это сообщение отредактировал(а) ФедосеевПавел - 14.10.2012, 15:00
PM   Вверх
boobie
Дата 14.10.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



1. Да, после введения в код функции 42h 21 -го прерывания она записывает "хвост" в конец... При этом пропускает около 400 пробелов  smile ... Ну, да ладно...
2. Все отлично... выводится...
P.S. Я сегодня, возможно, не смогу ответить - отвечу завтра. Спасибо за помощь!

Это сообщение отредактировал(а) boobie - 15.10.2012, 05:47
PM   Вверх
ФедосеевПавел
Дата 14.10.2012, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



1. Покажи код. Или в файле были 400 пробелов или при вызове int 21h Fn=42 в dx:cx что-то было.
2. EXE и COM - в учебнике по асму для DOS. Например, "С.В. Зубков. Ассемблер для DOS, Windows и UNIX"
PM   Вверх
boobie
Дата 15.10.2012, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Проблема с выводом файла на экран. При записи в файл все знаки "$" заменяются на "S", в конце добавляется "$". Затем происходит считывание в буфер и вывод на экран... Когда натыкается на знак '$' - прекращает вывод. Как вывести полностью
Как организовать вывод? Что делать?

Это сообщение отредактировал(а) boobie - 15.11.2012, 14:27
PM   Вверх
boobie
Дата 15.10.2012, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



Как вывести файл по-другому? Причем целиком, в т.ч. с символами "$"? smile 

Это сообщение отредактировал(а) boobie - 15.10.2012, 15:43
PM   Вверх
ФедосеевПавел
Дата 15.10.2012, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 7.2.2009

Репутация: 4
Всего: 10



По-другому строки можно выводить:
1) средствами BIOS,
2) выводить на экран как в файл - если handle, т.е. содержимое bx, сделать равным 01h то вывод будет перенаправляться на дисплей. Т.о. у тебя в руках окажутся одни и те же процедуры и для вывода в файл и для вывода на экран. Для вывода на экран файл открывать и закрывать не нужно.
Пример:
Код
.model    medium
.stack    800h
.data
azFileName    db    "text.txt", 0
hFile        dw    ?
azString1    db    "My first added string with char $", 0
azString2    db    "My second added string with two chars $$", 0
azCR_LF    db    0dh, 0ah, 0
.code

FWrite    PROC
    mov    si,    dx
@@001:
    test    BYTE PTR [si],    0FFh
    jz    @@002
    inc    si
    jmp    @@001
@@002:
    sub    si,    dx
    mov    cx,    si

    cmp    cx,    0000h
    jz    @@EmptyString
    mov    ah,    40h
    mov    bx,    hFile
;    lea    dx,    azString
;    mov    cx,    cx
    int    21h
@@EmptyString:
    ret    
FWrite    ENDP

main    proc
    mov    ax,    _DATA
    mov    ds,    ax

    ;OPEN
    mov    ah,    3dh    ;open file
    mov    al,    02h    ;mode: read+write
    lea    dx,    azFileName
    int    21h
    jc    @@EndOfProg
    mov    hFile,    ax
    ;LSEEK
    mov    ah,    42h
    mov    bx,    hFile
    mov    al,    02h    ;to end of file
    mov    cx,    0000h
    mov    dx,    0000h
    int    21h
    jc    @@CloseFile
    ;WRITE
    lea    dx,    azString1
    call    FWrite
    jc    @@CloseFile

    lea    dx,    azCR_LF
    call    FWrite
    jc    @@CloseFile

    lea    dx,    azString2
    call    FWrite
    jc    @@CloseFile


    lea    dx,    azCR_LF
    call    FWrite
    jc    @@CloseFile

@@CloseFile:
    mov    ah,    3eh
    mov    bx,    hFile
    int    21h

;вывод ASCIIZ-строки на экран теми же процедурами, что и в файл
    mov    hFile,    0001h

    lea    dx,    azString1
    call    FWrite
    jc    @@CloseFile

    lea    dx,    azCR_LF
    call    FWrite
    jc    @@CloseFile

    lea    dx,    azString2
    call    FWrite
    jc    @@CloseFile


    lea    dx,    azCR_LF
    call    FWrite
    jc    @@CloseFile

@@EndOfProg:
    mov    ax,    4c00h
    int    21h
main    ENDP

end main

Компилировать
tasm myprog.asm
tlink myprog.obj

P.S. Наступила рабочая неделя, я возвращаюсь домой поздно. Поэтому хочу выразить свою надежду на твою самостоятельную работу.
P.P.S. Как я вижу твою программу: 1) ввод имени файла 2) открытие файла для дозаписи (кстати по сию пору не реализованное) 3) дозапись параметров пограммы (хвост) 4) запись окружения 5) закрытие файла 6) вывод на экран содержимого текстового файла теми же процедурами, что и в файл.

Это сообщение отредактировал(а) ФедосеевПавел - 15.10.2012, 20:39
PM   Вверх
boobie
Дата 16.10.2012, 05:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 16.9.2011

Репутация: нет
Всего: нет



1. Нужно сделать COM-программу. Именно COM, под дос. 
2. Моя программа полностью работает, она все дописывает в файл, т.е. файл содержит все, что нужно. ТОЛЬКО В FAT-32! Осталось только вывести его на экран. И вот тут проблема. Я не знаю какого он размера, т.к. размер постоянно меняется. Можно считывать 4096 байт и выйти за пределы файла, вывести мусор. Можно поставить символ "$" после записи в файл, и тогда всегда будет выводится только результат первого выполнения программы.
Я знаю только один способ вывода на экран:
Код

     MOV    AH, 3Fh            ; Функция чтения из файла
     MOV    BX, Lognum1            ; BX ? логич. номер читаемого файла
     MOV    CX, 2048            ; CX ? число читаемых байтов
     MOV    DX, OFFSET Bufer        ;  DX ? адрес-смещение буфера
     INT    21h                ; Чтение из файла в буфер
        
     MOV    DX, OFFSET Bufer        ;  Вывод 
     MOV    AH, 9                ;     на экран
     INT    21h            

Т.е. сейчас стоит только одна задача - вывести... вывести этот гребаный файл на экран... Целиком, но без мусора.  smile  И все...
Как это можно сделать? Только это...



Это сообщение отредактировал(а) boobie - 16.10.2012, 06:00
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.