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


         

в следующей секции, похож на


Код

// ассемблера, который показан в следующей секции, похож на тот,

// что генерирует компилятор.

// Разные методы оптимизации генерируют различный код.

// if ( i > 0 )

// {

// printf ( "i > 0\n" ) ;

// }

char szGreaterThan[] = "i > 0\n" ;

_asm

{

CMP i , 0 // Сравнить i с 0 вычитанием (i - 0).

 JLE JE_LessThanOne // Если i меньше чем или равно 0, перейти

// к метке.

PUSH i // Поместить параметр в стек. 

LEA ЕАХ , szGreaterThan // Поместить в стек форматную строку. 

PUSH ЕАХ CALL DWORD PTR [printf] // Вызвать printf. Заметьте, что printf,

// вероятно, приходит из DLL, потому что

// вызов выполняется через указатель.

ADD ESP ,8 // для printf действует соглашение _cdecl, 

поэтому

// нужно очистить стек в вызывающей

// программе.

 JE_LessThanOne: //Во встроенном ассемблере можно

// перейти к любой С-метке.

}

////////////////////////////////////////////////////////////////////

// Взять абсолютное значение параметра и снова проверить.

// С-код:

// int у = abs ( i ) ;

// if. ( у >=5 )

// {

// printf ( "abs(i) >= 5\n" ) ;

// }

// else 

// {

// printf ( "abs(i) < 5\n" ) ;

// }

char szAbsGTEFive [] = "abs(i) >= 5\n" ; 

char szAbsLTFive[] = "abs(i) < 5\n" ;

 _asm 

{

MOV EBX , i // Переместить значение i в ЕВХ. 

СМР ЕВХ , 0 // Сравнить ЕВХ с 0 (ЕВХ - 0). 

JG JE_PosNum // Если результат больше 0, то ЕВХ 

// содержит положительное значение.

NEG ЕВХ // Преобразовать отрицательное в положительное. 

JE_PosNum:

СМР ЕВХ , 5 // Сравнить ЕВХ с 5 (ЕВХ - 5).

JL JE_LessThan5 // Переход, если меньше 5.

LEA ЕАХ , szAbsGTEFive // Получить в ЕАХ указатель на правильную

// форматную строку.

JMP JE_DoPrintf // Перейти к вызову printf. 

JE_LessThan5:

LEA ЕАХ , szAbsLTFive // Получить в ЕАХ указатель на правильную

// форматную строку.

 JE_DoPrintf:

PUSH ЕАХ // Поместить строку в стек. 


Содержание  Назад  Вперед