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

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

  1. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    кодес
    Код (Text):
    1. LOCAL _port:DWORD
    2. mov _port,24863
    на второй строке почемуто acess violation when writing
    тожесамое при обращении к глобальным переменным
    почему-непонятно
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я, например, не телепат, поэтому хотелось бы больше кода, а также узнать, как все это выглядит в отладчике.
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    arrrg
    а где они (глобальные переменные) расположены? в секции .data или в секции .code?
    хотя LOCAL обычно в стеке создаются...
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    mov [_port],24863
    думаю так гуманнее.
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    а так
    mov [_port],31337
    не только гуманнее, но ещё и круче
     
  6. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    глобальные переменные расположена в секции .data
    Код (Text):
    1. а так
    2. mov [_port],31337
    3. не только гуманнее, но ещё и круче
    интересно в чём заключается "крутизна"
    Код (Text):
    1. Я, например, не телепат, поэтому хотелось бы больше кода, а также узнать, как все это выглядит в отладчике.
    забавно,при чём тут может быть остальной код?
     
  7. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    заодно - при использовании
    LOCAL _port:lol: WORD
    mov [_port],24863
    я всёравно получу acess violation по томуже адресу,т.к. квадратные скобки дают указание что из этого операнда вытащить значение и использовать как указатель,т.е. всёравно придётся обращатся к _port
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Секция права на запись имеет?

    При том, что понять по двум строчкам, что происходит я, например, не берусь. Неизвестно даже, что за ассемблер используется.
     
  9. arrrg

    arrrg New Member

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

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ок, будем гадать:

    1. Изменялось ли явно значение esp?
    2. Есть ли среди локальных переменных большие массивы? Не превышает ли общий объем локальных переменных четыре килобайта?
    3. Использовалась ли рекурсия, или что-то, что может исчерпать стек?
    4. Программа однопоточная?
     
  11. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    Код (Text):
    1. push ebp
    2. mov ebp,esp
    3. add esp,FFFFa1a8
    4. mov dword ptr SS:[EBP+FFFFFa1a8],611F
    вид в отладчике
     
  12. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    программа многопоточная,(сама процедура вызывается из потока,при этом все остальные процедуры,вызываемые из других и этогоже потока,работают нормально)
    локальных переменных 3 штуки,одна из них - это _port,остальные - это две небольших стрктуры.рекурсия не используется
    явно значение esp не меняет ниодна строка в коде
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    С этого и надо было начинать. esp уменьшается более чем на страницу, т.е. обходит GUARD_PAGE и стек не растет. Чтобы этого не происходило, в пролог следует написать маленький кусок кода, который читает GUARD_PAGE. Или вызвать готовую процедуру _alloca_probe (библиотеку не помню :dntknw: ).
     
  14. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    23+кб для стека, круто, точно e1337
     
  15. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    что есть GUARD_PAGE?))
     
  16. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Стек существует и растет примерно таким образом: первоначально под стек резервируется (MEM_RESERVE) M байт, и выделяется (MEM_COMMIT) N байт. В случае загрузки исполняемого, значения берутся из IMAGE_OPTIONAL_HEADER. За подтвержденными страницами идет следует страница со статусом PAGE_GUARD (http://msdn.microsoft.com/en-us/library/aa366549%28VS.85%29.aspx). Когда стек выходит за пределы выделенной памяти и натыкается на PAGE_GUARD, происходит исключение и страница выделяется, а следующая страница получает атрибут PAGE_GUARD. Но если перепрыгнуть PAGE_GUARD, то ОС не поймет, что это было в стеке и произойдет исключение. Компилятор (MS VC), видя что данные в стеке занимают более одной страницы, вставляет в пролог ф-ии вызов _alloca_probe, которая просто читает DWORD, продвигаясь вниз на столько страниц, сколько потребуется. Вот еще немного о стеке: http://msdn.microsoft.com/en-us/library/ms686774%28VS.85%29.aspx

    Ну, а на ассемблере надо все самим делать :).
     
  17. arrrg

    arrrg New Member

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

    arrrg New Member

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

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    эм,какбы нагуглил кодес
    Код (Text):
    1. 004022B0   push        ecx
    2. 004022B1   cmp         eax,1000h
    3. 004022B6   lea         ecx,[esp+8]
    4. 004022BA   jb          lastpage (004022d0)
    5. probepages:
    6. 004022BC   sub         ecx,1000h
    7. 004022C2   sub         eax,1000h
    8. 004022C7   test        dword ptr [ecx],eax
    9. 004022C9   cmp         eax,1000h
    10. 004022CE   jae         probepages (004022bc)
    11. lastpage:
    12. 004022D0   sub         ecx,eax
    13. 004022D2   mov         eax,esp
    14. 004022D4   test        dword ptr [ecx],eax
    15. 004022D6   mov         esp,ecx
    16. 004022D8   mov         ecx,dword ptr [eax]
    17. 004022DA   mov         eax,dword ptr [eax+4]
    18. 004022DD   push        eax
    19. 004022DE   ret
    он самый?)
     
  20. arrrg

    arrrg New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2009
    Сообщения:
    124
    хм.и вот что странно
    _alloca_probe вродебы должна находится в ntdll.dll,но... в lib файлах от masm32 этого нету
    линк http://xosmos.net/txt/ntdll.html