Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2011, 10:42   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию работа с файлами

Начинаю работать с файлами. Разобрал код из книги, некоторое непонятно (пометил вопросами). Кто может, прокомментируйте плиз некоторые строки кода
Код:
CSEG segment
assume cs:CSEG, ds:CSEG, es: CSEG, SS:CSEG
org 100h
Begin:
        ;функция ah=3Dh прерывания 21h - Открытие файла
        mov ax, 3D00h;открывает файл для чтения
        mov dx, offset Filename;ds:dx указывают путь к файлу
        int 21h;открываем файл
        jc Error_file;перейти если установлен флаг переноса (jump if carry) (если произошла ошибка)
        
        ;Для того чтобы прочитать файл, необходимо в bx указать его номер, полученный после открытия, который находится в ax
        ;Загрузка числа в один регистр из другого происходит быстрее, чем из памяти (переменной)
        ;Хотя записмь mov bx, Handle не была бы ошибочной
        
        
        mov Handle, ax;Handle - переменная, в которую заносим номер файла после открытия
        mov bx,ax 
        mov ah, 3Fh; функция 3Fh - чтение файла
        ;????????????????????????????????????????
        mov cx, 0FDE8h;будем читать 0FDE8h=65000 байт
        ;ds:dx должен указывать на буфер в памяти для чтения
        mov dx, offset Buffer;зачем нужен этот оператор????????????????????????
        int 21h;всё готово, читаем...
        
        mov ah, 3Eh;для закрытия файла
        mov bx, Handle;номер файла должен находиться в bx,но так как регистр bx менялся, то загружаем ее из переменной Handle
        int 21h;непосредственно закрываем файл
        
        mov dx, offset Mess_ok
        
        Out_prog:
        mov ah,9;вывод строки на экран
        int 21h;выводим строку
        
        int 20h;выходим из программы
        
        Error_file:
        mov dx, offset Mess_error
        jmp Out_prog
        
        ;==Переменные==
        ;что такое dw и почему переменная объявлена в конце, а не в начале как в c++/c#,pascal,php??????????????????????????????
        Handle dw 0;резерв 2 байта для нашей переменной
        Mess_ok db 'Файл загружен в память$'
        Mess_error db 'Ошибка$'
        
        ;откуда будем читать этот файл
        Filename 'C:\1.txt',0, '!$'
        
        Buffer equ $;?????????????????????????????
        
CSEG ends
End Begin



1. mov cx, 0FDE8h;будем читать 0FDE8h=65000 байт
это как понять? То есть прежде чем мы начнем работу с файлом, надо записать его размер, чтобы программа знала, сколько байт надо читать? А если мы будем производить запись в файл?
И еще. почему 65000? Может быть правильнее сначала вызвать функцию, которая узнает размер файла, а затем уже записать это значение в cx???
2. mov dx, offset Buffer;зачем нужен этот оператор????????????????????????
3. ;==Переменные==
;что такое dw и почему переменная объявлена в конце, а не в начале как в c++/c#,pascal,php?????????????????????? ????????
Handle dw 0;резерв 2 байта для нашей переменной
4. что это делает?

Buffer equ $;?????????????????????????????
Dimarik вне форума Ответить с цитированием
Старый 23.02.2011, 11:11   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> То есть прежде чем мы начнем работу с файлом, надо записать его размер

не его размер, а размер буфера, который у нас есть

> чтобы программа знала, сколько байт надо читать?

не программа, а 21-е прерывание

> А если мы будем производить запись в файл?

значт надо будет указать, сколько байт записать из буфера и вызвать другую функцию 21-го прерывания.

> Может быть правильнее сначала вызвать функцию, которая узнает размер файла, а затем уже записать это значение в cx???

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

> 2. mov dx, offset Buffer;зачем нужен этот оператор

у вас же там в коде правильный комментарий:

Цитата:
;ds : dx должен указывать на буфер в памяти для чтения
> почему переменная объявлена в конце

асму обычно пофиг, где что объявлено. Объявлено, и слава богу )

> Buffer equ $

на сколько я понимаю, это просто метка типа "буффер будет здесь".
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами в C++ Expelio Помощь студентам 9 26.03.2010 19:07
Работа с файлами Pr1meEX PHP 9 21.06.2009 03:15
Работа с файлами. tae1980 Microsoft Office Excel 3 23.05.2009 23:50
Работа с файлами Maksi Фриланс 4 07.06.2008 11:38
Работа с файлами Dim@ Помощь студентам 1 26.12.2007 22:43