Ассемблер для начинающих. Примеры простых программ

Просто примеры работающих программ на masm32, без подробного разбора и т.п. Использование MessageBox, ExitProcess. Вызов WinAPI-функции с помощью invoke. Подключение файлов и библиотек с помощью includelib и include. Инструкции call, push, test, add, jz, jmp, jne, mov, inc, dec, cmp. Реализация цикла через .REPEAT и .UNTIL, .WHILE и .ENDW. Использование .IF, .ENDIF, .CONTINUE и .BREAK.

Программа 1. Получение данных из командной строки

Программа получает данные из командной строки и выводит их в небольшом windows-окне.

Код с вызовом функций можно было бы заменить кодом:

invoke – это встроенный макрос для упрощения кода, и при компиляции всё это преобразуется в ассемблерные команды.

Т.е. код

эквивалентен коду

Стек – это удобное место для хранения информации. Чаще всего он используется при вызове функций.

Все WinAPI-функции созданы по соглашению stdcall, то есть, передача аргументов в них производится через стек в обратном порядке. Возвращают эти функции значение в регистре eax.

Программа 2. Сложение двух чисел

Программа складывает два числа, и проверяет результат. Если сумма равна 0 – выводится одно сообщение, если нет – другое.

В данной задаче самое интересное – это работа с метками, командами jz, jmp и test.

test – это операция логического сравнения двух операндов, размерностью байт, слово или двойное слово. В процессе выполняется операцию логического умножения: бит результата равен 1, если соответствующие биты операндов равны 1, в остальных случаях бит результата равен 0. Затем устанавливаются флаги, в том числе флаг ZF (zero flag), который равен 1, если результат логического умножения равен нулю.

Флаг ZF в дальнейшем используется для анализа результата.

jnz – выполняет переход по указанной метке, если не установлен флаг ZF. Данная команда обычно используется с операциями сравнения, которые влияют на состояние флага ZF. Например, test и cmp.

jz – выполняет переход по указанной метке, если установлен флаг ZF. Данная команда обычно используется с операциями сравнения, которые влияют на состояние флага ZF. Например, test и cmp.

jmp – выполняет безусловный переход по указанной метке.

Программа 3. Организация цикла

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

inc – это увеличение значения операнда в памяти или регистре на 1.

Директиву .BREAK используется, чтобы прервать цикл и продолжить выполнение программы далее. Можно использовать директиву .CONTINUE для прерывания выполнения кода внутри цикла и перехода к
очередной проверке условия в конструкции repeat и while.

Программа 4. Сумма всех элементов массива

Программа суммирует значения всех элементов массива. Интересна работой с массивами и реализацией цикла типа “for”.

dec – уменьшение значения операнда в памяти или регистре на 1.

cmp – сравнение двух операндов, методом вычитания второго операнда из первого. По результатам вычисления устанавливаются флаги.

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

Полезные ссылки по теме ассемблера

Команды Ассемблера

MASM32: Немного основ ассемблера

Дневники чайника хорошая статья по masm для новичков

2 thoughts on “Ассемблер для начинающих. Примеры простых программ

  1. Владимир

    Забавно, Вы пишите на masm?
    Я как-то тыкал ассемблер, книжку Зубкова (кажется так его звали) прочитал. Но так ничего годного и не написал. Ограничился чуть более сложными чем в статье программами xD. Под контроллеры еще в ВУЗе на ассемблере писал, но то были лабораторные. До промышленного применения я не дошел, да и негде – у нас в городе есть лишь одна контора, которая постоянно размещает соответствующие вакансии (но там опять же не masm, а специфические, урезанные ассемблеры контроллеров).

    Но мне казалось, что один человек не может писать и на перле и на ассемблере (очень уж разный уровень абстракции и область применения), как Вам удается? )

    Reply
    1. Natalie Post author

      Я не пишу на masm, т.к. начала его изучать всего недели 3 назад, за вычетом Новогодних праздников. Да и не планирую им заниматься, в плане выполнения каких-то работ.

      Пока что мне просто нравится разбираться с языком, который очень настоящий, близкий к жизни. Именно за счет разных уровней абстракций. Это такой отдых от работы :)

      Кроме того, Perl еще не так далек от ассемблера, как, например, PHP. Я так думаю.

      Reply

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*