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





Сравните дизассемблированный фрагмент кода, вычисляющего максимум, и
функцию findMax в ассемблерном варианте программы. Даже беглого
взгляда достаточно, чтобы понять избыточность второго варианта. Прежде
чем проанализировать дизассемблированный код, рассмотрим еще один
пример — сортировку массива целых чисел по убыванию.
Это приложение также использует диалоговое окно и два поля редактирования.
В одно поле редактирования будет выводиться исходный (неупорядоченный)
массив целых чисел, в другом поле можно будет видеть
тот же массив, но упорядоченный по убыванию. Сортировку массива выполняет
функция sortMax, принимающая в качестве параметров адрес
массива и его размер.. Программные элементы обработчика нажатия
кнопки во многом схожи с программным кодом предыдущих примеров, и
останавливаться на них мы не будем. Программный код функции sort-
Max и обработчика кнопки, в котором вызывается эта функция, приведен
в листинге 6.45.
Листинг 6.45. Фрагменты программы, в которых выполняется сортировка и вывод результата на экран
void CSortarraybyMaximumDlg::sortMax(int* pil, int sil)
{
int isize = sil;
_asm {
push EBX
mov EDI, DWORD PTR pil
mov EBX, EDI
big_loop:
mov ECX, DWORD PTR
mov EAX, [EDI]
next:
mov EAX, [EDI]
cmp EAX, [EDI+4]
jl change
512 Гпава 6
jmp cont
change:
xchg EAX, [EDI+4]
mov [EDI], EAX
cont:
add EDI, 4
loop next
dec isize
cmp isize, 0
je ex
mov EDI, EBX
jmp big_loop
ex:
pop EBX
}
}
void CSortarraybyMaximumDlg::OnBnClickedButtonl()
{
// TODO: Add your control notification handler code here
CString si;
int il[] = {4, -6, -9, -7, 34, -6, 97, -50};
int sil = sizeof(il)/4;
si.Empty;
for (int cnt = 0; cnt < sil; cnt++)
{
si.Format("%d", il[cnt]);
s_Src = s_Src + " " + si;
};
sortMax(il, sil);
s1.Empty;
for (int cnt = 0; cnt < sil; cnt++)
{
si.Format("%d", il[cnt]);
s_Dst = s_Dst + " " + si;
};
UpdateData(FALSE);
}

Решим ту же задачу сортировки массива при помощи программы, написанной
на "чистом" С + + , и рассмотрим дизассемблированный листинг, точнее,
тот его фрагмент, который выполняет сортировку. Фрагменты программного
кода на С++, с помощью которых выполняется сортировка и вывод результата,
представлены в листинге 6.46. Жирным текстом выделен интересующий
нас участок программного кода.
Листинг 6.46. Программный код для выполнения сортировки массива целых чисел с использованием только операторов С++
void CSortbyDecreasewithCNETDlg::OnBnClickedButtonl()
{
// TODO: Add your control notification handler code here
CString si;
int il[]' = {4, -6, -9, -7, 34, -6, 97, -50};
int itmp;
int size_il = sizeof(il)/4;
s_Src.Empty;
s_Dst.Empty;
UpdateData(FALSE) ;
si.Empty;
// Вывод элементов исходного массива в поле редактирования
for (int cnt = 0; cnt < size il; cnt++)
514 Гпава 6
{
si. Format("%d", il[cnt]);
s_Src = s_Src + " " + si;
};
// Сортировка массива
int tSize_il = size_il;
while (tSize_il != 0)
{
for (int cnt = 0; cnt < tSize_il; cnt++)
{
if (il[cnt] >= il[cnt+l]) continue;
else
{
itmp = il[cnt];
il[cnt] = il[cnt+l];
il[cnt+l] = itmp;
};
};
tSize_il—;
};
// Вывод элементов отсортированного массива в поле редактирования
for (int cnt = 0; cnt < size_il;cnt++)
{
si.Format("%d", ilfcnt]);
s_Dst = s_Dst + " " + si;
};
UpdateData(FALSE);
}
He будем детально останавливаться на анализе выделенного фрагмента
кода, поскольку для программистов на С++ он достаточно очевиден.
Дизассемблированный фрагмент этого участка кода представлен в
листинге 6.47.
Листинг 6.47. Программный код дизассемблированного фрагмента на С++
int tsize il = size il;
0041382D mov eax,dword ptr [size il]
00413830 mov dword ptr [tSize il],eax
while l ;tSize_il != 0)
00413833 cmp dword ptr [tSize il],0
00413837 je CSortbyDecreasewithCNETDlg: :OnBnClickedButtonl+lE2h
(4138B2h)
{
for 1 [int cnt = 0; cnt < tSize il; cnt++)
00413839 mov dword ptr [cnt],0
00413843 jmp CSortbyDecreasewithCNETDlg: :OnBnClickedButtonl+184h
(413854h)
00413845 mov eax,dword ptr [cnt]
0041384B add eax, 1
0041384E mov dword' ptr [cnt] , eax
00413854 mov eax,dword ptr [cnt]
0041385A cmp eax,dword ptr [tSize_il]
0041385D jge CSortbyDecreasewithCNETDlg: :OnBnClickedButtonl+lD7h
(4138A7h)
I
if (ilfcnt] >= il[cnt+l]) continue;
0041385F mov eax,dword ptr [cnt]
00413865 mov ecx,dword ptr [cnt]
0041386B mov edx,dword ptr il[eax*4]
0041386F cmp edx,dword ptr [ebp+ecx*4-44h]
00413873 jl CSortbyDecreasewithCNETDlg: :OnBnClickedButtonl+lA7h
(413877h)
00413875 jmp CSortbyDecreasewithCNETDlg: :OnBnClickedButtonl+175h
(413845h)
else
{
itmp = il[cnt];
00413877 mov
0041387D mov
00413881 mov
eax,dword ptr [cnt]
ecx,dword ptr il[eax*4i
dword ptr [itmp],ecx
il[cnt] = il[cnt+1];
00413884 mov
0041388A mov
00413890 mov
00413894 mov
eax,dword ptr [cnt]
ecx,dword ptr [cnt]
edx,dword ptr [ebp+ecx*4-44h]
dword ptr il [eaxM ], edx
il[cnt+1] = itmp;
00413898 mov eax,dword ptr [cnt]
0041389E mov ecx,dword ptr [itmp]
004138A1 mov dword ptr [ebp+eax*4-44h],ecx
};
};
004138A5 jmp
(413845h)
CSortbyDecreasewithCNETDlg::OnBnClickedButtonl+175h
tSize il—j
004138A7 mov
004138AA sub
004138AD mov
eax,dword ptr [tSize_il]
eax, 1
dword ptr [tSize il],eax
};
004138B0 jmp
(413833h)
CSortbyDecreasewithCNETDlg::OnBnClickedButtonl+163h


 
 
 

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