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

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


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





Рассмотрим алгоритм работы функции findMax. Первый элемент массива
считается максимальным и сравнивается в цикле с последующими элементами. Если следующий элемент больше текущего максимума, то максимальным
элементом становится он. Цикл повторяется до тех пор, пока не будет
достигнут конец массива. Команды:
mov EDI, pil
mov ECX, sil
загружают в регистры EDI И ЕСХ, соответственно, указатель массива и его
размер. Сравнение текущего значения максимума и элемента массива, а
также выбор нового значения в качестве максимума выполняется группой
команд:
next:
add EDI, 4
mov EAX, [EDI]
cmp EAX, maxVal
j1 no_change
push EAX
pop maxVal
Функция возвращает значение максимума, как обычно, в регистре ЕАХ:
mov EAX, maxVal
Обработчик нажатия кнопки ничего особенного не выполняет. Полученное
значение максимума присваивается переменной i_Max, соответствующей
элементу управления Edit2, и выводится на экран.

Было бы интересно сравнить программы поиска максимума как с использованием ассемблерной функции, так и на "чистом" С + + .
Ассемблерный вариант у нас есть, поэтому разработаем такую же программу на языке высокого уровня. Программный код обработчика нажатия кнопки приведен далее в листинге 6.43. Фрагмент кода, выполняющий поиск максимального значения, выделен жирным шрифтом.
Листинг 6.43. Фрагмент программы с использованием операторов С++, выполняющий поиск максимального элемента
void CFindMaxIntwithCDlg::OnBnClickedButtonl()
{
// TODO: Add your control notification handler code here
CString si;
int il[] = {4, -6, 9, -7, 32, -90, 123};
int sil = sizeof(il)/4;
// Вывод элементов массива на экран
si.Empty;
for (int cnt = 0; cnt < sil; cnt++)
{
s1.Format("%d", il[cnt]);
s_Array = s_Array + " " + si;
};
// Поиск максимального элемента в массиве целых чисел
i_Max = i l [ 0 ] ;
for (int cnt = 1; cnt < sil; cnt++)
{
if (i_Max >= il[cnt]) continue;
else i_Max = il[cnt];
}
UpdateData(FALSE);
};
Программный код этого фрагмента в особых пояснениях не нуждается. Посмотрим
теперь на дизассемблированный листинг С++-варианта программы, точнее на ту его часть, которая соответствует циклу for, вычисляющему Max (листинг 6.44).
Листинг 6.44. Программный код, полученный при дизассемблиррвании цикла f o r
i Max = il[0] ;
0041380C mov
0041380F mov
00413812 mov
eax,dword ptr [this]
ecx, dword ptr [il]
dword ptr [eax+7Ch],ecx
for (int cnt = l;cnt < sil; cnt++)
00413815
0041381C
(413827h)
0041381E
00413821
00413824
00413827
0041382A
0041382D
(41384Fh)
mov
jmp
mov
add
mov
mov
cmp
jge
dword ptr [cnt],1
CFindMaxIntwithCDlg::OnBnClickedButtonl+167h
eax,dword ptr [cnt]
eax, 1
dword ptr [cnt],eax
eax,dword ptr [cnt]
eax,dword ptr [sil]
CFindMaxIntwithCDlg::OnBnClickedButtonl+18Fh
if (i Max >= il[cnt]) continue;
0041382F
00413832
00413835
00413838
0041383C
(413840h)
0041383E
(41381Eh)
mov
mov
mov
cmp
jl
jmp
eax,dword ptr [this]
ecx,dword ptr [cnt]
edx,dword ptr [eax+7Ch]
edx, dword ptr il[ecx*4]
CFindMaxIntwithCDlg::OnBnClickedButtonl+180h
CFindMaxIntwithCDlg::OnBnClickedButtonl+15Eh
else i Max = ilfcnt];
00413840 mov
00413843 mov
eax, dword ptr [this]
ecx,dword ptr [cnt]
00413846 mov edx,dword ptr il[ecx*4]
0041384A mov dword ptr [eax+7Ch],edx
}
0041384D jmp CFindMaxIntwithCDlg::OnBnClickedButtonl+15Eh
(41381Eh)


 
 
 

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