Представив все важные части языка Intel-ассемблера, обратимся к полному примеру одной из API-функций операционных систем Win32. В листинге 6.2 показан полностью прокомментированный дизассемблерный код функции IstrcpyA из библиотеки KERNEL32.DLL пакета обслуживания Service Pack 4 операционной системы Windows NT 4. Функция IstrcpyA копирует одну строку в другую. Эту функция выбрана потому, что она показывает понемногу все, что обсуждалось до сих пор в этой главе, а также потому, что цель этой функции легко понять. Комментарии, выделенные точками с запятой, делают их настолько подробными, насколько это возможно.
Листинг 6-2. IstrcpyA- полный пример на языке ассемблера
; Прототип функции:
; LPTSTR Istrcpy ( LPTSTR IpStringl , LPCTSTR lpString2 )
IstrcpyA:
; Начать подготовку к установке SEH-кадра.
77F127E6: MOV EAX , ES:[00000000h]
; Установить регулярный кадр стека.
77F127EC: PUSH EBP
77F127ED: MOV EBP , ESP
; Продолжить установку SEH-кадра.
77F127EF: PUSH OFFh
77F127F1: PUSH 77F3CD48h
77F127F6: PUSH _except_handler3
77F127FB: PUSH EAX
77F127FC: MOV DWORD PTR FS:[00000000h] , ESP
; Сохранить 12 байтов для локальных переменных.
77F12803: SUB ESP , 00Ch
; Сохранить значения регистра, которые будут разрушены
; как часть этой функции
77F12806: PUSH EBX
77F12807: PUSH ESI
77F12808: PUSH EDI
Сохранить текущую вершину стека в локальной переменной.
Эта строка - также часть установки SEH.
7F12809: MOV DWORD PTR [EBP-018h] , ESP
Инициализировать эту локальную переменную к 0. Эта строка указывает,
что функция входит в блок _try.
77F1280C: MOV DWORD PTR [EBP-004h] , 00000000h
Первый шаг после установки должен получить длину строки
копирования. Строка копирования - второй параметр.
Переместить второй параметр (строку, которая будет скопирована) в EDI.
77F12813: MOV EDI , DWORD PTR [EBP+OOCh]
Istrcpy будет просматривать 4,294,967,295 байтов до NULL-терминатора.
EDX используется позже со значением -1, а здесь он инициализируется.
Помните, что REPNE SCAS использует регистр ЕСХ как счетчик цикла.