Как все читатели наверно уже поняли, я наконец то начал учить ассемблерicon mrgreen Ассемблер и матрица. В целях самообучения и закрепления решил вспомнить информатику позапрошлого семестра, а именно: получить сумму элементов матрицы, находящихся под главной диагональю. Тогда я сделал это на паскале, а теперь, вот попробовал сделать на асме. Вроде бы получилось. Одна важная деталь — матрица должна быть квадратной, т.е. NxN. Вот графическое изображение того, что делает программа:scr Ассемблер и матрица Все элементы, обозначенные как S должны быть прибавлены к сумме. Также, в качестве так сказать, бонуса, сделал махонькую функцию на проверку числа на простоту (делится на 1 и на само себя).
Сначала будем пилить матрицу. Определим ее в секции данных вот так:

.data

myMatrix BYTE 1 , 0, 0, 0, 0
                 BYTE 2 , 2, 0, 0, 0
                 BYTE 3 , 3, 3, 0, 0
                 BYTE 4 , 4, 4, 4, 0
                 BYTE 5 , 5, 5, 5, 5

N = 5

Для простоты, я всем элементам, которые не входят в сумму присвоил 0. Чтобы отлаживать было проще, вы же можете и поменять. Ну а теперь, внимание на исходный код:

ArrSum PROC dArr:PTR BYTE, fLen:DWORD

        PUSH ESI
        PUSH EDI
        PUSH EBX

        MOV ESI,dArr
        MOV EDI,0

        MOV AL,BYTE PTR [ESI + EDI]

        InterMain:
                LEA EBX,[ESI + EDI]

                SUB EBX,dArr

                CMP EBX,fLen
                JZ InterEnd

                CMP EBX,EDI
                JNZ EBX_NEQ_EDI         
                        ADD ESI,N
                        MOV EDI,-1
                EBX_NEQ_EDI:                

                INC EDI
                ADD AL,BYTE PTR [ESI + EDI]

                JMP InterMain

        InterEnd:

                POP EBX
                POP EDI
                POP ESI

        RET
ArrSum ENDP

Первое — это сохраняем используемые регистры при входе и восстанавливаем при выходе. Дальше, задвигаем первый байт в регистр AL. ESI у нас будет адресом массива + текущая строка, EDI — номер элемента в строке. Далее, в цикле проверяем на вылет за пределы массива. Если вылета нет, то проверяем, достигли ли мы конца диагонали. Если же граница диагонали достигнута, то переводимся на новую строку. И прибавляем к AL следующий элемент. Вот вроде бы и все дела. Далее вторая функция, которая проверяет число на простоту. Если число простое, то устанавливается флаг нуля (ZF) иначе он сбрасывается. Вот сам код:

SimpleNumber PROC Number:DWORD

        PUSHAD

        CMP Number,2
        JBE GoodCheck

        MOV ECX,2

        NextInter:
                MOV EAX,Number
                MOV EDX,0
                DIV ECX
                CMP EDX,0
                JZ BadCheck

                INC ECX
        CMP ECX,Number
        JB NextInter

GoodCheck:
                ;SET ZF
                AND CL,0
                POPAD
        RET
BadCheck:
                ;CLEAR CF
                OR CL,1
                POPAD
        RET
SimpleNumber ENDP

В начале и в конце функции команды: PUSHAD и POPAD. Первая сохраняет все регистры, а вторая загружает все регистры. Принцип действия прост: делим на число и смотрим остаток. Если остаток 0 и число не 1 и не само число, то это плохо и число не простое. Иначе все хорошо и число простое. Вот вроде бы и все.

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++