Пример программы на asm

Многие считают, что Assembler – уже устаревший и нигде не используемый язык, однако в основном это молодые люди, которые не занимаются профессионально системным программированием. Разработка ПО, конечно, хорошо, но в отличие от высокоуровневых языков программирования, Ассемблер научит глубоко понимать работу компьютера, оптимизировать работку с аппаратными ресурсами, а также программировать любую технику, тем самым развиваясь в направлении машинного обучения. Для понимания этого древнего ЯП, для начала стоит попрактиковаться с простыми программами, которые лучше всего объясняют функционал Ассемблера.

IDE для Assembler

Первый вопрос: в какой среде разработки программировать на Ассемблере? Ответ однозначный – MASM32. Это стандартная программа, которую используют для данного ЯП. Скачать её можно на официальном сайте masm32.com в виде архива, который нужно будет распаковать и после запустить инсталлятор install.exe. Как альтернативу можно использовать FASM, однако для него код будет значительно отличаться.

Пишем тетрис на ассемблере под DOS (x86)

Перед работой главное не забыть дописать в системную переменную PATH строчку:

С:masm32bin

Программа «Hello world» на ассемблере

Считается, что это базовая программа в программировании, которую начинающие при знакомстве с языком пишут в первую очередь. Возможно, такой подход не совсем верен, но так или иначе позволяет сразу же увидеть наглядный результат:

.386 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib /masm32/lib/kernel32.lib .data msg_title db «Title», 0 msg_message db «Hello world», 0 .code start: invoke MessageBox, 0, addr msg_message, addr msg_title, MB_OK invoke ExitProcess, 0 end start

Для начала запускаем редактор qeditor.exe в папке с установленной MASM32, и в нём пишем код программы. После сохраняем его в виде файла с расширением «.asm», и билдим программу с помощью пункта меню «Project» → «Build all». Если в коде нет ошибок, программа успешно скомпилируется, и на выходе мы получим готовый exe-файл, который покажет окно Windows с надписью «Hello world».

Сложение двух чисел на assembler

В этом случае мы смотрим, равна ли сумма чисел нулю, или же нет. Если да, то на экране появляется соответствующее сообщение об этом, и, если же нет – появляется иное уведомление.

.486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib /masm32/lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: mov eax, 123 mov ebx, -90 add eax, ebx test eax, eax jz zero invoke MessageBox, 0, chr$(«В eax не 0!»), chr$(«Info»), 0 jmp lexit zero: invoke MessageBox, 0, chr$(«В eax 0!»), chr$(«Info»), 0 lexit: invoke ExitProcess, 0 end start

Здесь мы используем так называемые метки и специальные команды с их использованием (jz, jmp, test). Разберём подробнее:

Программа на С с линковкой функций на ASM

  • test – используется для логического сравнения переменных (операндов) в виде байтов, слов, или двойных слов. Для сравнения команда использует логическое умножение, и смотрит на биты: если они равны 1, то и бит результата будет равен 1, в противном случае – 0. Если мы получили 0, ставятся флаги совместно с ZF (zero flag), которые будут равны 1. Далее результаты анализируются на основе ZF.
  • jnz – в случае, если флаг ZF нигде не был поставлен, производится переход по данной метке. Зачастую эта команда применяется, если в программе есть операции сравнения, которые как-либо влияют на результат ZF. К таким как раз и относятся test и cmp.
  • jz – если флаг ZF всё же был установлен, выполняется переход по метке.
  • jmp – независимо от того, есть ZF, или же нет, производится переход по метке.

Программа суммы чисел на ассемблере

Примитивная программа, которая показывает процесс суммирования двух переменных:

.486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib /masm32/lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db «Title», 0 A DB 1h B DB 2h buffer db 128 dup(?) format db «%d»,0 .code start: MOV AL, A ADD AL, B invoke wsprintf, addr buffer, addr format, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start

В Ассемблере для того, чтобы вычислить сумму, потребуется провести немало действий, потому как язык программирования работает напрямую с системной памятью. Здесь мы по большей частью манипулируем ресурсами, и самостоятельно указываем, сколько выделить под переменную, в каком виде воспринимать числа, и куда их девать.

Получение значения из командной строки на ассемблере

Одно из важных основных действий в программировании – это получить данные из консоли для их дальнейшей обработки. В данном случае мы их получаем из командной строки и выводим в окне Windows:

.486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib /masm32/lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: call GetCommandLine ; результат будет помещен в eax push 0 push chr$(«Command Line») push eax ; текст для вывода берем из eax push 0 call MessageBox push 0 call ExitProcess end start

Также можно воспользоваться альтернативным методом:

.486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib /masm32/lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: call GetCommandLine ; результат будет помещен в eax invoke GetCommandLine invoke MessageBox, 0, eax, chr$(«Command Line»), 0 invoke ExitProcess, 0 push 0 call ExitProcess end start

Читайте также:
Отзывы о программе развитие

Здесь используется invoke – специальный макрос, с помощью которого упрощается код программы. Во время компиляции макрос-команды преобразовываются в команды Ассемблера. Так или иначе, мы пользуемся стеком – примитивным способом хранения данных, но в тоже время очень удобным. По соглашению stdcall, во всех WinAPI-функциях переменные передаются через стек, только в обратном порядке, и помещаются в соответствующий регистр eax.

Циклы в ассемблере

.data msg_title db «Title», 0 A DB 1h buffer db 128 dup(?) format db «%d»,0 .code start: mov AL, A .REPEAT inc AL .UNTIL AL==7 invoke wsprintf, addr buffer, addr format, AL invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start
.data msg_title db «Title», 0 buffer db 128 dup(?) format db «%d»,0 .code start: mov eax, 1 mov edx, 1 .WHILE edx==1 inc eax .IF eax==7 .BREAK .ENDIF .ENDW invoke wsprintf, addr buffer, addr format, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0

Для создания цикла используется команда repeat.

Далее с помощью inc увеличивается значение переменной на 1, независимо от того, находится она в оперативной памяти, или же в самом процессоре. Для того, чтобы прервать работу цикла, используется директива «.BREAK». Она может как останавливать цикл, так и продолжать его действие после «паузы». Также можно прервать выполнение кода программы и проверить условие repeat и while с помощью директивы «.CONTINUE».

Сумма элементов массива на assembler

Здесь мы суммируем значения переменных в массиве, используя цикл «for»:

.486 .model flat, stdcall option casemap: none include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib /masm32/lib/kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db «Title», 0 A DB 1h x dd 0,1,2,3,4,5,6,7,8,9,10,11 n dd 12 buffer db 128 dup(?) format db «%d»,0 .code start: mov eax, 0 mov ecx, n mov ebx, 0 L: add eax, x[ebx] add ebx, type x dec ecx cmp ecx, 0 jne L invoke wsprintf, addr buffer, addr format, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start

Команда dec, как и inc, меняет значение операнда на единицу, только в противоположную сторону, на -1. А вот cmp сравнивает переменные методом вычитания: отнимает одно значение из второго, и, в зависимости от результата ставит соответствующие флаги.

С помощью команды jne выполняется переход по метке, основываясь на результате сравнения переменных. Если он отрицательный – происходит переход, а если операнды не равняются друг другу, переход не осуществляется.

Ассемблер интересен своим представлением переменных, что позволяет делать с ними что угодно. Специалист, который разобрался во всех тонкостях данного языка программирования, владеет действительно ценными знаниями, которые имеют множество путей использования. Одна задачка может решаться самыми разными способами, поэтому путь будет тернист, но не менее увлекательным.

  1. Играем с изображением в PHP
  2. Поиск по географическим данным при помощи PostGIS
  3. Исчерпывающая инструкция по PHP Mailer
  4. Оптимизация и тюнинг производительности MariaDB MySQL сервера внутри Docker

Источник: evilinsider.ru

Пример программы на asm

Циклические конструкции позволяют выполнить некоторый набор инструкций определенное количество раз. На ассемблере можно реализовать различные типы циклов различным образом. Но, как правило, они вовлекают инструкцию сравнения результатов CMP и переход к определенной метке.

цикл for

В ряде языков высокого уровня, например, есть циклическая конструкция for :

// бейсикоподобный синтаксис FOR i = M TO N выполняемые действия NEXT i // сиподобный синтаксис for(var i = M; i

то есть есть некоторый счетчик i, и пока этот счетчик не достигнет значения N, будут выполняться некоторые действия цикла.

В ассемблере для создания циклов аля-for применяется следующая обобщенная конструкция:

MOV Xn, #1 // в Xn помещаем число — условный счетчик loop: // метка, на которую проецируется цикл ADD Xn, Xn, #1 // увеличение счетчика CMP Xn, #10 // сравниваем с некоторым пределом B.LE loop // если счетчик меньше или равен этому пределу, переход к метке loop

В начале помещаем в некоторый регистр, который будет выполнять роль счетчика, некоторое начальное значение. Далее идет метка (в примере выше метка loop ), после которой помещаются действия цикла. В самом цикле могут быть различные инструкции, но как минимум идет изменение значение счетчика (в примере выше — увеличение на единицу):

ADD Xn, Xn, #1

Затем проверяем некоторое условие, например, сравниваем счетчик с некоторым предельным значением (в коде выше с числом 10):

CMP Xn, #10

Далее проверяем флаги и в зависимости от результата сравнения выполняем опять переход к метке loop . Таким образом действия повторяются, пока программа программа будет удовлетворять выбранному условию. Так, в примере выше, если значение регистра Xn меньше или равно 10 (по сути, если Z-флаг установлен, а флаги N и V отличаются), опять переходим к метке loop

Посмотрим на полном примере:

// METANIT.COM. Пример программы с циклом for .global _start _start: MOV X0, #0 // помещаем в X0 число 1 _loop: // метка цикла ADD X0, X0, #1 // X0 = X0 + 1 CMP X0, #5 // сравниваем значение X0 c числом 5 B.LE _loop // если значение в X0 меньше или равно 5, переходим обратно к метке loop //выходим из программы MOV X8, #93 // номер функции Linux для выхода из программы — 93 SVC 0 // вызываем функцию и выходим из программы

Здесь помещаем в регистр X0 число 1. Дальше идет метка цикла _loop . В цикле увеличиваем значение в регистре X0 на единицу. Затем инструкция CMP сравнивает его с число 5. И если значение регистра X0 меньше или равно 5, то обратно переходим к метке _loop . Соответственно действия повторяются. Когда значение в X0 стало равно 6, идем дальше — вызываем функцию Linux для завершения программы. Соответственно кодом возврата из программы в данном случае будет число 6.

Читайте также:
Программа где старый девушка

Чуть более показательный пример — вывод 5 раз строки на консоль:

// METANIT.COM. Пример программы с выводом сообщения в цикле for .global _start _start: MOV X3, #1 // помещаем в X3 число 1 _loop: // метка цикла MOV X0, #1 // 1 = StdOut — поток вывода LDR X1, =message // строка для вывода MOV X2, #18 // длина строки MOV X8, #64 // устанавливаем функцию Linux для вывода строки SVC 0 // вызываем функцию для вывода сообщения на консоль ADD X3, X3, #1 // X3 = X3 + 1 CMP X3, #5 // сравниваем значение X0 c числом 5 B.LE _loop // если значение в X1 меньше или равно 5, переходим обратно к метке loop //выходим из программы MOV X8, #93 // номер функции Linux для выхода из программы — 93 SVC 0 // вызываем функцию и выходим из программы .data message: .ascii «Hello METANIT.COMn»

Стоит отметить, что поскльку инструкция CMP фактически сводится к инструкции SUBS , которая выполняет вычитание с установкой флага, то здесь мы фактически можем сократить код. Так, вместо

MOV X0, #0 _loop: ADD X0, X0, #1 CMP X0, #5 B.LE _loop
MOV X0, #5 _loop: SUBS X0, X0, #1 B.NE _loop

цикл while

В ряде языков программирования есть другой тип циклов — цикл while , который выполняет некоторые действия, пока истинно некоторое условие:

// бейсикоподобный синтаксис WHILE n < m действия цикла END WHILE // сиподобный синтаксис while(n

В ассемблере подобное можно реализовать следующим образом:

loop: CMP Xn, Operand2 B.GE loopdone инструкции цикла B loop loopdone: // завершение цикла // остальные инструкции программы

После метки loop идут действия цикла, где сначала сравниваем значение некоторого регистра Xn:

CMP Xn, Operand2

Далее если выполняется некоторое условие, то переходим на метку завершения цикла. В данном случае переход идет на метку loopdone , если значение регистра Xn больше или равно значению Operand2. Если же это условие не выполняются то выполняются последующие действия вплоть до инструкции B loop , которая производит переход обратно на метку loop

Если условие выполняется, то производится переход на метку loopdone , которая знаменует завершение цикла и за которой идут остальные действия программы.

Посмотрим на полном примере:

// METANIT.COM. Пример программы с циклом типа while .global _start _start: MOV X0, #1 // помещаем в регистр X0 число 1 _loop: CMP X0, #5 // сравнивание значение регистра X0 с числом 5 B.EQ _loopdone // если они равны, то выходим из цикла — переход к метке _loopdone ADD X0, X0, #1 // X0 = X0 + 1 B _loop // переход обратно к метке _loop _loopdone: // завершение цикла MOV X8, #93 // номер функции Linux для выхода из программы — 93 SVC 0 // вызываем функцию и выходим из программы

В данном случае помещаем в регистр X0 число 1. В условном цикле сравниваем значение регистра с числом 5

CMP X0, #5

Если значения не равны, то добавляем в регистр X0 единицу

ADD X0, X0, #1

И переходим обратно к метке _loop , тем самым повторяя действия.

Если же значение из регистра X0 равно 5, то инструкция B.EQ _loopdone выполняет переход к метке _loopdone , после которой идет завершение программы. А на консоль будет выведен код возврата из программы — число 5 из регистра X0.

цикл do..while

Еще одним типом циклов является цикл do..while — он сначала выполняет некоторые действия, а потом проверяет условие. Если условие верно, повторяет действия. Если условие НЕ верно, завершает работу:

do < выполняемые действия >while(условие);

С точки зрения реализации это самый легкий тип цикла:

// METANIT.COM. Пример программы с циклом типа do..while .global _start _start: MOV X0, #1 // помещаем в регистр X0 число 1 _loop: ADD X0, X0, #1 // X0 = X0 + 1 — выполняемые действия цикла CMP X0, #5 // сравнивание значение регистра X0 с числом 5 B.LT _loop // если X0 меньше числа 5, то переходим обратно к метке _loop // завершение программы MOV X8, #93 // номер функции Linux для выхода из программы — 93 SVC 0 // вызываем функцию и выходим из программы

Здесь помещаем в регистр X0 число 1. Затем после метки _loop производим действия цикла — увеличиваем значение регистра X0 на единицу.

Затем сравниваем значение регистра X0 с числом 5. И если X0 меньше числа 5, то переходим обратно к метке _loop и повторяем действия цикла. Когда X0 станет равным 5, то произодейт выход из цикла.

Источник: metanit.com

Склад программиста. C C++ Pascal Java и Assembler Исходники

Паскаль исходники. Паскаль программы. Pascal исходники. Pascal программы. С программы исходники. Исходники ассемблер. Ассемблер задачи. Си программы. Исходники Паскаль. Исходники C. Исходники Си.

Си программы. Си исходники. Си задачи. Паскаль задачи. Задачи на паскале. Задачи по паскале. Решить задачу по паскалю.

Бесплатные исходники. Скачать бесплатно исходники. Бесплатные программы. Исходники C++, исходники СИ++. Скачать бесплатно исходники. Исходники бесплатно.

Java исходники. Java классы.

24 февр. 2008 г.

Разное(Ассемблер)

1) killproc(KillProcess)
Убивает процесс имя которого берет с аргументов в командной строке написал на MASM
.asm/.exe — оба в архиве
Скачать

2) Пример реализации получения 16ричного дампа на ассемблере. В качестве подопытной ASCII строка. Исходник очень просто переделать под дампер файлов. Содержит функцию HexDump
Скачать

3) Пример сабклассинга editbox на ассемблере. При двойном клике не editbox, вызывается MessageBox c введённым в окно текстом.
Скачать

Читайте также:
Ладыженская это какая программа

4) Вычисление факториала примерно до 38000. Ответ, правда, выдается в файл с обратным порядком следования десятичных разрядов. Занимает прога всего 256 байт, выполнена на Ассемблере. Исполняемый файл прилагается.
Скачать

5) Программа для просмотра MSW (Mashine Status Word) под DOS. Определяет режим процессора, наличие сопроцессора и т.д.
Скачать

6) Пример анимации на основе потока JPEG-кадров. Обновленная версия. Теперь программа в первую очередь пытается использовать библиотеку JPEGdec, которая использует SSE для быстрого декодирования изображений. Уже во вторую очередь используется OleLoadPicture. В примере также:
— работа с таймерами
— использование вертикальной синхронизации (VSYNC)
— использование библиотеки uFMOD
— теперь работает и на Win98ME (тестировалось), NT 4.0 (судя по всему должно)
Скачать

7) Программа предназначена для загрузки HTML страниц в несколько слоёв. Одна из самых известных программ такого рода это TeleportPro. Есть также много других оффлайн браузеров. Когда откроете архив перед использование обязательно прочитайте краткое описание — файл readme.htm
Скачать

8) Дизассемблер. Скромный, но удобный для начинающих познавать мир программирования.
Скачать

9) Программа строит график синуса в текстовом режиме.
Скачать

10) Программа строит 3-хлепестковую розу в графическом режиме (640х480).
Скачать

11) Построение круга.
Скачать

12) Построение круга 2.
Скачать

13) Программа строит график синуса.
Скачать

14) Программа строит спираль архимеда.
Скачать

15) Небольшая демка: рисование окружностей, наклонных линий, синуса, косинуса, 3-хлепестковой розы, спирали с использованием отдельных модулей для каждой фигуры.
Скачать

16) Масштабируемый синус: растягиваетсясжимается при нажатии стрелок на клавиатуре.
Скачать

17) Считывание показаний системных часов и вывод времени на экран.
Скачать

18) Динамический вывод времени на экран.
Скачать

19) Динамический вывод времени на экран большими цифрами.
Скачать

20) Вывод количества доступной памяти и список подключенного оборудования.
Скачать

21) Программа выводит дамп самой себя.
Скачать

22) Просто пример меню на фасме. А то на всех языках есть, а на фасме нету. 🙁
Скачать

23) Создание бегущей стpоки
Скачать

24) Пpимеp на создание окна со шкуpами (вpоде винамповского).
Скачать

25) Hесколько пpимеpов использования диалоговых pесуpсов.
Скачать

26) Пpимеp MDI-пpиложения
Скачать

27) Как вставить меню в свою пpогpамму
Скачать

28) Пpикольный эффект в меню
Скачать

29) Как сделать кульный контpол ‘rollup’ (cоветую посмотpеть)
Скачать

30) Еще один пpимеp на окно со шкуpами
Скачать

31) Создание и использование скpоллбаppов
Скачать

32) Создание toolbar’ов
Скачать

33) Еще один пpимеp на создание toolbar’ов
Скачать

34) Пpимеp на RichEdit
Скачать

35) Демонстpация header-контpола
Скачать

36) A Property Sheet Demo
Скачать

38) Создает окно, в котоpое вы можете пеpетаскивать файлы и вам будут выводиться их имена
Скачать

39) Пpимеp использования диалогового окна выбоpа цвета
Скачать

40) Пpогpамма хэндл и класс каждого из существующего в системе окна
Скачать

41) Добавляет гоpячую клавишу любому видимому окну
Скачать

42) Двадцать способов сделать кнопку
Скачать

43) «Как сабклассиpовать контpол «»STATIC»» так, чтобы он вел себя как кликабельная ссылка»
Скачать

45) Откpывалка CD-ROM’а
Скачать

46) Shell для компиляции пpогpамм на MASM’е
Скачать

47) Как использовать ITaskbarList
Скачать

48) Пpимеp на то, как сделать стpоку а-ля гипеpлинк
Скачать

49) Комбобокс с функцией автодополнения вводимого пользователем текста
Скачать

50) Пpимеp на создание окна со шкуpами (вpоде винамповского). (Custom window / skinz example in masm for VisualASM or straight masm32)
Скачать

51) Десктоп выступает в pоли воды, по котоpой бьют капли дождя. (My first full assembler program, this little demo creates a rain-storm (or more accurately a light-drizzle 🙂 on the user’s desktop for a while. It demonstrates the Windows GDI and Multi-threading. There is no program window)
Скачать

52) Выводит список откpытых окон и пpедоставляет возомжность изменить их pазмеp
Скачать

53) Программа проверяет, пуст ли буфер обмена Windows и если не пуст, очищает его
Скачать

54 ) Пример записи в буфер обмена windows
Скачать

55) Пpимеp использования диалогового окна выбоpа цвета.
Скачать

56) Простой календарь на рабочий стол. Использованы прозрачность и полупрозрачность (SetLayeredWindow).
Скачать

57) Пример обработки WM_ERASEBKGND. При обработке сообщения WM_ERASEBKGND вы можете в качестве фона окна установить растровое изображение, а также нарисовать в клиентской области окна всё что угодно.
Скачать

58) XXMenu — библиотека функций для меню.
* изменение стиля меню,
*> Office XP,
*> Office 2000,
*> XNET.
*> Default.
* поддержка иконок,
*> 16*16.
*> 32*32
*> 48*48
*> любые размеры.
Примечание: в одном подменю, иконки должны быть
одинакового размера (условие не являеться обязательным).
* поддержка всех типов меню.
*> главное,
*> системное,
*> всплывающие.
Скачать

59) Цель исходников Scroll_1 и Scroll_2 реализовать прокрутку изображения, в контексте устройства. Исходник Scroll_2 отличаеться от исходника Scroll_1 тем что в нем для прокрутки изображения применяеться ф — я ScrollWindowEx, так же он немного больше по размеру первого исходника. На мой взгляд рацианальние использовать исходник Scroll_1 в качестве основы для реализации прокрутки в вашей собственной программе (он быстрее работает, и правильнее составлен), а лучше всего если вы соберёте свой алгоритм, который будет эффективен в вашей программе с помощью данных исходников. Не исключенно что в исходниках есть недороботки, или не совсем пророботана эффективность, так как главной задачей было показать алгоритм прокрутки.
Скачать

61) Вывод message box’а
Скачать

62) Работа с мышью
Скачать

63) Пpимеp того, что можно сделать с помощью pесуpсов
Скачать

64) Создание окон непpавильной фоpмы
Скачать

66 ) Выводит бегущую строку вместо часов в правом нижнем углу экрана. Пример использования перехвата функций API. Только для Win 9x/ME.
Скачать

Источник: completepascal.blogspot.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru