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


Полный пример - часть 2


 77F12816: MOV EDX , FFFFFFFFh

 77F1281B: MOV ЕСХ , EDX

; Обнуление EAX, так что SCAS будет искать символ NULL. 

77F1281D: SUB EAX , EAX ; Поиск символа NULL.

77F1281F: REPNE SCAS BYTE PTR [EDI]

; Поскольку ЕСХ считает в обратном направлении, переключить все биты так, 

; чтобы длина строки оказалась в ЕСХ. Эта длина включает символ NULL.

 77F12821: NOT ЕСХ

;Поскольку REPNE SCAS инкрементирует также и EDI, вычесть длину строки

;из EDI так, чтобы EDI указывал обратно, на начало строки.

 77F12823: SUB EDI , ЕСХ

Держать длину строки в ЕАХ. 

77F12825: MOV ЕАХ , ЕСХ

;Переместить второй параметр в ESI, т.к. ESI является исходным

;операндом строчных инструкций.

77F12827: MOV ESI , EDI

;Переместить первый параметр (целевую строку) в EDI. 

77F12829: MOV EDI , DWORD PTR [EBP+008h]

;Длина строки была подсчитана в байтах. Делите длину строки на 4,

;чтобы получить число двойных слов (DWORDS). Если число символов

;нечетное, REPE MOVS не будет копировать их всех.

;Любые остающиеся байты

;копируются прямо после REPE MOVS. 

77F1282C: shr ЕСХ , 002h

;Копировать строку второго параметра в строку первого. 

77F1282F: REPE MOVS DWORD PTR [EDI] , DWORD PTR [ESI]

;Переместить сохраненную длину строки в ЕСХ. 

77F12831: MOV ЕСХ , ЕАХ

;Операция AND счетчика с числом 3, чтобы получить

;остающиеся байты для копирования 

77F12833: AND ЕСХ , 00Зh

;Копировать остающиеся байты из строки в строку.

 77F12836: REPE MOVS BYTE PTR [EDI] , BYTE PTR [ESI]

Istrcpy возвращает первый параметр, поэтому переместить

;возвращаемое значение в ЕАХ 

77F12838: MOV ЕАХ , DWORD PTR [EBP+008h]

;Установить локальную переменную в -1, указывая, что функция

;покидает этот блок try/except. 

77F1283B: MOV DWORD PTR [EBP-004h] , EDX

;Функция завершена; выйдите и переместитесь домой. 

77F1283E: JMP 77F12852h

;Если вы просмотрите эту функцию, то заметите, что фактически нет

;инструкции, которая переходит или ветвится по адресу 0x77F12840.


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