|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 7, 2004 16:09:20 Здравствуйте! У меня есть небольшой вопрос по работе со строками. (Очень понадобилось). Я формирую строку и поэтому не знаю, какое колличество символов в строке уже есть. Вопрос такой. Как из строки вида: C:\someth\*.txt преобразовать в: C:\someth\ Т.е. удалить четыре последних символа. Нужно обязательно реализовывать поиск по строке? (Сорсы привествуются ;) Заранее спасибо! 1990 |
|
|
Дата: Апр 7, 2004 17:02:03 · Поправил: PavPS Привет! когда я решал программу по "прогулке" по дереву каталогов и поиску файлов (помоему, такая же задача и перед тобой) приходилось пользоваться примерно следующим: Mov AL,ord("/") ; :) Mov ECX,Len_of_string Mov EDI,string_begin_pointer add edi,ecx dec edi std rep scasb mov byte ptr [edi],0 т.о. завершили строку нулем |
|
|
Дата: Апр 7, 2004 17:04:02 > Я формирую строку и поэтому не знаю, какое колличество символов в строке уже есть. lstrlen - рулит ;-) Но ещё ряд других функций, которые получают откуда-либо строку в eax возвращают длину. Поэтому читаем хотя бы справку по API, ну или MSDN. > Т.е. удалить четыре последних символа. mov edi, OFFSET szString invoke lstrlen, edi mov ecx, eax lea edi, [edi+eax-1] mov al, '\' std repne scasb mov BYTE PTR [edi+2], 0 |
|
|
Дата: Апр 7, 2004 17:21:49 Правка Asterix Кстати, а почему lstrlen маленькая (при дизассемблировании или отладке), а в сорцах crt кода раза в 3-4 больше? |
|
|
Дата: Апр 7, 2004 17:34:53 Большое спасибо за сорсы! Топерь быстрее дело пойдёт. Asterix lstrlen - рулит! IceStudent Да, вопрос интересный... |
|
|
Дата: Апр 7, 2004 17:39:30 · Поправил: PavPS Тема не моя, но позволю себе задать Всем вопрос: если разговор пошел об lstrlen, то почему она ищет конец строки: aaa: Mov CL,byte ptr [EAX] Inc EAX Test CL,CL JNZ aaa ???? неужели через "REP SCAS" не быстрее??? |
|
|
Дата: Апр 7, 2004 17:55:35 Asterix Можно тебе намылить один вопрос? Какой твой майл? (Если не сложно). 1990 |
|
|
Дата: Апр 7, 2004 18:09:35 PavPS Через REP короче, но не быстрее ;-) IceStudent Это свойственно CRT. Не удивлюсь, если в рантайме сначала проверяется не нулевой ли указатель на строку, устанавливается обработчик исключений на случай нечитабельности памяти и т.д. |
|
|
Дата: Апр 7, 2004 18:30:31 1990 Ну если ты немного разуешь глаза и найдёшь таки мой mail, то можешь написать мне письмо, и если твоё письмо всё-таки преодолеет те заградительные антиспамовые фильтры что я понаставил, то я отвечу на твой вопрос, если он конечно в моей компетенции ;-) |
|
|
Дата: Апр 7, 2004 18:43:35 Для win98 :-) _FREQASM:BFF773A9 ; int __stdcall lstrlenA(LPCSTR lpString) _FREQASM:BFF773A9 public lstrlenA _FREQASM:BFF773A9 lstrlenA proc near ; CODE XREF: sub_BFFB38B7+65p _FREQASM:BFF773A9 _FREQASM:BFF773A9 lpString = dword ptr 14h _FREQASM:BFF773A9 _FREQASM:BFF773A9 push ebx ; lstrlen _FREQASM:BFF773AA push esi _FREQASM:BFF773AB push edi _FREQASM:BFF773AC push ebp _FREQASM:BFF773AD push 0F1h _FREQASM:BFF773B2 push offset loc_BFFA1D67 _FREQASM:BFF773B7 push large dword ptr fs:0 _FREQASM:BFF773BE mov large fs:0, esp _FREQASM:BFF773C5 mov eax, esp _FREQASM:BFF773C7 push dword ptr [eax+20h] _FREQASM:BFF773CA call sub_BFF71170 _FREQASM:BFF773CF pop large dword ptr fs:0 _FREQASM:BFF773D6 add esp, 8 _FREQASM:BFF773D9 pop ebp _FREQASM:BFF773DA pop edi _FREQASM:BFF773DB pop esi _FREQASM:BFF773DC pop ebx _FREQASM:BFF773DD retn 4 _FREQASM:BFF773DD lstrlenA endp _FREQASM:BFF71170 sub_BFF71170 proc near ; CODE XREF: sub_BFF737E4+17p _FREQASM:BFF71170 ; sub_BFF73D99+45p ... _FREQASM:BFF71170 _FREQASM:BFF71170 arg_0 = dword ptr 8 _FREQASM:BFF71170 _FREQASM:BFF71170 push ebp _FREQASM:BFF71171 mov ebp, esp _FREQASM:BFF71173 push ecx _FREQASM:BFF71174 push edi _FREQASM:BFF71175 mov edi, [ebp+arg_0] _FREQASM:BFF71178 or ecx, 0FFFFFFFFh _FREQASM:BFF7117B xor eax, eax _FREQASM:BFF7117D cld _FREQASM:BFF7117E repne scasb _FREQASM:BFF71180 or eax, 0FFFFFFFEh _FREQASM:BFF71183 sub eax, ecx _FREQASM:BFF71185 pop edi _FREQASM:BFF71186 pop ecx _FREQASM:BFF71187 leave _FREQASM:BFF71188 retn 4 _FREQASM:BFF71188 sub_BFF71170 endp |
|
|
Дата: Апр 7, 2004 19:02:07 · Поправил: 1990 Asterix Ну, разуть глаза я не смог. дело вот в чём (если не хочешь по майлу) - у меня строка не собирается, после использования твоего кода... Подробнее - только сам сорс, поэтому про майл и спросил, может, думаю, подкинешь идею по восстановлению строки... |
|
|
Дата: Апр 7, 2004 19:17:53 Проблема не исчерпана! Asterix Кстати, а код этот оказывается вообще нерабочий. Так что не знаю что делать. Под w2k вызывает ошибку. Мыло мне твоё искать лень. ;) PavPS Под MASM скомпилировать не смог. Может быть как-то нужно видоизменить код? 1990 |
|
|
Дата: Апр 7, 2004 20:13:19 1990 Само-собой код я проверял, да и ошибиться тут невозможно ;-) Так что проблема в тебе, то бишь в твоём коде ;-) Возможно ты забыл перед использованием сохранить edi в стеке и потом соответственно его восстановить, угадал? > Мыло мне твоё искать лень. ;) Твоё личное дело.. |
|
|
Дата: Апр 7, 2004 20:18:35 Если всё-же захочешь написать, то в разделе "Инструменты" лежит пара моих поделок, там есть mail в архиве =) |
|
|
Дата: Апр 7, 2004 20:23:58 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.132 |