Код (Text): Stringscount proc data:DWORD,numberr:DWORD mov eax,data push (DataStruc ptr [eax]).ReciveDataBufferOffset pop bufferdata1 push (DataStruc ptr [eax]).ReciveDataBuffer pop ReciveDataBuffer1 mov stepp,0 xor eax,eax mov counts,0 returns:mov eax,bufferdata1 add eax,stepp mov eax,[eax] mov buffer100,eax mov [buffer100+1],NULL mov [buffer100+2],NULL mov eax,buffer100 .if eax==0Dh inc stepp add counts,1 jmp returns .endif mov eax,bufferdata1 add eax,stepp mov eax,[eax] mov buffer100,eax mov [buffer100+1],NULL mov [buffer100+2],NULL mov eax,buffer100 .if eax==NULL jmp do1 .endif inc stepp jmp returns do1: push counts mov eax,numberr pop [eax] ret Stringscount endp
Забавно Нельзя ли дойти до места останова в SoftIce (не Olly, раз Olly меняет картину), выписать значения регистров и точный дизасм этого куска (где авария)?
Хм, где то я уже видел это. Наверное тут: http://wasm.ru/forum/viewtopic.php?id=33711 Вобщем проблема похожа на топик выше, numberr содержит левую память.
Чем кучу топиков создавать, роще прочитать http://wasm.ru/forum/viewtopic.php?id=32181 Нужно: o Стек. o Контекст. o Код.
arrrg Правильно ли я понимаю, что целью кода #22 является подсчет числа строк в неком буфере. Признак конца буфера - нуль-символ. Число строк определяется по числу символов с кодом 0Dh? 1. Прежде чем идти по буферу в поисках его конца или 0Dh можно проверить действительно ли data.ReciveDataBufferOffset содержит допустимый адрес. Это можно сделать так Код (Text): mov eax,data push -1 push (DataStruc ptr [eax]).ReciveDataBufferOffset call IsBadReadStringPtr or eax,eax jnz bad_string_ptr ;; переход, т.к. недопустимый адрес 2. Я сомневаюсь, что число символов в буфере кратно четырем и/или, что каждый символ в буфере занимает четыре байта, поэтому команда mov eax,[eax] выглядит подозрительно. Сканировать буфер можно так Код (Text): mov eax,data mov eax,(DataStruc ptr [eax]).ReciveDataBufferOffset xor ecx,ecx ;; для полсчета числа строк xor edx,edx ;; для накапливания длины очередной строки, ;; чтобы учесть случай, если после последней ;; строки не будет 0Dh next_char: cmp byte ptr [eax],0 jz eob_found ;; переход, т.к. достигли конца буфера cmp byte ptr [eax],0Dh jz eol_found ;; переход, т.к. найден конец строки add eax,1 add edx,1 jmp short next_char eol_found: xor edx,edx add eax,1 add ecx,1 cmp byte ptr [eax],0Ah jnz short next_char add eax,1 jmp short next_char eob_found: or edx,edx jz short @F inc ecx @@: ;; теперь в ECX количество строк в буфере 3. Что касается возврата количества строк, судя по Код (Text): counts dd 0 ... invoke Stringscount, offset Data, offset counts ... Stringscount proc data:DWORD,numberr:DWORD ... push counts mov eax,numberr pop [eax] проблем быть не должно. Непонятно, почему ты не используешь локальные переменные в подпрограммах?
правильно я сам знаю, есть процедура, которая возвращает своё значение на указатель аналогично. были такие-же проблемы, но в последствии пропали, почему, я так и не успел понять