и регистров, как показано на
iLocal2 = *pParam2 ;
}
// Дизассемблерный код AccessLocalsAndParamsExample
//с адресами стандартного пролога функции
00401097 PUSH EBP
00401098 MOV EBP , ESP
0040109A SUB ESP , 8
// int iLocal1 = 3 ;
0040109D MOV DWORD PTR [EBP-8h] , 3
// int iLocal2 = 0x42 ;
004010A4 MOV DWORD PTR [EBP-4h] , 42h
// iLocal1 = *pParaml ;
004010AB MOV EAX , DWORD PTR [EBP+8h]
004010AE MOV ECX , DWORD PTR [EAX]
004010BO MOV DWORD PTR [EBP-08h] , ECX
// iLocal2 = *pParam2 ;
004010B3 MOV EDX , DWORD PTR [EBP+OCh]
004010B6 MOV EAX , DWORD PTR [EDX]
004010B8 MOV DWORD PTR [EBP-4h] , EAX
// Стандартный эпилог функции
004010BB MOV ESP , EBP
004010BD POP EBP
004010BE RET
}
Если точка прерывания устанавливается в начале функции AccessLocalsAndParamsExample (по адресу 0x00401097), то будут отображены
значения стека и регистров, как показано на рис. 6.2.
Рис. 6.2. Стек перед прологом функции AccessLocalsAndParamsExample
Первые три инструкции языка ассемблера в AccessLocalsAndParamsExaraple
составляют пролог функции. После выполнения пролога устанавливаются указатели стека (ESP) и базы (ЕВР), доступ к параметрам выполняется через положительные смещения от ЕВР, а к локальным переменным — через отрицательные смещения от ЕВР. На рис. 6.3 показаны значения указателей стека и базы после выполнения каждой инструкции пролога.
Рис. 6.3. Стек в течение и после выполнения пролога функции AccessLocalsAndParamsExample
Содержание Назад Вперед