в следующей секции, похож на
Код
// ассемблера, который показан в следующей секции, похож на тот,
// что генерирует компилятор.
// Разные методы оптимизации генерируют различный код.
// 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 ЕАХ // Поместить строку в стек.
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий