Выпад при передаче

Тема в разделе "WASM.ASSEMBLER", создана пользователем arrrg, 22 июл 2009.

  1. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Выложи код, только народ запутываешь.
     
  2. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    Код (Text):
    1. Stringscount proc data:DWORD,numberr:DWORD
    2.         mov eax,data
    3.         push (DataStruc ptr [eax]).ReciveDataBufferOffset
    4.         pop bufferdata1
    5.         push (DataStruc ptr [eax]).ReciveDataBuffer
    6.         pop ReciveDataBuffer1
    7.         mov stepp,0
    8.         xor eax,eax
    9.         mov counts,0
    10. returns:mov eax,bufferdata1
    11.         add eax,stepp
    12.         mov eax,[eax]
    13.         mov buffer100,eax
    14.         mov [buffer100+1],NULL
    15.         mov [buffer100+2],NULL
    16.        
    17.         mov eax,buffer100
    18.         .if eax==0Dh
    19.         inc stepp
    20.        
    21.         add counts,1
    22.         jmp returns
    23.         .endif
    24.        
    25.         mov eax,bufferdata1
    26.         add eax,stepp
    27.         mov eax,[eax]
    28.         mov buffer100,eax
    29.         mov [buffer100+1],NULL
    30.         mov [buffer100+2],NULL
    31.        
    32.         mov eax,buffer100
    33.         .if eax==NULL
    34.        
    35.         jmp do1
    36.        
    37.         .endif
    38.         inc stepp
    39.         jmp returns
    40. do1:                push counts
    41.         mov eax,numberr
    42.         pop [eax]
    43.     ret
    44. Stringscount endp
     
  3. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Забавно :derisive:

    Нельзя ли дойти до места останова в SoftIce (не Olly, раз Olly меняет картину), выписать значения регистров и точный дизасм этого куска (где авария)?
     
  4. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    ps Или в Olly сразу после загрузки поставить в это место BPM (Hardware, on Execution) и F9?
     
  5. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    в data Хранится указатель на структуру
     
  6. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Хм, где то я уже видел это. Наверное тут: http://wasm.ru/forum/viewtopic.php?id=33711

    Вобщем проблема похожа на топик выше, numberr содержит левую память.
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Чем кучу топиков создавать, роще прочитать http://wasm.ru/forum/viewtopic.php?id=32181
    Нужно:
    o Стек.
    o Контекст.
    o Код.
     
  8. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    как раз функция взята оттуда и переделана
     
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Вот как. Ты же 6opoDuJIo, глава секты!

    P.S. Выпад, видимо, происходит всё же в другом месте. Лол.
     
  10. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    ктобы я нибыл, это сути вопроса не меняет
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    arrrg
    Правильно ли я понимаю, что целью кода #22 является подсчет числа строк в неком буфере. Признак конца буфера - нуль-символ. Число строк определяется по числу символов с кодом 0Dh?

    1. Прежде чем идти по буферу в поисках его конца или 0Dh можно проверить действительно ли data.ReciveDataBufferOffset содержит допустимый адрес. Это можно сделать так
    Код (Text):
    1.     mov eax,data
    2.     push    -1
    3.     push    (DataStruc ptr [eax]).ReciveDataBufferOffset
    4.     call    IsBadReadStringPtr
    5.     or  eax,eax
    6.     jnz bad_string_ptr      ;; переход, т.к. недопустимый адрес
    2. Я сомневаюсь, что число символов в буфере кратно четырем и/или, что каждый символ в буфере занимает четыре байта, поэтому команда mov eax,[eax] выглядит подозрительно. Сканировать буфер можно так
    Код (Text):
    1.     mov eax,data
    2.     mov eax,(DataStruc ptr [eax]).ReciveDataBufferOffset
    3.  
    4.     xor ecx,ecx         ;; для полсчета числа строк
    5.     xor edx,edx         ;; для накапливания длины очередной строки,
    6.                     ;;  чтобы учесть случай, если после последней
    7.                     ;;  строки не будет 0Dh
    8.  
    9. next_char:
    10.     cmp byte ptr [eax],0
    11.     jz  eob_found       ;; переход, т.к. достигли конца буфера
    12.     cmp byte ptr [eax],0Dh
    13.     jz  eol_found       ;; переход, т.к. найден конец строки
    14.     add eax,1
    15.     add edx,1
    16.     jmp short next_char
    17.  
    18. eol_found:
    19.     xor edx,edx
    20.     add eax,1
    21.     add ecx,1
    22.     cmp byte ptr [eax],0Ah
    23.     jnz short next_char
    24.     add eax,1
    25.     jmp short next_char
    26.  
    27. eob_found:
    28.     or  edx,edx
    29.     jz  short @F
    30.     inc ecx
    31. @@:
    32. ;; теперь в ECX количество строк в буфере
    3. Что касается возврата количества строк, судя по
    Код (Text):
    1. counts  dd  0
    2. ...
    3.     invoke  Stringscount, offset Data, offset counts
    4. ...
    5. Stringscount proc data:DWORD,numberr:DWORD
    6. ...
    7.     push    counts
    8.     mov eax,numberr
    9.     pop [eax]
    проблем быть не должно.

    Непонятно, почему ты не используешь локальные переменные в подпрограммах?
     
  12. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    правильно
    я сам знаю, есть процедура, которая возвращает своё значение на указатель аналогично.
    были такие-же проблемы, но в последствии пропали, почему, я так и не успел понять