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

       

Циклы


  •  LOOP цикл по счетчику ЕСХ

Нельзя слишком сосредотачиваться на инструкции LOOP, потому что компиляторы Microsoft генерируют их не так много. Однако в некоторых частях ядра операционной системы (которые выглядят так, как если бы разработчики Microsoft написали их на языке ассемблера) их иногда можно увидеть. Применять инструкцию LOOP довольно просто. Установите ЕСХ равным числу шагов цикла, и затем выполните блок кода. Сразу после блока кода разместите инструкцию LOOP. Если ЕСХ не равен нулю, то она выполнит декремент ЕСХ и затем перейдет к вершине блока. Когда ЕСХ достигает нуля, инструкция LOOP пропускается (и выполняется следующая за ней инструкция).

Большинство циклов, представленных ниже, являются комбинациями условных и абсолютных переходов. Во многих отношениях эти циклы выглядят как оператор if, код которого рассмотрен в предыдущем фрагменте, за исключением того, что основанием if-блока является инструкция JMP, выполняющая обратный переход к вершине блока. Следующий пример содержит код цикла.

void LoopingExample ( int q )

 {

// С-код:

// for ( ; q < 10 ; q++ )

// {

// printf ( "q = %d\n" , q ) ;

// }

char szEmt[] = "q = %d\n" ;

_asm

{

JMP LE_CompareStep // При первом проходе выполнить

// прямую проверку 10. 

LE_IncrementStep:

INC q // Инкремент q. 

LE_CompareStep:

CMP q , OAh // Сравнить q с 10.

JGE LE_End // Если q >= 10, эта функция выполнена.

MOV ЕСХ , DWORD PTR [q] // Переместить значение q в ЕСХ.

PUSH ЕСХ // Поместить значение в стек.

LEA ЕСХ , szFmt // Получить форматную строку.

PUSH ЕСХ // Поместить форматную строку в стек.

CALL DWORD PTR [printf] // Напечатать текущую итерацию.

ADD ESP , 8 // Очистить стек.

JMP LE_IncrementStep // Инкремент q, и начать сначала.

 LE_End: // Цикл выполнен.

}



Содержание раздела