Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 733
от 30.05.2004, 15:30

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 5363
Отправлено ответов: 14772
Активность: 275.4 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Pawel
Статус: Профессиональный
Общий рейтинг: 154.88
[Подробней >>]
Foamplast
Статус: Профессиональный
Общий рейтинг: 151.49
URL: мой личный сайт
[Подробней >>]
ASMодей
Статус: Профессиональный
Общий рейтинг: 111.61
[Подробней >>]
 
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 134.09
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
Portnov
Статус: Профессиональный
Общий рейтинг: 105.53
URL: Мой сайтик...
[Подробней >>]
_vt
Статус: Профессиональный
Общий рейтинг: 118.76
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 116.62
[Подробней >>]
Стас
Статус: Доверительный
Общий рейтинг: 128.68
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 5328. Всем привет! Можно ли в ListView делать итемы невидимыми, «прятать» их, т.е. что бы их не удалять и ... (ответов: 1)
Вопрос № 5329. Привет всем, у меня вопрос такой, как я могу ползоватся с PCI слотами, их адреса какие... (ответов: 1)
Вопрос № 5330. здрасьти! потихоньку дочитал я до выпуска №8 (сломаного ножика), там проц переключается в PM. все по... (ответов: 1)
Вопрос № 5331. Здравствуйте! У меня в приложении два окна. Первый раз я вызываю ShowWindow hWnd,SW_MAXIMIZE. Затем ... (ответов: 3)
Вопрос № 5332. Здравствуите уважаемые эксперты. У меня к вам вопрос: можно ли поставить прерывание на чтение/запи... (ответов: 4)
Вопрос № 5333. привет ПЛЗ ответь на что нибудь из нижеперечисл списка вопр 1 если одну DLL используют несколько про... (ответов: 5)
Вопрос № 5334. A mutex object is a synchronization object whose state is set to signaled when it is not owned by an... (ответов: 2)
Вопрос № 5336. Доброго времени суток, уважаемый программисты. В 7 выпуске Калашникова "Ассемблер - это просто&... (ответов: 3)
Вопрос № 5337. Здравствуйте. Огромное спасибо тем, кто помог с программкой перевода из 8 в 2-ую с.с.!!!Я ее показа... (ответов: 3)
Вопрос № 5338. Подскажите пожайлуста как найти строку в текставом файле?... (ответов: 3)

Вопросов: 10, ответов: 26


 Вопрос № 5328

Всем привет!
Можно ли в ListView делать итемы невидимыми, «прятать» их, т.е. что бы их не удалять и не добавлять по сто раз?
Знаете ли вы что-нибудь про Virtual List-View Style и итемы со св-вом callback(Это мне на васм.ру)
Где можно найти описание функций ODBC32.dll на русском?



Вопрос отправлен: 25.05.2004, 00:35
Отправитель: Andrey (AndreyTorba@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Здравствуйте, Andrey!
1) Только используя обращения по хендлу(как к илементу окна), но это ОЧЕНЬ праблематично.
Чем ВАС не устраивает удаление итемов.

Ответ отправлен: 27.05.2004, 17:58
Отправитель: Pawel


 Вопрос № 5329

Привет всем,
у меня вопрос такой,
как я могу ползоватся с PCI слотами, их адреса какие



Вопрос отправлен: 25.05.2004, 10:17
Отправитель: Sinch (sinch20002000@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Доброе время суток, Sinch!
Имеются в виду порты для управления железом, висящим на PCI шине?
смотри http://www.atel.ru/pci.htm
P.S. 5 минут поиска в Google

Ответ отправлен: 27.05.2004, 18:08
Отправитель: Pawel


 Вопрос № 5330

здрасьти!
потихоньку дочитал я до выпуска №8 (сломаного ножика), там проц переключается в PM. все понятно, тока вот одно не доганяю - как вычисляется точка входа в PM (алгоритм)??
спасибо



Вопрос отправлен: 25.05.2004, 11:32
Отправитель: очень хочу научиться

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Доброе время суток, очень хочу научиться!
Для перевода МП в защищенный режим
необходимо подготовить в памяти таблицу дескрипторов прерываний
и загрузить ее параметры командой LIDT. Кроме того необходимо
сформировать глбальную таблицу дескрипторов и задать ее адрес
командой LGDT. После этих команд установка бита PE в MSW
(командой SMSW) переводит МП в защищенный режим. Сразу после
установки бита PE необходимо выполнить команду межсегментного
перехода (JMP FAR), чтобы МП очистил очередь команд, выбраных в
реальном режиме. Для того, чтобы регистры МП получили нужные
значения, команда JMP дплжна ссылаться на начальный TSS, исполь-
зуемый системой. При этом будут загружены регистр задачи,
регистр LDT, сегментные и общие регистры. Регистр TR должен
указывать на правильно заполненный TSS.
Возврат в реальный режим возможен только сбросом процессора по
входу RESET.

Ответ отправлен: 27.05.2004, 18:12
Отправитель: Pawel


 Вопрос № 5331

Здравствуйте! У меня в приложении два окна. Первый раз я вызываю ShowWindow hWnd,SW_MAXIMIZE. Затем мне нужно скрыть первое окно и показать второе, которое имеет свой класс и свой хэндл hWnd1. Короче, мне нужно организовать вз/д-е двух окон(скрыть второе, показать первое, и наоборот). Как это сделать? Заранее благодарю.



Вопрос отправлен: 25.05.2004, 13:50
Отправитель: dimon1979

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Здравствуйте, dimon1979!
ShowWindow hWnd,SW_hide - скрыть окно
ShowWindow hWnd,SW_show - показать окно


Ответ отправлен: 27.05.2004, 18:14
Отправитель: Pawel


Отвечает Foamplast

Здравствуйте, dimon1979!
Так и сделать. Я Вам уже присылал ссылкку на пример. Скачайте его и посмотрите!
http://foamplast.hexx.ru/splash.zip


Ответ отправлен: 29.05.2004, 13:20
Отправитель: Foamplast


Отвечает ASMодей

Приветствую Вас, dimon1979!
Чтобы скрыть окно вызывай ту же функцию, но с параметром SW_HIDE.


Ответ отправлен: 26.05.2004, 08:00
Отправитель: ASMодей


 Вопрос № 5332

Здравствуите уважаемые эксперты. У меня к вам вопрос: можно ли поставить прерывание на чтение/запись портов (любых) с помощью привелегированных команд процессора?



Вопрос отправлен: 25.05.2004, 20:47
Отправитель: Иван

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Доброе время суток, Иван!
Да но для процессов в RING-3

Ответ отправлен: 27.05.2004, 18:15
Отправитель: Pawel


Отвечает Евгений Иванов

Доброе время суток, Иван!
Да, это называется BreakPoint.
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 26.05.2004, 17:49
Отправитель: Евгений Иванов


Отвечает ASMодей

Добрый день, Иван!
Только в защищенном режиме и только для процессов с привилегиями ниже системных.


Ответ отправлен: 26.05.2004, 08:02
Отправитель: ASMодей


Отвечает Foamplast

Доброе время суток, Иван!
Да, насколько я представляю в процессорах типа IA-32 необходимо записать адрес подозреваемой команды в один из отладочных регистров DR0-DR3 и проставить условие остановки "остановка по чтению или записи портов ввода вывода" в регистре DR7. Всё это делается командой MOV. Подробнее расскажет руководство по эксплуатации конкретного процессора. В процессорах других семейств эта возможность может осуществляться по-другому или вообще отсутствовать.


Ответ отправлен: 29.05.2004, 16:43
Отправитель: Foamplast


 Вопрос № 5333

привет
ПЛЗ ответь на что нибудь из нижеперечисл списка вопр
1 если одну DLL используют несколько процессов одновременно
(напр KERNEL32) то в физич. памяти находится только одна
DLL( т е в физ памяти она одна но в каждом вирт пространстве определённым вирт адресам назначена в соотв физич память в кот находится DLL)?
2 в разных вирт. адр пространствах одна и та же DLL будет по одному и тому же вирт адресу?
3 таблица прерываний в вирт адр пространстве
любого процесса начинается с 00000000h?
4 в одной умной книжке прочитал:
"Запуск на исполнение EXE - модуля происходит следующим образом: EXE - файл проецируется на память. При этом он не переписывается в файл подкачки. Просто элементы каталога и таблиц страниц настраиваются так, чтобы они указывали на EXE - файл, лежащий на диске. Затем передается управление на точку входа программы. При этом происходит возникает исключение, обрабатывая которое стандартным образом, VMM загружает в память требуемую страницу и программа начинает исполняться. Такой механизм существенно ускоряет процедуру запуска программ, так как загрузка страниц EXE - модуля происходит по мере необходимости. Образно говоря, программа сперва начинает исполняться, а потом загружается в память."
так ведь же файл на диске != файлу в памяти
А здесь похоже на простое копирование (или происходит работа по отображению секций на определён вирт адреса(выравнивание)? Но не может же это происходить прямо во время работы программы)
Если так происходит в действительности то как тогда быть с усл/безусл переходами в файле?

5 сначала ф-ция CreateProcess создаёт вирт адр пространство для нового процесса А что на этом этапе РЕАЛЬНО происходит, я имею в виду что реально скрывается за термином вирт адресное пространство - новый каталог страниц физич памяти которым будет пользоваться процессор при работе с новым процессом?
6 такая штука как VMM присутствует в WinNT?
7 как узнать можно ли писать/читать по данному адресу
(кроме метода реально обратиться по данному адресу)?
8 адрес какй-нибудь(любой) системной таблицы, структуры в
вирт адр пространствах разных процессов одинаков?
P.S заранее спасибо за ответы
P.P.S: sorry за некоторые ламерские вопросы



Вопрос отправлен: 25.05.2004, 22:14
Отправитель: croll

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Приветствую Вас, croll!
1)ДА, именно для этого и создавались DLL.
2)ДА, так.
3)ДА.
4)Ни как, подгрузятся нужные куски кода, а потом будет джамп.
5)Выделяется и переадрисуется участок памяти.
6)ДА.
7)Узнать приоретет своего процесса.
8)Зависет от таблици.

Ответ отправлен: 27.05.2004, 18:24
Отправитель: Pawel


Отвечает Евгений Иванов

Здравствуйте, croll!
1. Да.
2. Да.
3. IDTR один, так что..
Но вот для Vitrtual-8086 - там всё по разному, конечно.
4. Вирт. оно и есть вирт. При Fault происходит вызов обработчика исключения, а он уже подгружает нужный участок памяти с диска.
8. Что за чушь? GDTR она общая на один процессор ;)
Удачи!
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 26.05.2004, 17:50
Отправитель: Евгений Иванов


Отвечает Portnov

Приветствую Вас, croll!
1. Да
2. Не всегда; в WinNT всегда по одним и тем же адресам (но меняющимся от версии NT к версии) грузятся user32.dll, kernel32.dll и немногие другие. Остальные библиотеки грузятся "куда попало".
3. Насколько я понимаю, в адресном пространстве процессов ring3 ее вообще нет. В ring0 можно узнать ее расположение из регистра idtr.
4. При загрузке PE-файла смещения правятся соответственно информации, указанной в relocation table.
5.
6. Да
7.
8. Необязательно.
С уважением, Portnov.

Ответ отправлен: 26.05.2004, 17:30
Отправитель: Portnov


Отвечает Foamplast

Приветствую Вас, croll!
  1. Да.
  2. Нет, не обязательно. Скорее всего, по разным.
  3. Нет, это только в режиме виртуального 8086. Вообще где угодно.
  4. Дурь написана. Элементы каталога и таблиц страниц никак не могут указывать на диск. Просто все страницы помечаются как отсутствующие, при их чтении-записи-исполнении происходит исключение, обработчик которого ставит страницы в очередь для загрузки, помечает процесс как усыплённый до загрузки определённых страниц и говорит планировщику, чтобы тот ещё чего-нибудь там запустил.
    Файл на диске != файлу в памяти - При запуске процесса загрузчик как раз тем и занимается, что смотрит, какие разделы (секции) куда отобразить. Там могут возникнуть косяки с уже загруженными ДЛЛ и т.п.. А вот когда это всё сделано, то есть для каждого раздела определено, где он должен находиться, может спокойно работать вышеописанный механизм. Прямо во время работы процесса.
    Как тогда быть с усл/безусл переходами? - Если переход происходит на страницу, которая физически присутствует, то всё нормально, а если она отсутствует, то срабатывает исключение, как описано выше.
  5. Да. Создаются новые страницы, новые дескрипторы сегментов, новый TSS. Вообще говоря, на 80х86 для создания "нового виртуального пространства" необходимо создать дескрипторы. Если включен страничный механизм, то ещё и элементы каталога страниц. А если надо что-то оттуда запускать, то и TSS.
    На самом деле всем этим занимается (занималась?) только OS/2. ОС "Виндовс" частично забивает на сегменты и защиту, которую они обеспечивают. В частности, возможно создание одного сегмента с правами чтение-запись-исполнение (путём перекрытия сегментов данных и кода). Стек вообще исполняем по умолчанию! На этом основаны все атаки переполнения буфера. В результате AMD решила, что раз почти все забили на сегменты, то они и не нужны. В описании архитектуры х86-64 написано, что теперь вся защита обеспечивается только с помощью страниц.
  6. Что-то похожее должно быть, она же работает :)
  7. Это самый классный метод. Ставишь обработчик исключений и обращаешься куда надо. Если это нельзя, то вызовется обработчик с соответствующими параметрами. Остальные методы не такие прикольные.
  8. Ядро не должно отображаться на пользовательский процесс вообще.



Ответ отправлен: 29.05.2004, 16:43
Отправитель: Foamplast


Отвечает ASMодей

Здравствуйте, croll!
Почитай лучше книгу Рихтера "Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows" или книгу "Inside Microsoft Windows 2000" (David A. Solomon, Mark Russinovich). Там все очень хорошо и подробно описано.


Ответ отправлен: 26.05.2004, 08:02
Отправитель: ASMодей


 Вопрос № 5334

A mutex object is a synchronization object whose state is set to signaled when it is not owned by any thread, and nonsignaled when it is owned. Only one thread at a time can own a mutex object, whose name comes from the fact that it is useful in coordinating mutually exclusive access to a shared resource. For example, to prevent two threads from writing to shared memory at the same time, each thread waits for ownership of a mutex object before executing the code that accesses the memory. After writing to the shared memory, the thread releases the mutex object.
A thread uses the CreateMutex function to create a mutex object. The creating thread can request immediate ownership of the mutex object and can also specify a name for the mutex object. Threads in other processes can open a handle to an existing mutex object by specifying its name in a call to the OpenMutex function. For additional information about names for mutex, event, semaphore, and timer objects, see Interprocess Synchronization.
Any thread with a handle to a mutex object can use one of the wait functions to request ownership of the mutex object. If the mutex object is owned by another thread, the wait function blocks the requesting thread until the owning thread releases the mutex object using the ReleaseMutex function. The return value of the wait function indicates whether the function returned for some reason other than the state of the mutex being set to signaled.
Threads that are waiting for ownership of a mutex are placed in a first in, first out (FIFO) queue. Therefore, the first thread to wait on the mutex will be the first to receive ownership of the mutex, regardless of thread priority. However, kernel-mode APCs and events that suspend a thread will cause the system to remove the thread from the queue. When the thread resumes its wait for the mutex, it is placed at the end of the queue.
After a thread obtains ownership of a mutex, it can specify the same mutex in repeated calls to the wait-functions without blocking its execution. This prevents a thread from deadlocking itself while waiting for a mutex that it already owns. To release its ownership under such circumstances, the thread must call ReleaseMutex once for each time that the mutex satisfied the conditions of a wait function.
If a thread terminates without releasing its ownership of a mutex object, the mutex object is considered to be abandoned. A waiting thread can acquire ownership of an abandoned mutex object, but the wait function's return value indicates that the mutex object is abandoned. It is best to assume that an abandoned mutex object indicates that an error has occurred and that any shared resource being protected by the mutex object is in an undefined state. If the thread proceeds as though the mutex object had not been abandoned, its "abandoned" flag is cleared when the thread releases its ownership. This restores normal behavior if a handle to the mutex object is subsequently specified in a wait function.
В каком месте тебе непонятно? ;-)
Здравствуйте!
Спасибо, эксперту _vt дважды: за английскую и за статью!
_vt, если можно киньте мне ссылку на этот сайт.
Это поверхностное объяснение. Мне непонятно, как это происходит глубже.



Вопрос отправлен: 25.05.2004, 22:17
Отправитель: Alexander

[Следующий вопрос >>] [Список вопросов]

Отвечает _vt

Доброе время суток, Alexander!
Так я и спросил - что тебе непонятно? :)
А ссылка - msdn.microsoft.com ;)
Поподробнее можно почитать у Джеффри Рихтера - в русском переводе книга называется:
"Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows" и есть в интернете.
* Origin : Life begins at 1000Mhz!


Ответ отправлен: 25.05.2004, 23:39
Отправитель: _vt


Отвечает Foamplast

Приветствую Вас, Alexander!

Взаимное исключение реализуется либо программно, либо аппаратно. Из програмных реализаций хорошо известен алгоритм Петерсона. Аппаратные реализации основываются на команде TSL (Test and Set Lock), в процессорах х86 её аналогом является XCHG.

Алгоритм Петерсона:

turn        RESB    1
interested RESB 2
; на входе Еах - номер процесса (0 или 1)
enter_region:
Mov Ecx, 1
Sub Ecx, Eax
Mov [interested + Eax], 1
Mov [turn], Eax

.loop

Cmp [turn], Eax
Jne .end
Cmp [interested + Ecx], 1
Je .loop

.end

Ret
; на входе Еах - номер процесса (0 или 1)
leave_region:
Mov [interested + Eax], 0
Ret

Взаимное исключение с участием аппарутуры реализуется при помощи команды, которая считывает в регистр значение ячейки памяти и замещает его некоторым ненулевым значением. При этом гарантируется неделимость операции, то есть другой поток не может обратиться к указанному слову памяти, пока команда не выполнена. Идея состоит в том, что после выполнения такой команды исследуется старое значение. Если оно равно нулю, то блокировка установлена, иначе она уже была установлена кем-либо ранее.

Аппаратная реализация:

enter_region:
Mov Eax, 1
Xchg Eax, [lock]

Cmp Eax, 0
Jne enter_region

Ret

leave_region:
Mov [lock], 0
Ret
При использовании последнего механизма необходимо инициализировать переменную lock нулём перед началом использованием блокировок.

Алгоритмы приведены в очевидном варианте, некоторые команды можно заменить на более короткие (или быстрые). Приведённые алгоритмы при ожидании освобождения блокировки тратят процессорное время. Этого можно избежать, либо удалив цикл ожидания и возвращая результат (установлена блокировка или нет), либо усыпляя процесс до наступления события и производя это событие при освобождении блокировки. Последний вариант является самым предпочтительным по экономии процессорного времени, он требует соответствующей поддержки планировщика потоков.




Ответ отправлен: 29.05.2004, 16:44
Отправитель: Foamplast


 Вопрос № 5336

Доброго времени суток, уважаемый программисты. В 7 выпуске Калашникова "Ассемблер - это просто" в программке для практики имеется код в процедуре Out_char, где два раза подряд встречается команда push ax . Я так и не понимаю, для чего два раза сохранять регистр AX. Спасибо!



Вопрос отправлен: 26.05.2004, 08:16
Отправитель: Ринат

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Приветствую Вас, Ринат!
Первый push сохраняет значение AX, второй push заносит значения ax для процедуры.

Ответ отправлен: 27.05.2004, 18:49
Отправитель: Pawel


Отвечает Ayl

Приветствую Вас, Ринат!
Дело в том, что процедура Out_char не разрушает регистры, кроме регистра di. Поэтому три первых push'а предназначены для сохранения значений используемых регистров (cx, ax и es). Им соответствуют три команды pop перед выходом из процедуры. Второй push ax требуется для сохранения значения регистра ax собственно для самой процедуры - после нее с помощью команд
mov ax, 0b800h
mov es, ax
в регистр es загружается адрес сегмента видеопамяти для текстового режима. А в регистре ax также находится код символа для вывода. И он нам потребуется в самой процедуре, причем мы изменим значение регистра ah (старший байт регистра ax) на атрибут для вывода символов. Поэтому и требуются два push'а.
В Приложении - код обсждаемой программы, чтобы читателям было понятно, о чем речь. Кстати, на будущее, если ссылаешься на программы из рассылки, не поленись их вставить в приложение - не всегда есть возможность копаться в архивах.


Приложение:

Ответ отправлен: 26.05.2004, 11:15
Отправитель: Ayl


Отвечает Foamplast

Доброе время суток, Ринат!
А чё там за код? Я не видал.


Ответ отправлен: 30.05.2004, 04:16
Отправитель: Foamplast


 Вопрос № 5337

Здравствуйте.
Огромное спасибо тем, кто помог с программкой перевода из 8 в 2-ую с.с.!!!Я ее показала преподавателю и он мне дал новое задание - перевести из 8 в 16-ую(с учетом тех команд, которые мы изучили). Решила сделать сама, но оно не хочет выводить числа от A до F. Может кто-то сможет помочь?
Спасибо.
П.С. А как туда еще вставить условие вывода числа посредине определенного цвета?


Приложение:


Вопрос отправлен: 26.05.2004, 10:07
Отправитель: Natasha

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Приветствую Вас, Natasha!
POP DX
CMP DX,'9' нужно CMP DX,9
JA D

Ответ отправлен: 27.05.2004, 18:53
Отправитель: Pawel


Отвечает Стас

Здравствуйте, Natasha!
Наконец-то и сама писать начала!
Замечания по поводу твоей программы:
1) push ax, pop ax в стоках 20, 24 не имеют смысла - следующая команда mov ax,0
2) лишние переменные Z,X и манипуляции с ними (типа mov z,dl cmp z,8 или еще пуще mov x,ax и следом mov ax,x не имеют смысла)
3) в процедуре перевода числа в символьную строку ты сравниваешь dx с символом '9', а нужно с числом 9 т.е. нужно убрать кавычки.
Вуаля! работает!
4) лично мне не нравится два момента деление (DIV), я предпочитаю свиг (SHR,ROL). SHR AX,CL (CL=4) - деление DX на 16.
и второе PUSH делающийся в LOOP, оригинально, но потенциально опасно.
5) странное использование "1 DUP('Text')", чем не устраивает db 'Text'.
6) опять же чем не устраивает вывод сообщения через функ. 9 21 перывания? Зачем это делать посимвольно.
7) Ну и наконец использовать так макрос не имеет смысла. Вообще в этой программе нет места макросу.

Ответ отправлен: 26.05.2004, 16:22
Отправитель: Стас


Отвечает Foamplast

Доброе время суток, Natasha!
Ловите переделанную программу. Теперь она переводит из восьмеричной системы в шестнадцатеричную. и, как и в прошлый раз, выводит результат посередине экрана САЛАТОВЫМ цветом. http://foamplast.hexx.ru/examples/oct2hex.zip


Ответ отправлен: 29.05.2004, 16:45
Отправитель: Foamplast


 Вопрос № 5338

Подскажите пожайлуста как найти строку в текставом файле?



Вопрос отправлен: 26.05.2004, 15:25
Отправитель: flasher

[Следующий вопрос >>] [Список вопросов]

Отвечает Pawel

Здравствуйте, flasher!
Используя cmpsb

Ответ отправлен: 27.05.2004, 18:56
Отправитель: Pawel


Отвечает Стас

Доброе время суток, flasher!
Визуально!
Если серьезно: читаешь файл в буффер (блоками)
в AL клаешь первый символ искомой строки, CX длину буффера(блока)и ищешь scasb (по желанию scasw). Если нашел начинаешь сравнивать строчки вручную (проще отследить конец буффера) или cmpsb. Не совпали - бежишь снова на scasb. Кончился буффер - читашь следующую порцию и на scasb.
Примерно так.

Ответ отправлен: 26.05.2004, 20:46
Отправитель: Стас


Отвечает Foamplast

Приветствую Вас, flasher!

Берём первый символ, сравниваем его с первым символом искомой строки, если они не равны, то берём следующий символ и опять сравниваем его с первым символом искомой строки. Если и они не равны, то идём далее, пока строка не кончится. Если она кончилась, то искомой строки не найдено.

Если на каком-либо этапе очередной символ равен превому символу искомой строки, то берём следующий символ и сравниваем его со вторым символом искомой строки, если они не равны, то берём следующий символ и сравниваем его с первым символом искомой строки, далее как в предыдущем абзаце.

Если же на каком-либо этапе очередной символ равен второму символу искомой строки, то следующий сравниваем уже с третьим символом искомой строки, если и он равен, то следующий символ сравниваем с четвёртым и так далее. Если искомая строка кончилась, то она найдена.




Ответ отправлен: 29.05.2004, 16:45
Отправитель: Foamplast



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (21)
C / C++ (15)
Perl (1)
Builder / Delphi (17)
Pascal (20)
Basic / VBA (2)
Java / JavaScript (4)
PHP (12)
Криптография (6)
WinAPI (8)
Радиоэлектроника (10)
Пользователю
Windows 95/98/Me (35)
Windows NT/2000/XP (49)
"Железо" (30)
Поиск информации (16)
Администратору
Windows NT/2000/XP (20)
Linux / Unix (7)
Юристу
Гражданское право (11)
Семейное право (9)
Трудовое право (10)
КоАП (7)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное