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


Манипуляции со строками - часть 3


MOV EDI , szDest // Установить целевую строку ng.

 MOV ЕСХ , iLen // Установить длину копирования.

// Копировать немедленно! 

REP MOVS BYTE PTR [EDI] , BYTE PTR [ESI]

 } 

}

int StrLEN (char * szSrc ) 

{

int iReturn ; _asm 

{

XOR EAX , EAX // Обнулить ЕАХ.

MOV EDI , szSrc // Поместить проверяемую строку в EDI.

 MOV ECX , 0FFFFFFFFh // Максимальное число проверяемых

// символов.

 REPNE SCAS BYTE PTR [EDI] // Сравнивать, пока ЕСХ не станет

// равным 0 или не будет найден конец 

// строки .

СМР ЕСХ ,0 // Если ЕСХ равен 0, то

 JE StrLEN_NoNull // в строке не был найден NULL. 

NOT ECX // Преобразовать ЕСХ в положительное число,

// поскольку он был просчитан.

DEC ЕСХ ' // Подсчет для Попадания на NULL. 

MOV EAX , ЕСХ // Возврат счета. 

JMP StrLen_Done .// Возврат. StrLENJNoNull:

MOV EAX , OFFFFFFFFh // Поскольку NULL не был найден,

И возвратить -1. 

StrLEN_Done: 

}

_asm MOV iReturn , EAX ;

 return ( iReturn ) ; 

}

void MemSET ( char * szDest , irit iVal , int iLen ) 

{  _asm

MOV EAX , iVal // EAX содержит полное значение.

 MOV EDI , szDest // Переместить строку в EDI.

 MOV ECX , iLen // Переместить счет в ЕСХ. 

REP STOS BYTE PTR [EDI] // Заполнить память. 

}

int MemCMP ( char * szMeml , char * szMem2 , int iLen )

 {

int iReturn ;

_asm

{

MOV ESI , szMeml // ESI содержит первый блок памяти.

 MOV EDI , szMem2 // EDI содержит второй блок памяти.

 MOV ECX , iLen // Максимальное число байт для сравнения

// Сравнить блоки памяти. 

REPE CMPS BYTE PTR. 

[ESI], BYTE PTR [EDI] 

JL MemCMP_LessThan // Если szSrc < szDest 

JG MemCMP_GreaterThan // Если szSrc > szDest

// Блоки памяти равны.

XOR EAX', EAX // Возвратить 0.

 JMP MemCMP_Done

MemCMP_Les sThan:

MOV EAX , 0FFFFFFFFh // Возвратить -1.

 JMP MemCMP_Done

 MemCMP_GreaterThan:

 MOV EAX , 1 // Возвратить 1.

JMP MemCMP_Done

 XemCMP_Done: 

}

_asm MOV iReturn , 

EAX return ( iReturn ) ;

}

 




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