acess violation при записи в локальную переменную

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

  1. arrrg

    arrrg New Member

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

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    упс.имелось ввиду "так-же,как это можно сделать в TASM"
     
  3. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    хм...насколько я понял отсюда (http://msdn.microsoft.com/en-us/library/aa366549(VS.85).aspx) нужно зарезервировать и разблокировать новую страницу памяти и полученный указатель поместит в esp,после окончания работы esp вернуть на место,так?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Да, это та ф-ия, о которой я говорил. Вопрос в том, как посчитать количество байт, требуемой для локальных переменных (это число надо передать в eax для alloca_probe). Я, честно говоря, не знаю как сделать это автоматизировано в TASM'е :). Ну и важно чтобы в эпилоге ф-ии шла инструкция leave (это позволит автоматически почистить место, выделяемое под локальные переменные).
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    http://www.wasm.ru/forum/viewtopic.php?id=13084
     
  6. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    увеличение стёка параметрами линкера,в def файле и директивой .stack не помогло...
     
  7. arrrg

    arrrg New Member

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

    arrrg New Member

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

    arrrg New Member

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

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В чем проблема поменять код пролога?
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Хммм... Глобальные переменные -- не очень хорошо для структурирования + дополнительные сложности в синхронизации, т.к. приложение многопоточное.
     
  12. arrrg

    arrrg New Member

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

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    код пролога загоняет стёк чёрт знает куда.поэтому значение в esp неверное,и сделать со стёком ничего нельзя..что делать?

    //пролог
    ebx = esp
    esp = VirtualAlloc
    push ebx
    push ebp
    mov ebp, esp
    sub esp, .....


    //эпилог
    leave
    pop ebx
    mov esp, ebx
     
  14. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    push PAGE_READWRITE
    push MEM_COMMIT
    push new_stack_size
    push 0
    call [VirtualAlloc]

    xchg esp, eax
    push eax

    push ebp
    mov ebp, esp
    sub esp, __LOCAL_SIZE

    //.....тут кодес...//

    leave
    pop eax
    xchg esp, eax
    push MEM_RELEASE
    push 0
    push eax
    call [VirtualFree]
     
  15. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Нафига если не секрет?
    Написали же ответ на предыдущей странице.
    Что так трудно при выделении больших локальных переменных выполнить чтение из каждой страницы в направлении меньших адресов?
    Типа
    Код (Text):
    1.     push ebp
    2.     mov  ebp, esp
    3.     sub  esp, locals_size
    4.     mov  eax, ebp
    5. probe:
    6.     mov  ecx, [eax]
    7.     sub   eax, 1000h
    8.     cmp  eax, esp
    9.     jae   probe
     
  16. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    TermoSINteZ
    arrrg
    Mika0x65

    товарищи если вы про локальные переменные то афаик они в стеке поэтому в отладчике должно быть:
    ...
    sub ESP,N
    ...
    mov [EBP+M],EAX

    ну а если глобальные что что у вас в DS загружено ???
     
  17. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    тут эпилог намного занятнее пролога ....
    да и в прологе вместо локальных переменных походу юзаются передаваемые параметры...

    вобщем вы б для начала этот фрагментик переписали бы почеловечески а уж потом добавляли что либо