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

Ваш аккаунт

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

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

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

работа с файлами, принцип

35K
21 февраля 2009 года
Princesska
17 / / 27.12.2008
Поясните кто-нибудь этот кусок кода в котором вводится имя файла:


Код:
masm
model small
.data
file_name       db      128 dup (" ")   ;буфер, для пути к файлу
point_fname     dd      file_name
string  db      100 dup (" ")
len_string=$-string
point_string dd string
handle  dw      0       ;дескриптор файла
size_f  dd      0       ;размер файла
.stack  256
.486
.code
main:
;копируем командную строку в file_name
;вначале уберем (установкой указателя) ведущие пробелы в командной строке перед путем к файлу:
mov di,81h
    mov al," "
    mov cx,128
repe    scasb
    dec di
push    di
pop si
    mov ax,@data    ;адрес сегмента данных - в регистр ax
    mov es,ax   ;ax в es
    mov cl,ds:[80h]
    dec cl
    lea di,file_name
rep movsb
push    es
pop ds


вообще прога выводит на экран содержимое блокнотовского файла, имя которого указывается в командной строке. Ну я так догадываюсь именно имя файла в этом фрагменте и вводится, только куда, как, в какие регистры, что? Почему именно 80h и зачем push es pop ds? Не может ли кто-нибудь поподробнее рассказать?
349
21 февраля 2009 года
Phantom-84
656 / / 27.10.2005
Вообще под DOS сейчас почти никто не программирует. Но я все-таки попробую освежить в своей памяти то, о чем ты спрашиваешь.

Короче, в DOS перед образом программы в памяти (все равно, загруженной из COM- или EXE-файла) находится область PSP размером 256 байт, последние 128 байт которой называются DTA и являются файловым буфером по умолчанию для устаревших файловых функций, а также исползуются для хранения строки параметров при запуске программы. В ячейке [80h] при этом содержится длина строки - это типа коротких строк в Паскале, не нольтерминальных строк. Самое главное, что при старте программы в регистрах ds и es содержится сегментный адрес именно PSP, а не сегмента данных программы. В программе сначала идет копирование имени из PSP в сегмент данных, а потом настройка регистра ds на сегмент данных (с помощью пары команд push es/pop ds) - у тебя сначало было es<--@data, а теперь ds<--es, т.е. в итоге ds<--@data.
35K
24 февраля 2009 года
Princesska
17 / / 27.12.2008
Ясно.... принцип теперь понятен , но что отдельно каждая операция делает не пойму. Например зачем dec di и dec cl
нужно? можно покомандно объяснить....
261
24 февраля 2009 года
ahilles
1.5K / / 03.11.2005
почитай учебники и всё поймёшь. и проблем не будет со сдачей лабораторных....
349
24 февраля 2009 года
Phantom-84
656 / / 27.10.2005
repe scasb будет пропускать пробелы, пока не найдет символ, отличный от пробела, причем даже когда будет найден такой символ, инструкция scasb увеличит (или уменьшит - где cld? - не вижу!) регистр di на 1. dec di вернет значение di, так что ону будет являться смещением первого, отличного от пробела символа строки.
dec cl, видимо, нужен для того, чтобы избавиться от кода 0x0D в конце строки, который попадает туда из-за того что пользователь нажимает Enter, когда заканчивает ввод команды с параметрами. Хотя лично я бы не стал опираться на это и сделал разбор строки параметров более детальным, а следовательно менее подверженным возможным ошибкам при невыполнении этого и других условий.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог