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

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 554
от 23.09.2006, 21:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 348, Экспертов: 37
В номере:Вопросов: 7, Ответов: 12


Вопрос № 55767: Здравствуйте ! Расскажите пожалуйста как использовать задержку, вроде бы delay. Ну например выводить посимвольно строку с задержкой 0.1 сек....
Вопрос № 55823: Здравствуйте. Допустим я осуществляю поиск файлов. Как поместить имя найденного файла в переменную ?...
Вопрос № 55825: Здравствуйте, это снова я. А как заставить ассеиблер искать все файлы без исключений? Ну я имею ввиду файлы всех типов и каталоги. И еще, как узнать найден файл или папка ?...
Вопрос № 55826: Здравствуйте Олег Владимирович. Вы написали текст программы, которая выводит содержимое регистра ax на экран. Можете обьяснить текст этой программы поподробней. Например, зачем сначала умножать на десять, потом делить ? Не понятно....
Вопрос № 55833: Здравствуйте. А как можно дописать какой-нибудь символ в конец имени файла? Ну скажем был файл c:games123.txt А станет c:games1230.txt...
Вопрос № 55873: Здравствуйте эксперты. В чем разница у икзелиона в 12 уроке : hMemory от pMemory Спасибо....
Вопрос № 55875: Здравствуйте эксперты. Как узнать размер файла в вин 32. Спасибо....

Вопрос № 55.767
Здравствуйте ! Расскажите пожалуйста как использовать задержку, вроде бы delay. Ну например выводить посимвольно строку с задержкой 0.1 сек.
Отправлен: 17.09.2006, 23:50
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: ADSota
Здравствуйте, Whiteman!

delay proc
mov cx,1
mov dx,86A0h
;cd:dx - число микросекунд - в данном примере 0.1 с
mov ah,86h
int 15h
ret
endp

---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 18.09.2006, 12:14

Отвечает: Jekyll
Здравствуйте, Whiteman!

Используйте Sleep.

void Sleep(
DWORD dwMilliseconds
);

dwMilliseconds - Задержка в миллисекундах
Ответ отправил: Jekyll (статус: 1-ый класс)
Ответ отправлен: 18.09.2006, 13:43


Вопрос № 55.823
Здравствуйте. Допустим я осуществляю поиск файлов. Как поместить имя найденного файла в переменную ?
Отправлен: 18.09.2006, 11:56
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: ADSota
Здравствуйте, Whiteman!

Тут в зависимости - когда эта переменная нужна... Если используется сразу после нахождения и не меняеться, можно просто запомнить адрес памяти, куда пишеться имя файла после поиска. Если планируется найденное имя файла использовать позднее, то оно копируется в какую-либо область памяти для дальнейшего использования.
---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 18.09.2006, 12:23


Вопрос № 55.825
Здравствуйте, это снова я. А как заставить ассеиблер искать все файлы без исключений? Ну я имею ввиду файлы всех типов и каталоги.
И еще, как узнать найден файл или папка ?
Отправлен: 18.09.2006, 11:59
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Sergijj
Здравствуйте, Whiteman!

Посмотрите ответы на вопрос № 49495 (он очень похож на Ваш).

Успехов!
---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 5-ый класс)
Ответ отправлен: 18.09.2006, 12:13

Отвечает: Jekyll
Здравствуйте, Whiteman!

читай MSDN - поможет.

HANDLE FindFirstFile(
LPCTSTR lpFileName,
LPWIN32_FIND_DATA lpFindFileData
);
Parameters
lpFileName
[in] Pointer to a null-terminated string that specifies a valid directory or path and file name, which can contain wildcard characters, such as * and ?.
There is a default string size limit for paths of MAX_PATH characters. This limit is related to how the FindFirstFile function parses paths.

lpFindFileData
[out] Pointer to the WIN32_FIND_DATA structure that receives information about the found file or subdirectory.
Return Values
A search handle, used in a subsequent call to FindNextFile or FindClose, indicates success. INVALID_HANDLE_VALUE indicates failure. To get extended error information, call GetLastError.

Remarks
The FindFirstFile function opens a search handle and returns information about the first file whose name matches the specified pattern. Once the search handle is established, you can use the FindNextFile function to search for other files that match the same pattern. When the search handle is no longer needed, close it by using the FindClose function.

This function searches for files by name only; it cannot be used for attribute-based searches.

Ответ отправил: Jekyll (статус: 1-ый класс)
Ответ отправлен: 18.09.2006, 13:51

Отвечает: Олег Владимирович
Здравствуйте, Whiteman!

INT 21h forever! И эти функции в нем есть.

AH=4Eh - поиск первого файла с совпадающим именем. Параметры: CX=атрибуты файла, DS:DX-ASCIIZ-строка с именем файла(можно что-то вроде *.*)
Результат: CF=1 => файл не найден; иначе информация записывается в DTA - disk transfer area - область для обмена данными с диском. О ней чуть позже

AH=4Fh - поиск следующего файла с совпадающим именем. Вызывается после 4Eh. Результат: CF=1 если файлов больше не найдено, иначе см. DTA.

Теперь о том, как выглядит область для обмена данными с диском.
Допустим, она расположена по адресу A:B. Тогда
байт A : B+15h содержит атрибут файла
слово A : B+18h - время создания файла
слово A : B+1Ah - дату создания
двойное слово A:B+1Ch - размер файла
начиная с A:B+1Eh - имя и расширение файла

Удачи!
Как узнать , где находится DTA?
Вызвать INT 21h c AH=2Fh. Оно вернёт в ES:BX адрес DTA.
---------
Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 3-ий класс)
Ответ отправлен: 18.09.2006, 19:25


Вопрос № 55.826
Здравствуйте Олег Владимирович. Вы написали текст программы, которая выводит содержимое регистра ax на экран. Можете обьяснить текст этой программы поподробней. Например, зачем сначала умножать на десять, потом делить ? Не понятно.
Отправлен: 18.09.2006, 12:08
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Олег Владимирович
Здравствуйте, Whiteman!

Попробуйте посмотреть на работу программы по шагам. Тогда всё станет намного понятнее, и дополнительные комментарии уже будут не нужны.
---------
Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 3-ий класс)
Ответ отправлен: 18.09.2006, 19:02


Вопрос № 55.833
Здравствуйте. А как можно дописать какой-нибудь символ в конец имени файла? Ну скажем был файл c:games123.txt
А станет c:games1230.txt
Отправлен: 18.09.2006, 12:39
Вопрос задал: Whiteman (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Jekyll
Здравствуйте, Whiteman!

Нужно переименовать файл.

BOOL MoveFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName
);

lpExistingFileName - существующее имя файла (c:games123.txt)
lpNewFileName - новое имя (c:games1230.txt)

странные у всех тут вопросы. как будто MSDN сделан не для всех
Ответ отправил: Jekyll (статус: 1-ый класс)
Ответ отправлен: 18.09.2006, 13:46

Отвечает: mix_mix
Здравствуйте, Whiteman!
Если Вы не умеете работать со строками, то могу немного помочь:
1. Определить длинну строки.
2. Найти в строке последний слеш.
3. Найти точку, запомнить ее местоположение.
4. Передвинуть строку вправо на 1 символ.
5. Поставить вместо бывшой точки Ваш символ.
З.Ы, Здесь обрабатывается ситуация, когда в имени файла присутствует несколько точек.

Приложение:

Ответ отправил: mix_mix (статус: 7-ой класс)
Ответ отправлен: 18.09.2006, 22:43


Вопрос № 55.873
Здравствуйте эксперты.
В чем разница у икзелиона в 12 уроке :
hMemory от pMemory
Спасибо.
Отправлен: 18.09.2006, 20:05
Вопрос задал: ENS (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: mix_mix
Здравствуйте, ENS!
HGLOBAL GlobalAlloc(
UINT uFlags,
SIZE_T dwBytes
);
Функция GlobalAlloc возвращает не адрес памяти, а дескриптор блока выделенной памяти, в кототром хранится размер выд. памяти и флаги (только к самой структуре получить доступ нельзя - она находится в kernel space).
LPVOID GlobalLock(
HGLOBAL hMem
);
А вот функция GlobalLock как раз возвращает адрес в памяти по заданному дескриптору блока.
Эти функции очень медленные (особенно в NT 5.0+ системах), они используются только для выделения динамической памяти (то есть когда размер выделенной памяти меняется), но для этих целей лучше использовать HeapXXX функции (но они тоже очень медленные, лучше использовать свой менеджер памяти).
В данном примере Iczelion просто показывал работу этих функций. Но никогда так не делайте! Лучшим вариантом в данной ситуации будут функции VirtualAlloc/VirtualFree.
Удачи!
Ответ отправил: mix_mix (статус: 7-ой класс)
Ответ отправлен: 18.09.2006, 22:22


Вопрос № 55.875
Здравствуйте эксперты.
Как узнать размер файла в вин 32.
Спасибо.
Отправлен: 18.09.2006, 20:06
Вопрос задал: ENS (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: mix_mix
Здравствуйте, ENS!
Есть замечательная функция GetFileSize:
DWORD GetFileSize(
HANDLE hFile,
LPDWORD lpFileSizeHigh
);
Первым параметром указывается хэндл открытого файла, вторым адрес двойного слова, куда поместится старшая часть quadword, если размер файла больше 4 Гб. В eax возвращается младшая часть quadword, также содержащая размер файла.
Короче, если не уверены, что размеры интересующих Вас файлов меньше 4 Гб, помещайте используйте второй параметр для получения старшей части, а если Вас не интересуют файлы больше 4 Гб, то помещайте во второй параметр ноль.
Ответ отправил: mix_mix (статус: 7-ой класс)
Ответ отправлен: 18.09.2006, 22:28

Отвечает: Jekyll
Здравствуйте, ENS!

просто:

DWORD GetFileSize(
HANDLE hFile,
LPDWORD lpFileSizeHigh
);

push hFile
lea eax,lpFileSizeHigh
push eax
call GetFileSize
Ответ отправил: Jekyll (статус: 1-ый класс)
Ответ отправлен: 19.09.2006, 17:02


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.36 от 06.09.2006
Яндекс Rambler's Top100

В избранное