NASM. Generate programms for DOS and Windows x86 OS

Ниже представлены примеры создания программ для таких систем как DOS и Windows x86 на ассемблере NASM. Создание приложения под DOS.
1. Cоздаем исходник hello.asm

SECTION .text

org 0x100

mov ah, 0x9
mov dx, hello
int 0x21

mov ah, 0x4c
mov al, 0
int 0x21

SECTION .data

hello db "Hello, world!", 0xd, 0xa, '$'

2. запускаем компилятор NASM nasm -f bin -o hello.com hello.asm
На выходе получаем hello.com, при запуске которого на консоль выведется всем нам привычное сообщение - Hello, world!


Создание приложения под Windows x86
1. Cоздаем исходник msgbox.asm

;подключение заголовочного файла (определяющий типы аргументов функций WinAPI)
%include "win32n.inc"

;объявление внешней функции MessageBoxA (идентификатор)
EXTERN MessageBoxA

;связывание объявленной функции с соответствующей динамической библиотекой
IMPORT MessageBoxA user32.dll

;объявление внешней функции ExitProcess
EXTERN ExitProcess

;связывание объявленной функции с соответствующей динамической библиотекой
IMPORT ExitProcess kernel32.dll

;секция (сегмент) кода
SECTION CODE USE32 CLASS=CODE ;метка для компоновщика, указывающая на точку входа

;передача аргументов производится согласно соглашению STDCAL
;аргументы передаются через стек в порядке справа налево (так же, как и в C)
;очистка стека входит в обязанности вызванной функции (аналогично языку Pascal)

;помещение в стек последнего аргумента отвечающего за тип окна (с единственной кнопкой - OK)
push UINT MB_OK

;помещение в стек указателя (адрес нуль-завершенной строки) на строку заголовка
push LPCTSTR title

;помещение в стек указателя на строку сообщения
push LPCTSTR banner

;помещение в стек аргумента указывающего на родительское окно в нашем случае оно отсутствует
push HWND NULL

;вызов функции Windows API - MessageBoxA 
call [MessageBoxA]

;аргумент ExitProcess - код возврата
push UINT NULL

;завершение процесса
call [ExitProcess] 

;секция статических данных
SECTION DATA USE32 CLASS=DATA

;строка сообщения с символом EOL
banner db 'Hello, world!', 0xD, 0xA, 0

;строка заголовка
title db 'Hello', 0
2. запускаем компилятор

nasm -fobj msgbox.asm

В результате получим объектный файл msgbox.obj, который нужно передать компоновщику alink

alink -oPE msgbox

Параметр -o определяет тип исполняемого файла (родным для Windows является тип PE). Как итог - на выходе исполняемый exe-файл - msgbox.exe




На последок немного дополнительной информации. Создание исполняемого файла состоит из двух этапов: компиляция и компоновка. На первом этапе - компиляция (трансляция) исходного кода программы в некоторый объектный формат. Объектный формат содержит машинный код программы, но символы (переменные и другие идентификаторы) в объектном файле пока не привязаны к адресам памяти. На втором этапе, который называется компоновкой или линковкой (linking), из одного или нескольких объектных файлов создается исполняемый файл. Процедура компоновки состоит в том, что компоновщик связывает символы, определенные в основной программе, с символами, которые определены в ее модулях (учитываются директивы EXTERN и GLOBAL), после чего каждому символу назначается окончательный адрес памяти или обеспечивается его динамическое вычисление.

Для выполнения данных примеров необходимо обратиться к следующим ресурсам:

https://sourceforge.net/projects/nasm - NASM ассемблер
http://alink.sourceforge.net/ - alink компоновщик
win32n.inc - подключаемый заголовочный файл, для вызовов Win API-функций

Всем хорошего дня, вечера или ночи ;)