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-функций
Всем хорошего дня, вечера или ночи ;)