Отладка приложений


Доступ к параметрам, глобальным и локальным переменным - часть 2


При работе с оптимизированным кодом нужно сохранять след элементов, помещаемых в стек, потому что ссылка [ESP+20H] в этой функции может быть такой же, как и предыдущая [ESP+SH]. В процессе отладки, при выполнении пошагового прохода через операции языка ассемблера оптимизированного кода, всегда можно заметить, где расположены параметры. Если используются стандартные кадры, локальные переменные имеют отрицательные смещения от ЕВР. Как показано в предыдущем разделе, инструкция SUB резервирует место в стеке. Следующий код содержит пример установки нового значения в локальной переменной:

void AccessLocalVariable ( void ) 

{

int iLocal ;

_asm

{

// Установить в локальную переменную значение 23. 

MOV iLocal ,'017h

// Если символы загружены, окно Disassembly покажет 

// MOV DWORD PTR [iLocal],017h.

// Если символы не загружены, окно Disassembly покажет

 // MOV [EBP-4],017h. 

}

 }

Если стандартные кадры не используются, то поиск локальных переменных может быть затруднен (если их вообще можно найти). Проблема состоит в том, что локальные переменные появляются как положительные смещения от ESP, точно так же, как и параметры. В этом случае нужно попробовать так подобрать инструкцию SUB, чтобы увидеть, сколько байт отведено под локальные переменные. Если смещение ESP больше, чем число байт, отведенных под локальные переменные, то эта ссылка, вероятно, указывает на параметр.

Стековые кадры немного сбивают с толку тех, кто первый раз с ними сталкивается, поэтому приведем заключительный пример, разъясняющий предмет. Следующий код — очень простая С-функция, показывающая, почему параметры имеют положительное смещение от ЕВР, а локальные переменные — отрицательное (для стандартных кадров стека). После С-функции приведен ее код дизассемблера (в том виде, в котором он был откомпилирован программой ASMer).

void AccessLocalsAndParamsExample ( int * pParaml , int * pParam2 } 

{

int iLocal1 = 3 ;

int iLocal2 = 0x42 ;

iLocal1 = *pParaml ;




Начало  Назад  Вперед