Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





При нажатии кнопки copy strings with ASM PROC строки копируются с помощью внешней процедуры на ассемблере copystr.
Процедура copystr довольно проста и использует для копирования практически ОДНУ команду rep movsb.
Для анализа процедуры копирования с использованием только языка С + + проведем отладку приложения. Напомним себе, что мы будем анализировать следующий фрагмент кода в обработчике нажатия кнопки Copy Strings with С++ .NET!
int srcLen = sizeof(src);
for (int cnt = 0; cnt < srcLen; cnt++)
dst[cnt] = src[cnt];
Код, сгенерированный отладчиком для С++-варианта, приведен в листинге 3.61.
Листинг 3.61. Ассемблерный код обработчика из листинга 3.58
char src[25] = "NET VARIANT FOR COPYING!";
00413678 mov есх, 6
0041367D mov esi,offset string "NET VARIANT FOR COPYING!" (4235F8h)
00413682 lea edi,[src]
00413685 rep movs dword ptr [edi],dword ptr [esi]
00413687 movs byte ptr [edi],byte ptr [esi]
char dst[25] ;
int srcLen = sizeof(src);
00413688 mov dword ptr [srcLen],19h
for (int cnt = 0;cnt < srcLen;cnt++)
0041368F mov dword ptr [cnt],0
00413696 jmp CCOPYSTRINGCNETD:|7::OnBnClickedButtonl+61h (4136Alh)
00413698 mov eax,dword ptr [cnt]
0041369B add eax,1
0041369E mov dword ptr [cnt],eax
004136A1 mov eax,dword ptr [cnt]
004136A4 cmp eax,dword ptr [srcLen]
004136A7 jge CCOPYSTRINGCNETDlg::OnBnClickedButtonl + 79h (4136B9h)
dst[cnt]
004136A9 mov
004136AC mov
004136AF mov
004136B3 mov
004136B7 jmp
src[cnt];
eax,dword ptr [cn+]
ecx,dword ptr [cnt]
dl,byte ptr src[ecx]
byte ptr dst[eax],dl
CCOPYSTRINGCNETDlg::OnBnClickedButtonl+58h !413698h)
cSrc = (CString)src;
004136В9 lea еах,[src]
004136ВС push еах
004136BD lea есх,[ebp-140h]
004136СЗ call ATL::CStringTXchar,StrTraitMFC
> >::CStringT > > (4118C0h)
004136C8 mov dword ptr [ebp-154h],eax
004136CE mov ecx,dword ptr [ebp-154h]
004136D4 mov dword ptr [ebp-158h],ecx
004136DA mov dword ptr [ebp-4],0
004136E1 mov edx,dword ptr [ebp-158h]
004136E7 push edx
004136E8 mov ecx,dword ptr [this]
004136EB add ecx,78h
004136EE call ATL::CStringT
> >::operator= (411983h)
004136F3 mov dword ptr [ebp-4],OFFFFFFFFh
004136FA lea ecx, [ebp-140h]
00413700 call ATL::CStringT
> >: : ~CStringT > > (41119t)h) cDst = (CString)dst;
00413705 lea eax,[dst]
00413708 push eax
00413709 lea ecx,[ebp-14Ch]
0041370F call ATL::CStringT > >::CStringT > > (4118C0h) 00413714 mov dword ptr [ebp-154h],eax
0041371A mov ecx,dword ptr [ebp-154h]
00413720 mov dword ptr [ebp-158h],ecx
00413726 mov dword ptr [ebp-4],1
0041372D mov edx,dword ptr [ebp-158h]
00413733 push edx
00413734 mov ecx,dword ptr [this]
00413737 add ecx,7Ch
0041373A call ATL::CStringT > >::operator= (411983h)
0041373F mov dword ptr [ebp-4],OFFFFFFFFh
00413746 lea ecx,[ebp-14Ch]
0041374C call ATL::CStringT > >: : ~CStringT > > (411190h)
UpdateData(FALSE);
push О
00413753 mov ecx,dword ptr [this]
00413756 call CWnd::UpdateData (4111AEh)

В дезассемблированном листинге наибольший интерес представляет фрагмент кода, выполняющий процедуру копирования строк в цикле for (листинг 3.62).
Листинг 3.62. Фрагмент кода на ассемблере, соответствующий циклу for int srcLen = sizeof(src);
00413688 mov dword ptr [srcLen], 19h
for (int cnt = 0;cnt < srcLen;cnt++)
0041368F mov dword ptr [cnt],0
00413696 jmp CCOPYSTRINGCNETDlg::OnBnClickedButtonl+61h (4136Alh)
00413698 mov eax,dword ptr [cnt]
0041369B add eax,1
0041369E mov dword ptr [cnt],eax
004136A1 mov eax,dword ptr [cnt]
004136A4 cmp eax,dword ptr [srcLen]
004136A7 jge CCOPYSTRINGCNETDlg::OnBnClickedButtonl+7 9h (4136B9h) dst[cnt]
004136A9 mov
004136AC mov
004136AF mov
004136B3 mov
004136B7 jmp
src[cnt];
eax,dword ptr [cnt]
ecx,dword ptr [cnt]
dl,byte ptr src[ecx]
byte ptr dst[eax],dl
CCOPYSTRINGCNETDlg::OnBnClickedButtonl+58h (413698h)


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru