как установить nasm на windows 10
SASM – IDE для ассемблера
Здравствуйте, уважаемые хабравчане!
Данным постом хочу представить сообществу проект, который время от времени писался мной последний год: SASM (SimpleASM) — IDE для разработки программ на языке ассемблера x86 и x86-64.
SASM — простая кроссплатформенная (доступна на Windows и Linux) среда разработки для языков ассемблера NASM, MASM, GAS, FASM с подсветкой синтаксиса и отладчиком. Программа работает «из коробки» и хорошо подойдет для начинающих изучение языка ассемблера. Основана на Qt. Распространяется по свободной лицензии GNU GPL v3.0.
Исходники лежат в репозитории на GitHub.
Бинарники можно скачать на сайте программы.
Под катом Вы найдете немножко истории и более подробное описание возможностей.
Откуда все пошло
На 1 курсе в моём университете проходил учебный курс «Архитектура и язык ассемблера», в котором мы изучали ассемблер NASM и сдавали задачи на нем в ejudge контестах. Привыкший к использованию IDE при программировании до этого, я был не очень рад компилить все в командной строке. Удобных на мой взгляд IDE для NASM не было. Универсальные решения типа Geany мне не очень нравились (хотя на вкус и цвет товарища нет — кто-то пользовался всем этим и был доволен). Да и хотелось уже сделать что-нибудь большое и заодно выучить C++.
Итак, было решено написать свою IDE для NASM, в первую очередь для себя и может быть однокурсников.
Опыта написания GUI у меня до этого не было. После недолгих раздумий было решено использовать Qt — хороший бесплатный фреймворк, заодно и кроссплатформенный. Сначала был написан просто текстовый редактор с простой подсветкой, логом построения и окнами ввода/вывода. Гордо называемая «IDE» программа умела собирать текст, который был в текстовом редакторе и запускать построенную программу.
Затем я, немного подучив регулярные выражения, сделал красивую подсветку. Прикрутил отладчик (GDB). Добавил вкладки и всякие простые фичи в текстовом редакторе типа поиска и комментирования куска кода. Постепенно допиливал программу до более-менее нормального вида, исправлял ошибки.
Весной этого года SASM был включен в вышеописанный учебный курс, и первокурсники уже пользовались им. Недавно добавил в программу поддержку и других ассемблеров, кроме NASM — MASM, FASM и GAS.
Возможности
Во-первых, это просто редактор кода с подсветкой, вкладками и возможностями построения и выполнения программы. Возможен запуск в отдельном окне.
В логе указывается информация о времени работы программы. Есть 2 формы для ввода и вывода. Как я уже говорил, программа изначально предназначалась для сдачи контестов. Две последние возможности очень удобны для этого. Если все-таки понадобиться сохранить exe’шник, это можно сделать в меню «Файл».
Отладчик
Один из самых сложных компонентов в программе — это отладчик. Возможностей у него не так много, но некий минимальный основной набор есть: он показывает текущую строку, делает шаг с заходом, без захода, продолжает выполнение/приостанавливает программу, можно ставить брейкпоинты, смотреть регистры и память. Также для тех кому базовых возможностей все же не хватает снизу окна реализована командная строка для ввода произвольных команд для GDB.
Да, отладчик реализован на базе GDB. Сделать его было не очень просто из-за ограничений ассемблера. В частности, NASM не умеет генерировать нормальную отладочную информацию и приходится определять текущее местонахождение в программе, ставя в соответствие листинг, генерируемый ассемблером и текущий адрес в счетчике команд EIP.
Библиотека макросов для NASM
В SASM включена библиотека макросов для ввода/вывода «io.inc», используемая в курсе «Архитектура и язык ассемблера» и немного переписанная для отладки и поддержки 64-битного режима. Она очень удобна на начальных этапах обучения — позволяет выводить данные, не задумываясь о соглашениях и правилах вызова функций.
Например, чтобы вывести число содержащееся в регистре EAX, достаточно написать
Команды, содержащиеся в «io.inc» можно найти в справке.
Опции
В настройках программы можно полностью настроить текстовый редактор — задать цветовую схему, выбрать шрифт, задать начальный текст.
Там же задается язык (доступны русский и английский).
Также в параметрах доступен выбор ассемблера (NASM, MASM, GAS или FASM) и разрядности (x86 или x64). Эти опции влияют на выбор программ — ассемблера и компоновщика, и опций для них. Также под новый ассемблер подстраивается подсветка и начальный текст. Пути и опции сборки можно задать и вручную.
Дополнительно
Программа содержит справку и примеры программ для каждого ассемблера — программы Hello World в папке Projects и начальные шаблоны, чтобы можно было сразу приступить к написанию кода.
На Windows все нужные для сборки программ компоненты уже включены в SASM. Программа работает «из коробки» — можно начинать программировать сразу же после запуска.
На Linux следует установить gcc, gdb и необходимый ассемблер.
Заключение
Больше информации о программе и исходники можно посмотреть по ссылкам выше. Качество кода в начале может быть не очень — только осваивал C++ и ООП, сразу на всякий случай прошу прощения.
Проект Open Source — так что, если вдруг кто-то хочет присоединиться и что-то поменять — Welcome!
Также буду рад отзывам, предложениям и сообщениям об ошибках. И конечно разумной критике, куда без нее.
MASM для x64 (ml64.exe)
Visual Studio включает 32-разрядную и 64-разрядную версию Microsoft Assembler (MASM) для целевого кода x64. Именованный ml64.exe — это ассемблер, который принимает язык ассемблера x64. программы командной строки MASM устанавливаются при выборе рабочей нагрузки C++ во время установки Visual Studio. Средства MASM недоступны для загрузки отдельно. инструкции по загрузке и установке копии Visual Studio см. в разделе install Visual Studio. если вы не хотите устанавливать полнофункциональную интегрированную среду разработки Visual Studio, но вам нужны только программы командной строки, скачайте средства сборки для Visual Studio.
Чтобы использовать MASM для построения кода для платформ x64 в командной строке, необходимо использовать командную строку разработчика для целевых платформ x64, которые задают требуемый путь и другие переменные среды. Сведения о запуске командной строки разработчика см. в разделе Сборка кода C/C++ в командной строке.
сведения о ml64.exe параметров командной строки см. в разделе справочник по ML и ML64 Command-Line.
Встроенный ассемблер или использование ключевого слова ASM не поддерживается для целевых объектов x64 и ARM. Чтобы перенести код x86, использующий встроенный ассемблер для x64 или ARM, можно преобразовать код в C++, использовать встроенные функции компилятора или создать файлы исходного кода на языке ассемблера. Компилятор Microsoft C++ поддерживает встроенные функции, позволяющие использовать специальные инструкции, например привилегированные, битовые сканирования и тестирования, взаимоблокировки и т. д., в качестве максимально близкого к кросс-платформенному способу. Сведения о доступных встроенных функциях см. в разделе встроенные функции компилятора.
добавление файла ассемблерного языка в проект Visual Studio C++
система проектов Visual Studio поддерживает файлы на языке ассемблера, созданные с помощью MASM в проектах C++. Вы можете создавать файлы исходного кода на языке ассемблера x64 и создавать их в объектных файлах с помощью MASM, который поддерживает 64-разрядную версию. Затем эти файлы объектов можно связать с кодом C++, созданным для целевых платформ x64. Это один из способов преодоления отсутствия встроенного ассемблера x64.
добавление файла ассемблерного языка в существующий проект Visual Studio C++
Выберите проект в обозревателе решений. в строке меню выберите Project, настройки сборки.
в строке меню выберите Project, добавить новый элемент.
Создайте код на языке ассемблера в добавленном ASM-файле. При сборке решения вызывается ассемблер MASM Assembler для сборки ASM-файла в объектный файл, который затем связывается с проектом. Чтобы упростить доступ к символам, объявите функции ассемблера как extern «C» в исходном коде C++ вместо использования соглашений об оформлении имен c++ в исходных файлах на языке ассемблера.
Директивы, относящиеся к ml64
В исходном коде на языке ассемблера, предназначенном для x64, можно использовать следующие директивы ml64:
Программирование на Ассемблере для начинающих с примерами программ
Есть высокоуровневые языки — это те, где вы говорите if — else, print, echo, function и так далее. «Высокий уровень» означает, что вы говорите с компьютером более-менее человеческим языком. Другой человек может не понять, что именно у вас написано в коде, но он хотя бы сможет прочитать слова.
Но сам компьютер не понимает человеческий язык. Компьютер — это регистры памяти, простые логические операции, единицы и нули. Поэтому прежде чем ваша программа будет исполнена процессором, ей нужен переводчик — программа, которая превратит высокоуровневый язык программирования в низкоуровневый машинный код.
Ассемблер — это собирательное название языков низкого уровня: код всё ещё пишет человек, но он уже гораздо ближе к принципам работы компьютера, чем к принципам мышления человека.
Вариантов Ассемблера довольно много. Но так как все они работают по одинаковому принципу и используют (в основном) одинаковый синтаксис, мы будем все подобные языки называть общим словом «Ассемблер».
Как мыслит процессор
Чтобы понять, как работает Ассемблер и почему он работает именно так, нам нужно немного разобраться с внутренним устройством процессора.
Кроме того, что процессор умеет выполнять математические операции, ему нужно где-то хранить промежуточные данные и служебную информацию. Для этого в самом процессоре есть специальные ячейки памяти — их называют регистрами.
Регистры бывают разного вида и назначения: одни служат, чтобы хранить информацию; другие сообщают о состоянии процессора; третьи используются как навигаторы, чтобы процессор знал, куда идти дальше, и так далее. Подробнее — в расхлопе ↓
Какими бывают регистры
Общего назначения. Это 8 регистров, каждый из которых может хранить всего 4 байта информации. Такой регистр можно разделить на 2 или 4 части и работать с ними как с отдельными ячейками.
Указатель команд. В этом регистре хранится только адрес следующей команды, которую должен выполнить процессор. Вручную его изменить нельзя, но можно на него повлиять различными командами переходов и процедур.
Регистр флагов. Флаг — какое-то свойство процессора. Например, если установлен флаг переполнения, значит процессор получил в итоге такое число, которое не помещается в нужную ячейку памяти. Он туда кладёт то, что помещается, и ставит в этот флаг цифру 1. Она — сигнал программисту, что что-то пошло не так.
Флагов в процессоре много, какие-то можно менять вручную, и они будут влиять на вычисления, а какие-то можно просто смотреть и делать выводы. Флаги — как сигнальные лампы на панели приборов в самолёте. Они что-то означают, но только самолёт и пилот знают, что именно.
Сегментные регистры. Нужны были для того, чтобы работать с оперативной памятью и получать доступ к любой ячейке. Сейчас такие регистры имеют по 32 бита, и этого достаточно, чтобы получить 4 гигабайта оперативки. Для программы на Ассемблере этого обычно хватает.
Так вот: всё, с чем работает Ассемблер, — это команды процессора, переменные и регистры.
Здесь нет привычных типов данных — у нас есть только байты памяти, в которых можно хранить что угодно. Даже если вы поместите в ячейку какой-то символ, а потом захотите работать с ним как с числом — у вас получится. А вместо привычных циклов можно просто прыгнуть в нужное место кода.
MASM, TASM, FASM, NASM под Windows и Linux
Часть I Часть II Часть III В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под Windows и Linux, а также указать ссылки на ресурсы и книги, посвященные изучению данной темы.
(
link /subsystem:console prog11.obj
)
Как сказано в Википедии
MASM — один из немногих инструментов разработки Microsoft, для которых не было отдельных 16- и 32-битных версий.
Также ассемблер версии 6. можно взять на сайте Кипа Ирвина kipirvine.com/asm, автора книги «Язык ассемблера для процессоров Intel».
Кстати, вот ссылка на личный сайт Владислава Пирогова, автора книги “Ассемблер для Windows”.
MASM с сайта Microsoft
Открываем этот файл архиватором (например 7zip). Внутри видим файл setup.exe, извлекаем его, открываем архиватором. Внутри видим два файла vc_masm.msi,vc_masm1.cab. Извлекаем файл vc_masm1.cab, открываем архиватором. Внутри видим файл FL_ml_exe_____X86.3643236F_FC70_11D3_A536_0090278A1BB8. Переименовываем его в файл fl_ml.exe, далее, произведём ассемблирование файла prog11.asm, используя ассемблер fl_ml.exe.
MASM в Visual Studio
Также MASM можно найти в папке с Visual Studio (у меня VS 10) вот здесь: C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ml.exe.
Для того, чтобы запустить на 32- или 64-разрядной системе и создавать программы, работающие как под 32-, так и под 64-разрядной Windows, подходит MASM32 (ml.exe, fl_ml.exe). Для того, чтобы работать на 32- и 64-разрядных системах и создавать программы, работающие под 64-разрядной Windows, но неработающие под 32-разрядной нужен ассемблер ml64.exe. Лежит в папке C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\amd64 и вот здесь — C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\x86_amd64.
Программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. В настоящее время Borland прекратила распространение своего ассемблера.
Скачать можно, например, здесь. Инсталлятора нет, просто извлекаем программу. Вот исходник из книги Питера Абеля (рис. 3.2) «Язык Ассемблера для IBM PC и программирования».
stacksg segment para stack ‘stack’ db 12 dup (‘stackseg’) stacksg ends codesg segment para ‘code’ begin proc far assume ss:stacksg,cs:codesg,ds:nothing push ds sub ax,ax push ax mov ax, 0123h add ax, 0025h mov bx,ax add bx,ax mov cx,bx sub cx,ax sub ax,ax nop ret begin endp codesg ends end begin Выполним ассемблирование (трансляцию) файла abel32.asm.
Корректность работы программы можно проверить, произведя линковку (tlink.exe) объектного файла и запустив полученный файл в отладчике.
Как было сказано выше, MASM можно использовать для работы с 16-битными программами. Выполним ассемблирование (трансляцию) программы abel32.asm с помощью ассемблера MASM:
здесь не используется. Линковка производится файлом
link16.exe
В статье Криса Касперски «Сравнение ассемблерных трансляторов» написано, что «FASM — неординарный и весьма самобытный, но увы, игрушечный ассемблер. Пригоден для мелких задач типа „hello, world“, вирусов, демок и прочих произведений хакерского творчества.»
Скачаем FASM с официального сайта. Инсталлятора нет, просто извлекаем программу. Откроем fasm editor — C:\fasm\fasmw.exe. В папке C:\fasm\EXAMPLES\HELLO есть файл HELLO.asm.
Вот ссылки на ресурсы, посвященные FASM:
Для того, использовать FASM в Linux (у меня Ubuntu), скачаем соответствующий дистрибутив (fasm-1.71.60.tgz), распакуем его, в папке у нас будет бинарный файл fasm, копируем этот файл в /usr/local/bin для того, чтобы можно было запускать его из консоли, как любую другую команду.Выполним ассемблирование программы hello.asm из папки fasm/examples/elfexe/hello.asm.
Корректность работы программы можно проверить в отладчике.
Nasm успешно конкурирует со стандартным в Linux- и многих других UNIX-системах ассемблером Gas.
Nasm в Linux можно установить его с помощью менеджера пакетов или из командной строки: в дистрибутиве Debian (Ubuntu)
командой
apt-get install nasm
, в дистрибутивах
Fedora
,
CentOS
,
RedHat
командой
yum install nasm
.
Создадим программу, которая 5 раз выводит сообщение “Hello”. Пример взят из книги Андрея Викторовича Столярова “Программирование на языке ассемблера NASM для ОС UNIX”. Учебник, а также библиотека “stud_io.inc” есть на личном сайте автора.
NASM для Windows можно установить, скачав соответствующий дистрибутив с соответствующего сайта.
Ссылки на ресурсы, посвященные Nasm:
→ Сайт А.В. Столярова → Сайт, на котором лежит электронный учебник (в архиве) → То же самое
Стандартный ассемблер практически во всех разновидностях UNIX, в том числе Linux и BSD. Свободная версия этого ассемблера называется GAS (GNU assembler). Позволяет транслировать программы с помощью компилятора GCC.
Из учебников удалось найти только книгу на английском «Programming from the ground up». На русском удалось найти только одну главу из книги С. Зубкова «Assembler для DOS, Windows и UNIX».
Возьмем пример программы, которая ничего не делает, с сайта. Создадим программу gas.s
Следующие две части, в целом, посвящены обработке строки в цикле.
P.P.S.
Little Man Computer — учебная модель компьютера с ограниченым набором ассемблерных инструкций рассматривается в этой статье.
Команды Ассемблера
Каждая команда Ассемблера — это команда для процессора. Не операционной системе, не файловой системе, а именно процессору — то есть в самый низкий уровень, до которого может дотянуться программист.
Любая команда на этом языке выглядит так:
Метка — это имя для фрагмента кода. Например, вы хотите отдельно пометить место, где начинается работа с жёстким диском, чтобы было легче читать код. Ещё метка нужна, чтобы в другом участке программы можно было написать её имя и сразу перепрыгнуть к нужному куску кода.
Команда — служебное слово для процессора, которое он должен выполнить. Специальные компиляторы переводят такие команды в машинный код. Это сделано для того, чтобы не запоминать сами машинные команды, а использовать вместо них какие-то буквенные обозначения, которые проще запомнить. В этом, собственно, и выражается человечность Ассемблера: команды в нём хотя бы отдалённо напоминают человеческие слова.
Операнды отвечают за то, что именно будут делать команды: какие ячейки брать для вычислений, куда помещать результат и что сделать с ним дополнительно. Операндом могут быть названия регистров, ячейки памяти или служебные части команд.
Комментарий — это просто пояснение к коду. Его можно писать на любом языке, и на выполнение программы он не влияет. Примеры команд:
mov eax, ebx ; Пересылаем значение регистра EBX в регистр EAX
mov x, 0 ; Записываем в переменную x значение 0
add eax, х ; Складываем значение регистра ЕАХ и переменной х, результат отправится в регистр ЕАХ
Здесь нет меток, первыми идут команды (mov или add), а за ними — операнды и комментарии.
Этапы создания программы с использованием TASM.
Создание программы, которая будет работать в операционной системе MS-DOS включает в себя следующие шаги:
Пример: возвести число в куб
Если нам понадобится вычислить х³, где х занимает ровно один байт, то на Ассемблере это будет выглядеть так.
Первый вариант
mov al, x ; Пересылаем x в регистр AL
imul al ; Умножаем регистр AL на себя, AX = x * x
movsx bx, x ; Пересылаем x в регистр BX со знаковым расширением
imul bx ; Умножаем AX на BX. Результат разместится в DX:AX
Второй вариант
mov al, x ; Пересылаем x в регистр AL
imul al ; Умножаем регистр AL на себя, AX = x * x
cwde ; Расширяем AX до EAX
movsx ebx, x ; Пересылаем x в регистр EBX со знаковым расширением
imul ebx ; Умножаем EAX на EBX. Поскольку x – 1-байтовая переменная, результат благополучно помещается в EAX
На любом высокоуровневом языке возвести число в куб можно одной строкой. Например:
x = Math.pow(x,3); x := exp(ln(x) * 3); на худой конец x = x*x*x.
Хитрость в том, что когда каждая из этих строк будет сведена к машинному коду, этого кода может быть и 5 команд, и 10, и 50, и даже 100. Чего стоит вызов объекта Math и его метода pow: только на эту служебную операцию (ещё до самого возведения в куб) может уйти несколько сотен и даже тысяч машинных команд.
А на Ассемблере это гарантированно пять команд. Ну, или как реализуете.
Почему это круто
Ассемблер позволяет работать с процессором и памятью напрямую — и делать это очень быстро. Дело в том, что в Ассемблере почти не тратится зря процессорное время. Если процессор работает на частоте 3 гигагерца — а это примерно 3 миллиарда процессорных команд в секунду, — то очень хороший код на Ассемблере будет выполнять примерно 2,5 миллиарда команд в секунду. Для сравнения, JavaScript или Python выполнят в тысячу раз меньше команд за то же время.
Ещё программы на Ассемблере занимают очень мало места в памяти. Именно поэтому на этом языке пишут драйверы, которые встраивают прямо в устройства, или управляющие программы, которые занимают несколько килобайт. Например, программа, которая находится в брелоке сигнализации и управляет безопасностью всей машины, занимает всего пару десятков килобайт. А всё потому, что она написана для конкретного процессора и использует его возможности на сто процентов.
Справедливости ради отметим, что современные компиляторы С++ дают машинный код, близкий по быстродействию к Ассемблеру, но всё равно немного уступают ему.
Вызываем printf из программы на flat assembler (FASM)
flat assembler, в отличие от MASM, практически не делает ничего, что программист не написал явно в исходном коде. В ОС Windows исполняемые файлы и библиотеки имеют формат Portable Executable (PE). Если вы создаете при помощи FASM программу, которая будет выполняться в ОС Windows, то вы должны сами описать в файле исходного кода некоторые части исполняемого файла Portable Executable (чего в MASM вам делать не пришлось бы). Например, вы должны сами описать секции данных, кода, импорта, экспорта, ресурсов и пр. Для программы HelloWorld нужны три секции: кода, данных и импорта. С секциями кода и данных всё очевидно. В секцию импорта помещается информация о функциях, которые наша программа вызывает из различных библиотек. Нам нужно поместить в секцию импорта данные о функциях стандартной библиотеки языка C (msvcrt.dll), которые мы используем в программе. В программе, показанной ниже, я использую две функции: printf и exit. Но каков формат данных в секции импорта? К счастью, мы можем об этом не думать — в заголовочном файле /INCLUDE/MACRO/IMPORT32.INC находятся макросы library и import, которые генерируют данные для секции импорта; программисту нужно лишь указать этим макросам имя файла библиотеки и названия функций. Об этих макросах читайте раздел 3.1.2 документа flat assembler Programmer’s Manual. Пример описания секции импорта без использования макросов library и import находится в файле /EXAMPLES/PEDEMO/PEDEMO.ASM. Достигнуть некоторого просветления в понимании формата Portable Executable мне помогли следующие ресурсы:
Ниже приведен код программы HelloWorld на FASM:
Пояснения к программе HelloWorld на FASM
format PE console определяет формат двоичного файла, который должен сгенерировать компилятор; формат — Portable Executable, подсистема — console.
entry main устанавливает точку входа в программу — функцию main.
use32 заставляет компилятор генерировать 32-разрядный машинный код.
section ‘.text’ code readable executable описывает секцию кода. ‘.text’ — это имя секции (имена секций, насколько я понимаю, не несут никакой функциональной нагрузки и могут быть любыми, но не длиннее 8 символов). code readable executable — атрибуты (флаги), которые характеризуют секцию как секцию кода, содержимое которой можно читать и исполнять.
section ‘.data’ data readable writeable секция данных, для которой разрешены чтение и запись.
section ‘.idata’ data import readable секция импорта, в которой описывается, какие функции из каких библиотек использует наша программа. О том, как устроена секция импорта в файле PE хорошо написано в книге П. В. Румянцева «Работа с файлами в win32 API» в разделе Импорт функций и механизм импорта. Раздел импорта состоит, грубо говоря, из двух массивов. Массив структур IMAGE_IMPORT_DESCRIPTOR (определения структур см. в заголовочном файле WinNT.h) содержит информацию об используемых нашей программой библиотеках. Количество элементов в массиве равно количеству библиотек. В каждом элементе этого массива содержится имя библиотеки, из которой импортируются функции, и указатель FirstThunk, который указывает на массив структур IMAGE_THUNK_DATA. Каждый элемент массива структур IMAGE_THUNK_DATA содержит информацию об одной импортируемой функции — это либо ее порядковый номер (ordinal), либо указатель на структуру IMAGE_IMPORT_BY_NAME, которая содержит имя функции.
printf: jmp [imp_printf] Команда вида jmp [metka] выполняет прыжок по адресу, который берется из участка памяти, на который указывает метка metka. Не путайте эту команду с командой jmp metka, которая выполняет прыжок по адресу, на который указывает метка metka. В приведенной выше команде imp_printf — это метка, которая указывает на структуру IMAGE_THUNK_DATA. При загрузке исполняемого файла в память загрузчик помещает в место в памяти, на которое указывает imp_printf адрес функции printf в библиотеке msvcrt.dll. Так что команда printf: jmp [imp_printf] прыгает на функцию printf.
Ну и наконец, я хотел бы показать, как выглядит наша программа без макросов library и import:
; FASM version of HelloWorld program using printf() function format PE console entry main use32 ; ========== CODE SECTION ========== section ‘.text’ code readable executable main: push message call [printf] add esp, 4 push 0 call [exit] ; ========== DATA SECTION ========== section ‘.data’ data readable writeable message db «Hello, World!», 0 ; ========== IMPORT SECTION ========== section ‘.idata’ data import readable ; — array of IMAGE_IMPORT_DESCRIPTOR structures — dd 0, 0, 0, RVA msvcrt_name, RVA msvcrt_table dd 0, 0, 0, 0, 0 ; — ; — array of IMAGE_THUNK_DATA structures — msvcrt_table: printf dd RVA _printf exit dd RVA _exit dd 0 ; — msvcrt_name db ‘MSVCRT.DLL’, 0 ; IMAGE_IMPORT_BY_NAME structure _printf: dw 0 db ‘printf’, 0 ; IMAGE_IMPORT_BY_NAME structure _exit: dw 0 db ‘exit’, 0
Почему это сложно
Для того, чтобы писать программы на Ассемблере, нужно очень любить кремний:
Теперь добавьте к этому отсутствие большинства привычных библиотек для работы с чем угодно, сложность чтения текста программы, медленную скорость разработки — и вы получите полное представление о программировании на Ассемблере.
Для чего всё это
Ассемблер незаменим в таких вещах:
На самом деле на Ассемблере можно даже запилить свой сайт с форумом, если у программиста хватает квалификации. Но чаще всего Ассемблер используют там, где даже скорости и возможностей C++ недостаточно.