Решил что то я в последнее время позаниматься ассемблером. Занятие это крайне не благодарное, скажу я вам, но зато приобретается бесценный опыт. В результате я смог реализовать два банальных алгоритма: сортировка пузырьком и бинарный поиск. Эти примеры на ассемблере я и хотел сегодня опубликовать. Надеюсь, что кому нибудь эти примеры пригодятся.Core2 Duo E6600 b примеры ассемблер

Итак, подготовьтесь к очень нудному но удивительному — к путешествию в мир низкоуровневого программирования… Поехали…Первая функция будет сортировать массив пузырьком. Не очень эффективный метод, но я ведь только учусьicon mrgreen примеры ассемблер.

BubbleSort PROC inArray:PTR DWORD, dwSize:DWORD

        NEXT_INTER:
        MOV EBX,0

        MOV ESI,inArray
        MOV ECX,dwSize
        DEC ECX
        MAIN_LOOP:

                MOV EAX,[ESI]
                CMP EAX,[ESI + 4]
                JLE no_change
                        XCHG EAX,[ESI + 4]
                        MOV [ESI],EAX
                        INC EBX
                no_change:
                ADD ESI,4
                DEC ECX
                JNZ MAIN_LOOP

        CMP EBX,0
        JNZ NEXT_INTER

        RET
BubbleSort ENDP

В ESI помещаем адрес массива, в ECX его размер. Далее используем EBX в качестве флага — если замен не было то EBX будет равен 0, а следовательно еще одной интерации не нужно. Сортировка проходит от меньшего к большему. Если хотите наоборот — поменяйте JLE на JGE.

Второй пример — это бинарный поиск. Для его реализации нужно, чтобы массив был отсортирован от меньшего к большему. Для большего понимания проиллюстрирую картинкой.illustrate примеры ассемблер

Если искомое находится между центром (MID) и первым (FIRST), то делаем так, чтобы конец (END) был равен центру (MID), а центр соответственно был скорректирован. С другой стороны, если искомое находится между центром (MID) и концом (END),  делаем так, чтобы первый (FIRST) был равен центру (MID), а центр опять соответственно скорректирован. Объяснить лучше рисунка выше у меня не получитсяicon mrgreen примеры ассемблер. Вобщем, хватит лирики, вот хардкор:

BinarySearch PROC inArray:PTR DWORD, dwSize:DWORD, shVal:DWORD

        MOV ESI,inArray

        MOV ECX,0               ;FIRST

        MOV EDX,dwSize  ;END

        MOV EBX,EDX             ;MID
        SHR EBX,1

ReTry:
        MOV EAX,DWORD PTR [ESI + EBX*4]
        CMP EAX,shVal
        JG EBX_Bolshe_shVal
        JL EBX_Menshe_shVal
        JZ QUIT

EBX_Bolshe_shVal:
        MOV EDX,EBX
        SHR EBX,1
        JMP ReTry

EBX_Menshe_shVal:
        MOV ECX,EBX

        MOV EAX,EDX
        SUB EAX,ECX
        MOV EBX,EAX
        SHR EBX,1

        ADD EBX,ECX

        JMP ReTry

QUIT:
        MOV EAX,EBX
        INC EAX
        RET
BinarySearch ENDP

Здесь, вроде бы сложность только со второй ветвью (JL). Там нам приходится сначала приравнивать первый центру, затем считать среднее между первым и последним, а потом прибавлять это среднее к первому (т.к. получаемое среднее не скорректировано относительно первого, а первое у нас сдвинуто). Вот в общем то и все, успеховicon mrgreen примеры ассемблер

tt twitter big4 примеры ассемблер tt digg big4 примеры ассемблер tt facebook big4 примеры ассемблер tt gmail big4 примеры ассемблер tt myspace big4 примеры ассемблер tt reddit big4 примеры ассемблер

Оставить комментарий

CAPTCHA изображение
Обновить изображение
*

RSS-подписка NIG Twitter-подписка NIG

Метки
Друзья
Блог линуксоида Программы для диагностики компьютера
Супер Pixel
Убивалка флешаБэкконект шелл. Часть вторая.Бэкконект шелл. Начало.НАМ для деления чиселПростая арифметикаПередача файлов. Часть третья. Клиент.Dll injectionСканер портовКодировка текста в BMPРухнул на два дняПередача файлов. Часть вторая. Сервер.Поворот и BMPCRC32 суммаBMP форматфайловые вирусыассемблер, строкиАссемблер и матрицапримеры ассемблерМногопоточное программированиеАрхитектура клиент — серверРаздача ICQПишем шуткупишем паукаПривет от ДжеймсаОбход firewallЗагрузка картинок на Gyazo, прямо из ThunarКейлоггер 3Плюшки в контекстном меню Thunarc по сетиКейлоггер 2КейлоггерСкачать Ассемблер!VirusCheckerОтморозки мешают жить ?! Не проблемма !Cкрипты для взлома аккаунтов QIPWinAPI. Работа с файлами. Часть третья. ЧтениеDlink exploitБрут сайта etxt.ruКрасивая раскладка клавиатуры в GnomeМои безделушки на PerlКак запускать Perl скрипты под WindowsБрутфорс партнёрки ZipCoinПарсер upwap.ruИзменения в блогеЧудо ЗаливалкаСкрипт для загрузки файлов на Zalil.ruЯндекс «чоткий» поисковик!WinAPI. Работа с файлами. Часть вторая. ЗаписьWinAPI. Работа с файлами. Часть первая. ПоискПолучение MD5 хеша средствами C++Что нам стоить letitfile.com забрутить?WarCraft III запуск под LinuxЭнтропия файлаWinsock и C++. Мини прокси. Часть |\\/. Завершающая.Перепилил чекер для 4gameЧекер акаунтов YoupornCMailSend v 1.1. Отправка почы без проблемСлучайные числаWinsock и C++. Часть |||. smtp монстр.Брутфорс LetitFile.comИспользование X-Forwarded-For, для обмана веб-сервера, подмена IP подручными средствамиДело было вечером, делать было нечего…Мысли о аудио сервереПарсер ников из твиттераКонец школоло…Perl+Linux. Заметка первая (Удобный Paste bin).Бэкконект шелл.E-MAIL + winsocket + Cpp. Сложно?winsock и C++. Часть ||. Атака клоунов.C++ резолвинг адресаPerl, анализ HTML кода и определение CMSМатематика в C++winsock и C++