Привет всем. Смотрел по инету примеров куча и многие из них хорошие, только вот на scasd не все богаты в общем накатал во: Код (Text): cld mov edi, [buffer] mov ecx, 4096 mov eax, 13101310 repe scasd mov eax, edi sub eax, [buffer] Не совсем понятно, по идеи один проход scasd инкрементирует edi и в результате выполнения кода мы получаем кол-во символов до искомой комбинации, ведь так? И в eax хочу отправить db 13, 10, 13, 10 тока сдается будет это записано не так как я вписал
Код (Text): cld mov edi, [buffer] mov ecx, 4096 mov eax, 0D0A0D0Ah repe scasd ;пока равно? Вы уверены lea eax, [edi-buffer] sub eax, [buffer]
fasm ругается... Не не уверен. наверно repne Что то вообще бред какой-то получается, я такой буфер не выделяю, что бы такие результаты получались...
Код (Text): cld ; задали порядок от начала к концу (инкремент) mov edi, buffer ; взяли указатель на буфер mov ecx, 4096 ; длина буфера (повторений) mov eax, 0D0A0D0Ah ; искомая подстрока repe scasd ; пока равно ищем не соответствующий кусок lea eax, [edi-buffer] ; вычисляем позицию в буфере + 4 по поводу: FASM ругается - весь код пожалуйста (желательно файлом)
MSoft скорее всего он надеется что это реагирует на совпадение хотя бы одного байта. т.е. данные находятся кратно 2 байтам. и насчет очепятки. как раз нет repe scasd - порторять пока установлен zf сравнивать eax и [es:edi] и увеличивать edi на 4 т.е. остановиться при не соответствии repne scasd - порторять пока сброшен zf сравнивать eax и [es:edi] и увеличивать edi на 4 т.е. остановиться при соответствии
max7C4 Очередное доказательство того, что FASM - гуано. Мне очччень интересно посмотреть как будет работать DLL с таким кодом. Ты хочеш сказать что FASM это разложит на: lea eax, [eax*8+eax+(-999)] ? Жаль jaja забанили, он бы про FASM ещё и не такое рассказал
Код (Text): proc GetHeaderLenght buffer cld mov edi, [buffer] mov ecx, 1024 ; Исправил mov eax, 0A0D0A0Dh repne scasd ; А вот самое интересное, адрес комбинации которую ; я ищу не кратен 4 по отношению адреса buffer ;lea eax, [edi-buffer] Херов тут так будет понимать mov eax, edi sub eax, [buffer] ret endp А scasd инкрементирует edi или делает add edi, 4 ?
Короче вот: Код (Text): proc GetHeaderLenght buffer cld mov edi, [buffer] mov ecx, 4096 mov eax, 0A0D0A0Dh .find$0D: repne scasb cmp ecx, 3 jb .notFound cmp [edi-1], eax jne .find$0D add edi, 3 .exit: mov eax, edi sub eax, [buffer] ret .notFound: lea edi, [edi+ecx] jmp .exit endp Все решено, всем спасибо...
MirrorBlack Обалдеть. Очевидные преимущества FASM'а умудряться выставить, как недостатки. Да. Понимает. Какие проблемы? Разумеется, что buffer не должен быть локальной переменной. И в dll понимает. И опять-таки, очевидно, что только в том случае, если dll не имеет релоков. Иначе будет выдана ошибка компиляции. И уж точно MASM'у это далеко не в плюс, если ему ума не хватает скомпилировать элементарнейшую конструкцию, необходимость в которой лично у меня не один и не два раза возникала.
MirrorBlack Да. Именно так он и сделает для конструкции вида, например, lea eax, [eax*9-buffer]. Очередной плюс FASM'у.