Rambler's
Top100

Использование ассемблера NASM в Windows

Автор: lonesome TSH/Digital Daemons
Дата: .02.2003
Раздел: Низкоуровневое программирование в Windows

Ассемблер NASM - один из лучших (если вообще не лучший) ассемблер для UNIX-подобных операционных систем. Естественно, когда я столкнулся с программированием на ассемблере для Windows, мне захотелось использовать в работе именно NASM, но поскольку под Windows традиционно используются MASM (MASM32) и TASM, то потребовались небольшие усилия, ибо одного "голого" NASM'a (всмысле NASM/w32) недостаточно.

Во первых - линкер (компоновщик). NASM создавался как кроссплатформенный ассемблер, поэтому линкера в комплекте нет. К счастью существует отличный бесплатный линкер для Windows - ALink. Есть возможность прикрутить к NASM и другие линкеры (например тот же самый tlink32 из TASM), но я изначательно ориентировался на свободно распространяемый (и к тому же отлично работающий софт). Кстати, скачивая ALink не забудьте про лежащий отдельно файлик WIN32.LIB, который нужен будет при компоновке, если вы собираетесь вызывать Win32 API функции (а если вы не собираетесь их вызывать, тогда зачем вы программируете под Windows? :)).

Во вторых в поставке нет включаемых файлов (.inc) с определениями констант и функций. Тем не менее если вы не собираетесь программировать новый Office, то в принципе они не нужны. За константами и форматом структур всегда можно слазить в документацию от Microsoft (а она вам понадобится в любом случае, если вы программируете под Windows на языке отличном от Visual Basic), а уж определить функцию как, например, extern LoadLibraryA, - так это вообще проблем не вызывает.

В третьих, вместо того, чтобы разлагольствовать, я лучше покажу исходник стандартной программы "Hello Billy" :)

;Импортируемые функции:
extern MessageBoxA 
extern ExitProcess 
 
%define MB_EXCLAMATION 48 ;Объявление константы
 
[segment code public use32 class='CODE'] ;Сегмент кода
 
..start: ;Точка входа
push dword MB_EXCLAMATION
push dword msg_title 
push dword msg 
push dword 0 
call MessageBoxA 
 
push dword 0 
call ExitProcess 
 
msg db "Hello Billy!",0 
msg_title db "winhello",0 

Исходник winhello.asm

Компиляция:
nasm -fobj winhello.asm

Компоновка:
alink -oPE winhello.obj win32.lib

Rambler's Top100