| Programmer’s Large File Text Editor, HiEditor | |
|
Programmer’s Large File Text Editor, HiEditor, the ultra fast Large File Text Editor with syntax highlight for programmers has been released.
Download ver. 1.0.1.7 |
| WinAsm Studio | |
|
WinAsm Studio is a free Assembler IDE for developing 32-bit Windows and 16-bit DOS programs.
Download ver. 5.1.5.0 |
| WinAsm Studio Upgrade | |
|
WinAsm Studio is a free Assembler IDE for developing 32-bit Windows and 16-bit DOS programs.
Download ver. 5.1.8.8 |
| ASM Visual | |
|
Powerful Assembler IDE, the most relevant now: masm, tasm, fasm for Windows developing 32-bit and 64-bit.
Download page |
We have been collecting useful stuff from the winasm.org community and grouping it here, in the Downloads area.
Among others, you will find downloads related to the WinAsm Studio Assembler IDE.
If you want to visit the old download page, please go here
flat assembler
Open source assembly language compiler.
The flat assembler (abbreviated to fasm, intentionally stylized with lowercase letters) is a fast assembler running in a variety of operating systems, in continued development since 1999.
It was designed primarily for the assembly of x86 instructions and it supports x86 and x86-64 instructions sets with extensions like MMX, 3DNow!, SSE up to SSE4, AVX, AVX2, XOP, and AVX-512. It can produce output in plain binary, MZ, PE, COFF or ELF format.
It includes a powerful but simple macroinstruction system and does multiple passes to optimize the size of instruction codes.
The flat assembler is self-hosting and complete source code is included.
The only difference between flat assembler versions included in the following packages is the operating system on which they can be run.
For any given source text each version is going to generate exactly the same output file, therefore every one of the following releases can be used to compile programs for any operating system.
|
The flat assembler is made by a single person — Tomasz Grysztar — as a hobby project. Although it is an open-source freeware, donations are appreciated to help cover cost and time-loss. It is a great help in maintaining this project. If you would like to make a donation to the author, please click the button beside. |
|
|
flat assembler 1.73.32 for Windows size: 1038 kilobytes last update: 21 Sep 2024 12:13:15 UTC |
Apart from the command line version for Windows console this package contains the one with integrated syntax-highlighting editor, so you can edit, compile and execute your programs from one place. It also contains the set of includes with equates and macroinstructions for Windows programming and some examples of Windows programs created with help of them. The provided documentation is in PDF format. |
|
flat assembler 1.73.32 for Linux size: 342 kilobytes last update: 04 Dec 2023 16:27:25 UTC |
This is a version for the Linux systems running on x86 or x64 compatible processors. Includes the documentation in pure ASCII format and some examples of Linux programs. |
|
flat assembler 1.73.32 for DOS size: 448 kilobytes last update: 31 Mar 2024 12:04:55 UTC |
This version can be executed from command line of any operating system compatible with DOS and contains few tiny examples of DOS programs. It also contains the documentation in text format using DOS character set. If you want to use flat assembler from the command line of Windows system, you should use the Windows console version instead of this one. |
|
flat assembler 1.73.32 for Unix/libc size: 275 kilobytes last update: 04 Dec 2023 16:27:26 UTC |
This is version for all platforms that have support for the ELF object format and the C library, like OpenBSD or Zeta. The object file provided in this package can be linked with the 32-bit C library to create the final executable for any such system. The documentation in pure ASCII format is included. |
flat assembler 2 is now available as a set of scripts and headers based on flat assembler g. Except for the macroinstruction syntax, it is largely compatible with flat assembler 1, while adding several new features.
See the dedicated thread for more information.
|
flat assembler 2 size: 556 kilobytes last update: 04 Mar 2025 14:47:02 UTC |
This package (in continuous development) contains fasmg executables for Windows and 64-bit Linux, with fasm2 shell scripts for both systems. It also includes a version with integrated editor for Windows, automatically configured to use fasm2 headers. |
flat assembler g (abbreviated to fasmg) is a new assembly engine designed as a successor of the one used by flat assembler 1.
Instead of having a built-in support for x86 instructions, it implements them through additional packages and in the same way it can be adapted to assemble for different architectures and purposes.
With the included example packages it is capable of generating all the output formats that flat assembler 1 could and additional ones, like Mach-O or Intel HEX.
|
flat assembler g kp60 size: 527 kilobytes last update: 31 Jan 2025 12:20:20 UTC |
This release contains executables for Linux, Windows and MacOS. It is packaged with examples of macroinstructions that allow assembly of simple programs for the architectures like x86, x64, 8052, AVR, or Java Virtual Machine. More examples and instructions set definitions for other architectures can be found in the further sections of this website. |
The following are third-party products based on flat assembler, available to download from their respective websites.
| FASMARM | A cross-assembler for ARM architectures based on flat assembler 1, available in versions for Windows and Linux. |
Время на прочтение5 мин
Количество просмотров176K
В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под Windows и Linux, а также указать ссылки на ресурсы и книги, посвященные изучению данной темы.
MASM
Используется для создания драйверов под Windows.
По ссылке переходим на сайт и скачиваем пакет (masm32v11r.zip). После инсталляции программы на диске создается папка с нашим пакетом C:\masm32. Создадим программу prog11.asm, которая ничего не делает.
.586P
.model flat, stdcall
_data segment
_data ends
_text segment
start:
ret
_text ends
end start
Произведём ассемблирование (трансляцию) файла prog11.asm, используя ассемблер с сайта masm32.
Ключ /coff используется здесь для трансляции 32-битных программ.
Линковка производится командой link /subsystem:windows prog11.obj (link /subsystem:console prog11.obj)
Как сказано в Википедии
MASM — один из немногих инструментов разработки Microsoft, для которых не было отдельных 16- и 32-битных версий.
Также ассемблер версии 6. можно взять на сайте Кипа Ирвина kipirvine.com/asm, автора книги «Язык ассемблера для процессоров Intel».
Кстати, вот ссылка на личный сайт Владислава Пирогова, автора книги “Ассемблер для Windows”.
MASM с сайта Microsoft
Далее скачаем MASM (версия 8.0) с сайта Microsoft по ссылке. Загруженный файл носит название «MASMsetup.exe». При запуске этого файла получаем сообщение -«Microsoft Visual C++ Express Edition 2005 required».
Открываем этот файл архиватором (например 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.
TASM
Программный пакет компании 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:
Ключ /coff здесь не используется.
Линковка производится файлом link16.exe
Вот здесь приводится порядок действий, которые необходимо выполнить для запуска TASM в DOSbox. Для линковки понадобится файл DPMI16BI.OVL
FASM
В статье Криса Касперски «Сравнение ассемблерных трансляторов» написано, что «FASM — неординарный и весьма самобытный, но увы, игрушечный ассемблер. Пригоден для мелких задач типа „hello, world“, вирусов, демок и прочих произведений хакерского творчества.»
Скачаем FASM с официального сайта. Инсталлятора нет, просто извлекаем программу. Откроем fasm editor — C:\fasm\fasmw.exe. В папке C:\fasm\EXAMPLES\HELLO есть файл HELLO.asm.
include 'win32ax.inc'
.code
start:
invoke MessageBox,HWND_DESKTOP,"Hi! I'm the example program!",invoke GetCommandLine,MB_OK
invoke ExitProcess,0
.end start
Откроем файл HELLO.asm из fasmw.exe. Изменим строку include ‘win32ax.inc’ на строку include ‘c:\fasm\INCLUDE\WIN32AX.INC’. Запускаем из меню Run → Run.
Вот ссылки на ресурсы, посвященные FASM:
→ FASM на Cyberforum’е
→ FASM на asmworld .com программы под Dos
→ Цикл статей «Ассемблер под Windows для чайников»
→ Сайт на narod’е
FASM в Linux
Для того, использовать FASM в Linux (у меня Ubuntu), скачаем соответствующий дистрибутив (fasm-1.71.60.tgz), распакуем его, в папке у нас будет бинарный файл fasm, копируем этот файл в /usr/local/bin для того, чтобы можно было запускать его из консоли, как любую другую команду.Выполним ассемблирование программы hello.asm из папки fasm/examples/elfexe/hello.asm.
Корректность работы программы можно проверить в отладчике.
Nasm
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” есть на личном сайте автора.
%include "stud_io.inc"
global _start
section .text
_start: mov eax, 0
again: PRINT "Hello"
PUTCHAR 10
inc eax
cmp eax, 5
jl again
FINISH
Выполним ассемблирование и линковку и запустим файл hello.asm.
$ nasm -f elf hello.asm
$ ld hello.o -o hello
$ ./hello
Для 64bit необходимо использовать команду nasm -f elf64 hello.asm
NASM для Windows
NASM для Windows можно установить, скачав соответствующий дистрибутив с соответствующего сайта.
Ассемблирование:
nasm -f bin имя_файла.asm -o имя_файла.com
Ссылки на ресурсы, посвященные Nasm:
→ Сайт А.В. Столярова
→ Сайт, на котором лежит электронный учебник (в архиве)
→ То же самое
AS
Стандартный ассемблер практически во всех разновидностях UNIX, в том числе Linux и BSD. Свободная версия этого ассемблера называется GAS (GNU assembler). Позволяет транслировать программы с помощью компилятора GCC.
Из учебников удалось найти только книгу на английском «Programming from the ground up». На русском удалось найти только одну главу из книги С. Зубкова «Assembler для DOS, Windows и UNIX».
Возьмем пример программы, которая ничего не делает, с сайта. Создадим программу gas.s
.section .text
.globl _start
_start:
movl $1, %eax
movl $2, %ebx
int $0x80
Выполним ассемблирование (трансляцию), линковку и запуск программы:
$ as -o gas.o gas.s
$ ld -o gas gas.o
$ ./gas
Если в данной программе изменить _start на main, то можно выполнить ассемблирование (трансляцию) и линковку компилятором gcc.
.section .text
.globl main
main:
movl $1, %eax
movl $2, %ebx
int $0x80
Выполним ассемблирование (трансляцию), линковку и запуск программы:
$ gcc gas.s -o gas
$ ./gas
Выводы: если вы изучаете программирование под Windows, то вы можете остановить свой выбор на Masm; Tasm больше не поддерживается, но для обучения по старым классическим учебникам подойдёт.
Под Linux Gas подойдет тем, кто использует GCC, а тем, кому не нравится синтаксис Gas, подойдёт Nasm.
P.S. Про обработку строк в ассемблере на примере создания транслятора простого «эзотерического» языка можно прочитать здесь.
P.P.S. Упрощенный ограниченный набор ассемблерных инструкций используется в учебной модели компьютера Little Man Computer, которому у меня также посвящено несколько статей ссылка.
by Steve Hutchesson
One of the best software development tools for assembler language programming
Operating system: Windows
Publisher:
Steve Hutchesson
Antivirus check: passed
Report a Problem
MASM32 is a go-to application for programmers who like to have precision and authority while programming in assembly language for Windows-based projects. It has grown over the past 30 years into a mammoth software that is both loved and cared for by the programming community. This tool while being maintained by one of the major Operating System Vendors has never been compromised in any shape or form. It has been kept true to its core which is the reason why it is still being used by so many programmers to date.
MSM32 SDK is compatible with the latest versions of windows as it is constantly updated. While the minimum requirements are Win2000 or higher. Containing more than 200 procedural methods for writing general-purpose code that provides high performance. Up-to-date library for Ray Filiatreault’s floating point along with tutorials. The editor is fast, small, and can manage two separate scripting engines. It also provides compatibility with legacy scripts. Works with large API functions that can be used along with huge IMPORT libraries. However, MASM32 demands a higher level of expertise but the main benefit is the performance and the level of flexibility it offers which goes far ahead what any current compilers can achieve.
Been in the market for over 30 years of maintenance and updates
There is an active community on the official forum who are always willing and happy to assist in times of trouble. Determining factors for this project to have been successful for so many years. The software comes with a free license which means its free to use for anyone who would like to learn or write code with it.
It is advised that programmers who are experienced and well-versed in developing code for 32-bit versions of Windows use this software. It requires advanced technical processes to be followed while using other. Although some prebuilt scripts can be used to develop working templates for assembler projects.
Features:
- Updated console GUI helps in developing code for testing and algorithms
- Example code available for developing algorithms and expanding own design
- Pelle’s tool resource compiler and linked available
- Latest CHM format incorporated into the Help File system is especially useful where Winhelp isn’t supported
- The latest library for Ray Filiatreault’s floating point included along with examples and tutorials
- Easy to download and install is up and running in no time
Follow the list of free material to be downloaded needed about either Intel Corporation or Microsoft Corporation
PIV manuals required for mnemonic and architecture reference
MASM32 SDK requires intense programming skills
Provides direct access to computer’s hardware for programming.
Supports macros and conditional assembly for flexible coding.
Comes with a comprehensive set of libraries and helper modules.
Steep learning curve, especially for beginners.
Limited or no support for 64-bit programming.
Lacks a user-friendly, intuitive interface.
Calum
Thu, Jan 11, 2024
MASM32 is a useful app for those who do assembler language programming. The fact that it contains 200 procedural methods for writing general-purpose code makes it desirable for app developers around the world. Moreover, it is free and can be used on latest versions of windows. As the app is used with Microsoft’s Visual C++ compiler, it allows programmers to create applications and games for Windows. Many users find the app easy to set up and install, and they like the tutorial videos on the website. One more good thing is that the app gets constant updates. If you get any problem while using the app, there is a helpful support team which is ready to quickly help you.MASM32 is a good tool for learning and developing assembly language applications.
👨💻️ USER REVIEWS AND COMMENTS 💬
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Michael
A workable development environment for programmers interest in learning or creating 32 bit Microsoft assembler is the MASM32 SDK version 11. (MASM). the correct directory tree structure is installed using an automated process on the local drive of your choice. An independent project called the MASM32 SDK was created to make it simpler for seasoned for programmers to transition into the world of assembly language development
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Jayden V.
MASM32 is a software development kit (SDK) created to develop applications in x86 assembly language targeting 32-bit Windows operating systems. The SDK consists of a set of tools including an assembler, linker, resource compiler, library manager and debugger. It is designed to be used with Microsoft’s Visual C++ compiler, allowing developers to create Windows-compatible applications and games.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Dylan Grigley
MASM32 is a great software for assembly language programming. It has an intuitive user interface and the generated code is optimized for run-time performance. I found it very easy to set up and install, and the tutorial videos on the website are helpful. The code is well organized and easy to read, making it easier to debug. It also supports a wide range of assembly language instructions and works with multiple versions of Windows. The support team is knowledgeable and helpful with any problems I had. In short, MASM32 is a great tool to learn and develop assembly language applications.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Archie G.
Masm32 has been an invaluable tool for me as an assembly programmer. It is an easy to use Integrated Development Environment with a comprehensive library of routines and tools. I find the debugging features to be very useful for debugging assembly codes. The IDE’s syntax highlighting and auto-complete features are very helpful in writing clean and efficient code. The support from the Masm32 community is excellent. I have also found that the Masm32 package is quite stable and rarely crashes. I am very impressed with this software and I am glad I chose it for my assembly programming.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Ewan D*********s
I found MASM32 to be a bit confusing and overwheling at firs, but after a shor period of time I was able to get used to it and found it to be quite user friendly.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Harris Sunquist
MASM32 is an assembly language development software that enables programmers to write highly efficient and optimized code for Windows-based applications. The software provides tools and libraries for creating 32-bit and 64-bit applications, including support for the latest hardware and operating systems. It includes a powerful macro assembler, linker, and debugger, along with a comprehensive set of programming tools and utilities. MASM32 is highly customizable and can be used to develop a wide range of applications, from system utilities to games and multimedia software. Its main features include support for multiple programming languages, advanced optimization techniques, and a rich set of libraries and tools for code development and debugging.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
William L.
MASM32 software is a powerful tool for developing 32-bit Windows applications in assembly language.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
James
MASM32 is a comprehensive assembler software kit targeted at the Intel x86 family of processors. It facilitates the development of 32-bit Windows software by providing a rich set of libraries and a user-friendly environment. The key feature of MASM32 is its macro processing facility, which allows for easier development and maintenance of large assembly language programs.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Nathan
A powerful yet complex assembler with a multitude of library functions to explore.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Cooper
Powerful, versatile with steep learning curve. Limited debugging capabilities.
image/svg+xmlBotttsPablo Stanleyhttps://bottts.com/Florian Körner
Andrew
Versatile, complex assembly language environment.
assembler program, easy coding, lots of tutorials, great for beginners
NVIDIA FleX is a particle-based simulation library for real-time visual effects that can simulate a variety of rigid bodies, fluids, and soft bodies.
Wimlib is an open source, cross-platform library and command-line program for creating, extracting, and modifying Windows Imaging (WIM) archives.
VapourSynth is an open-source video processing library and a set of tools designed to allow easy manipulation of video data.
AForge.NET is a free, open-source library of image processing, computer vision, artificial intelligence, genetic algorithms, and other related algorithms for the .NET framework.
PySide is a Python binding of the cross-platform GUI toolkit Qt.
Последнее обновление: 12.10.2023
NASM является кроссплатформенным ассемблером, который доступен в том числе и на Windows. Рассмотрим, как использовать NASM на Windows.
Установка
Для работы с NASM нам надо установить непосредственно сам ассемблер. Для этого на официальном сайте перейдем на страницу https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/win64/,
где находятся файлы ассемблера NASM версии 2.16.01 для 64-разрядной версии Windows:
Здесь нам доступен ассемблер в виде двух пакетов. Один пакет установщика (nasm-2.16.01-installer-x64.exe), а второй — архив (nasm-2.16.01-win64.zip).
Загрузим zip-архив.. Например, загрузим zip-архив и после загрузки распакуем его. В папке распакованного архива мы можем найти два файла
Это прежде всего сам ассемблер — файл nasm.exe и дизассемблер — файл ndisasm.exe
Чтобы не прописывать весь путь к ассемблеру, занесем его в переменные среды. Для этого можно в окне поиска в Windows ввести «изменение переменных среды текущего пользователя»:
Нам откроется окно Переменныех среды:
И добавим путь к ассемблеру. Например, в моем случае архив ассемблера распакован в папку C:\nasm-2.16.01, соответственно я указываю
в переменной Path среды эту папку:
Если все настроено правильно, то мы можем запустить командную строку и с помощью команды nasm -v узнать текущую версию ассемблера:
C:\Users\eugen>nasm -v NASM version 2.16.01 compiled on Dec 21 2022 C:\Users\eugen>
Начало работы с NASM
Определим в файловой системе каталог для файлов с исходным кодом и создадим в нем следующий файл hello.asm:
global _start ; делаем метку метку _start видимой извне
section .text ; объявление секции кода
_start: ; метка _start - точка входа в программу
mov rax, 22 ; произвольный код возврата - 22
ret ; выход из программы
Рассмотрим поэтапно данный код. Вначале идет директива global:
global _start
Данная директива делает видимой извне определенную метку программы. В данном случае метку _start, которая является точкой входа в программу. Благодаря этому компоновщик при компоновке программы в исполняемый файл сможет увидеть данную метку.
Затем идет секция кода программы, которая и определяет выполняемые программой действия. Для определения секции применяется директива
section, после которой указывается имя секции. Причем секция кода программы должна называться .text.
section .text
Далее собственно идет код программы. И он начинается с определения метки _start, на которую собственно и проецируется
программа. Сама по себе метка представляет произвольное название, после которого идет двоеточие. После двоеточия могут идти инструкции программы или определения данных.
Метка _start выступает в качестве точки входа в программу. Название подобной метки произвольное, но обычно это или _start или _main
Наша программа не производит какой-то феноменальной работы. Все что она делает — это помещает в регистр rax число 22 и завершается. Для помещения числа в регистр применяется инструкция
mov:
mov rax, 22
Инструкция mov помещает в первый операнд — регистр rax значение из второго операнда — число 22.
Затем идет вызов инструкции ret, которая завершает программу
ret
Кроме директив и инструкций, которые определяют действия программы, также следует отметить комментарии. Комментарии начинаются с точки с запятой ;. Комментарии не учитываются при компиляции,
никак не влияют на объект или работоспособность программы и нужны лишь в качестве текстового описания отдельных строк или блоков программы.
global _start ; делаем метку метку _start видимой извне - это текст комментария
Компиляция
Для компиляции откроем командную строку, перейдем в ней к папке с исходным кодом (где располагается файл hello.asm) и выполним следующую команду
nasm -f win64 hello.asm -o hello.o
Здесь с помощью опции -f указывается формат файла, в который мы хотим скомпилировать код.
Для 64-разрядной ОС Windows это — win64. После этого указывается файл, который мы хотим скомпилировать — наш файл hello.asm.
Затем опция -o hello.o указывает на имя скомпилированного файла. В результате выполнения этой команды будет создан объектный файл hello.o
Однако файл hello.o — это объектный файл, а не исполняемый. Он содержит машинный код, который понимает компьютер, но чтобы его можно было запускать как обычную
программу, его надо скомпоновать в исполняемый файл. И для этого нужна программа компоновщика (он же линковщик/линкер или linker).
Недостатком NASM является то, что он не предоставляет встроенного компоновщика. И нам надо использовать внешнюю программу компоновки. Где ее взять?
Далее я рассмотрю два варианта — использование компоновщика из пакета GCC и использование компоновщика компилятора Visual C/C++, который идет вместе с Visual Studio. Оба варианта равноценны.
Компоновка с помощью GCC
Вначале нам надо установить пакет GCC. Пакет компиляторов GCC для Windows не имеет какого-то одного единого разработчика, разные организации могут выпускать свои сборки. Для Windows одной из наиболее популярных версий GCC является пакет средств для разработки от
некоммерческого проекта MSYS2. Следует отметить, что для MSYS2 требуется 64-битная версия Windows 7 и выше (то есть Vista, XP и более ранние версии не подходят)
Итак, загрузим программу установки MSYS2 с официального сайта MSYS2:
После загрузки запустим программу установки:
На первом шаге установки будет предложено установить каталог для установки. По умолчанию это каталог C:\msys64:
Оставим каталог установки по умолчанию (при желании можно изменить). На следующем шаге устанавливаются настройки для ярлыка для меню Пуск, и затем собственно будет произведена установка.
После завершения установки нам отобразить финальное окно, в котором нажмем на кнопку Завершить
После завершения установки запустится консольное приложение MSYS2.exe. Если по каким-то причинам оно не запустилось,
то в папке установки C:/msys64 надо найти файл usrt_64.exe:
Теперь нам надо установить собственно набор компиляторов GCC. Для этого введем в этом приложении следующую команду:
pacman -S mingw-w64-ucrt-x86_64-gcc
Для управления пакетами MSYS2 использует пакетный менеджер Packman. И данная команда говорит пакетному менелжеру packman установить пакет mingw-w64-ucrt-x86_64-gcc,
который представляет набор компиляторов GCC (название устанавливаемого пакета указывается после параметра -S).
Если после завершения установки мы откроем каталог установки и зайдем в нем в папку C:\msys64\ucrt64\bin,
то найдем там файл компоновщика ld
Для упрощения запуска компоновщика мы можем добавить путь к нему в Переменные среды:
Чтобы убедиться, что нам доступен компоновщик GCC — программа ld, введем следующую команду:
ld --version
В этом случае нам должна отобразиться версия компоновщика
c:\asm>ld --version GNU ld (GNU Binutils) 2.40 Copyright (C) 2023 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty. c:\asm>
Теперь скомпонуем файл hello.o в исполняемый файл hello.exe с помощью следующей команды:
ld hello.o -o hello.exe
Мы можем запустить этот файл, введя в консоли его название и нажав на Enter. Но наша программа ничего не выводит на консоль, поэтому после запуска программы мы ничего не увидим. Тем не менее
наша программа устанавливает регистр RAX. А значение этого регистра при завершении программы рассматривается в Windows как статусный код возврата, который сигнализирует, как завершилась программа (успешно или не успешно).
И мы можем этот статусный код получить, если после выполнения программы введем команду
echo %ERRORLEVEL%
И нам должно отобразится число 22 — значение регистра RAX. Полный консольный вывод:
c:\asm>nasm -f win64 hello.asm -o hello.o c:\asm>ld hello.o -o hello.exe c:\asm>hello.exe c:\asm>echo %ERRORLEVEL% 22 c:\asm>
Установка компоновщика link.exe
Компоновщик от GCC — не единственный компоновщик, который можно использовать для компоновки программы на Windows. Еще один вариант представляет компоновщик
link.exe из пакета инструментов разработки для C/C++ для Visual Studio. Условным плюсом этого компоновщика может быть то, что его
разработчик — Microsoft, поэтому можно ожидать более лучшей интеграции с Windows. Поэтому также рассмотрим и этот способ.
Сперва нам надо установить для Visual Studio инструменты разработки для C/C++. Установщик для среды Visual Studio можно загрузить по следующему адресу:
Microsoft Visual Studio 2022. После загрузки программы установщика Visual Studio запустим ее и в окне устанавливаемых
опций выберем пункт Разработка классических приложений на C++:
И нажмем на кнопку установки.
В зависимости от конкретной подверсии и номера сборки Visual Studio точное расположение файлов может варьироваться. Например, в моем случае это папка
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x64\. И в этой папке можно найти программу компоновщика link.exe.
Причем при обновлениях Visual Studio этот расположение может измениться, так как при обновлении меняется и версия Visual Studio. Поэтому к конкретным путям можно не цепляться. Вместо этого
мы можем перейти к меню Пуск и в списке программ найти пункт Visual Studio и подпункт
x64 Native Tools Command Prompt for VS 2022
Нам должна открыться консоль. Введем в нее link, и нам отобразится версия ассемблера и некоторая дополнительная информация:
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.7.4
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
C:\Program Files\Microsoft Visual Studio\2022\Community>link
Microsoft (R) Incremental Linker Version 14.37.32824.0
Copyright (C) Microsoft Corporation. All rights reserved.
usage: LINK [options] [files] [@commandfile]
options:
/ALIGN:#
/ALLOWBIND[:NO]
/ALLOWISOLATION[:NO]
/APPCONTAINER[:NO]
/ASSEMBLYDEBUG[:DISABLE]
/ASSEMBLYLINKRESOURCE:filename
/ASSEMBLYMODULE:filename
/ASSEMBLYRESOURCE:filename[,[name][,PRIVATE]]
/BASE:{address[,size]|@filename,key}
/CLRIMAGETYPE:{IJW|PURE|SAFE|SAFE32BITPREFERRED}
/CLRLOADEROPTIMIZATION:{MD|MDH|NONE|SD}
/CLRSUPPORTLASTERROR[:{NO|SYSTEMDLL}]
/CLRTHREADATTRIBUTE:{MTA|NONE|STA}
/CLRUNMANAGEDCODECHECK[:NO]
/DEBUG[:{FASTLINK|FULL|NONE}]
............................
В частности, можно увидеть, что версия компоновщика — 14.37.32824.0 и все опции, которые можно передать программе при компоновке. Стоит отметить, что запуск этой этой утилиты фактически представляет запуск файла C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat —
он по сути вызывает другой файл — vcvarsall.bat, который собственно и настраивает окружение для выполнения ассемблера.
Используем этот компоновщик. Для этого откроем программу x64 Native Tools Command Prompt for VS 2022 и перейдем в ней к папке, где располагается объектный файл
hello.o. Затем выполним следующую команду
link hello.o /entry:_start /subsystem:console /out:hello2.exe
В данном случае компоновщику передаем ряд параметров:
-
собственно объектный файл hello.o, который будет компилироваться в исполняемое приложение
-
Параметр
/entry:_startуказывает компоновщику на точку входа в программу —
это наша метка «_start». -
Параметр
/subsystem:consoleуказывает компоновщику, что создается консольное (не графическое) приложение. -
Параметр
/out:hello2.exeустанавливает имя генерируемого файла приложение — оно будет называться «hello2.exe».
В результате будет создан файл hello2.exe, который мы также можем запускать:
c:\asm>link hello.o /entry:_start /subsystem:console /out:hello2.exe Microsoft (R) Incremental Linker Version 14.37.32824.0 Copyright (C) Microsoft Corporation. All rights reserved. c:\asm>hello2.exe c:\asm>echo %ERRORLEVEL% 22 c:\asm>
Создание первой программы на Windows
Теперь создадим более осмысленную программу, которая выводит на экран строку,kernel32.lib и для этого изменим файл hello.asm следующим образом:
global _start ; делаем метку метку _start видимой извне
extern WriteFile ; подключем функцию WriteFile
extern GetStdHandle ; подключем функцию GetStdHandle
section .data ; секция данных
message: db "Hello METANIT.COM!",10 ; строка для вывода на консоль
section .text ; объявление секции кода
_start: ; метка _start - точка входа в программу
sub rsp, 40 ; Для параметров функций WriteFile и GetStdHandle резервируем 40 байт (5 параметров по 8 байт)
mov rcx, -11 ; Аргумент для GetStdHandle - STD_OUTPUT
call GetStdHandle ; вызываем функцию GetStdHandle
mov rcx, rax ; Первый параметр WriteFile - в регистр RCX помещаем дескриптор файла - консоли
mov rdx, message ; Второй параметр WriteFile - загружаем указатель на строку в регистр RDX
mov r8d, 18 ; Третий параметр WriteFile - длина строки для записи в регистре R8D
xor r9, r9 ; Четвертый параметр WriteFile - адрес для получения записанных байтов
mov qword [rsp + 32], 0 ; Пятый параметр WriteFile
call WriteFile ; вызываем функцию WriteFile
add rsp, 40
ret ; выход из программы
Разберем эту программу. Для вывода строки на консоль нам надо использовать нативные функции GetStdHandle и WriteFile.
И чтобы воспользоваться этими функциями подключаем их с помощью директивы extern
extern WriteFile extern GetStdHandle
Далее идет определение секции данных — секции .data:
section .data ; секция данных message: db "Hello METANIT.COM!",10 ; строка для вывода на консоль
В секции .data определена метка message, на которую проецируется строка. По сути message — это переменная, которая представляет строку.
После метки указывается тип данных. Строка в ассемблере — это просто набор байтов, поэтому имеет тип db. Затем в кавычках определяется собственно выводимая строка — "Hello METANIT.COM!",10. Обратите внимание на 10 после строки — это код символа перевода строки. То есть при выводе мы ожидаем, что будет происходить перевод на другую строку.
Затем идет секция кода — секция .text и метка _start — точка входа в программу
section .text ; объявление секции кода _start: ; метка _start - точка входа в программу
В программе для вызова функций первым делом необходимо настроить стек. В частности, резервируем в стеке 40 байт для параметров функций GetStdHandle и WriteFile и при этом учитываем выравнивание
стека по 16-байтной границе. Указатель на верхушку стека хранится в регистре
rsp. Поэтому вычитаем с помощью инструкции sub из значения в регистре rsp 40 байт
sub rsp, 40
Почему 40? Прежде всего при вызове функций WinAPI (как в данном случае функций GetStdHandle и WriteFile) необходимо зарезервировать в стеке как минимум 32 байта — так называемое
«shadow storage» (теневое хранилище). Далее нам надо учитывать количество параметров функции. Пеовые 4 параметра функций передаются через регистры, а параметры начиная с 5-го передаются через стек.
Соответственно для 5-го и последующих параметров надо выделить в стеке область. Для каждого параметра вне зависимости от его размера выделяется 8 байт. Функция WriteFile как раз принимает 5 параметров, поэтому для нее надо выделить дополнительные 8 байт в стеке.
Поэтому получаем 32 байта + 8 байт (5-й параметр WriteLine) = 40 байт. Количество параметров смотрим по функции с наибольшим количеством параметров. Третий момент — нам надо учитывать, что перед вызовом функций WinAPI стек имел выравнивание по 16 байтовой границе, то есть значение в RSP
должно быть кратно 16. По умолчанию при вызове функции в стек помещается адрес возврата функии размером 8 байт. Поэтому наши 40 байт + 8 байт (адрес возврата из функции) дадут 48 байт — число кратное 16.
Вначале нам надо использовать встроенную функцию GetStdHandle(), которая позволяет получить дескриптор на устройство ввода-вывода. Она имеет следующее определение на C:
HANDLE WINAPI GetStdHandle( _In_ DWORD nStdHandle );
Функция GetStdHandle() получает числовой код устройства, с которым мы хотим взаимодействовать. В нашем случае нам надо получить устройство стандартного вывода (для вывода строки), которым по умолчанию является консоль. Для обращения к консоли надо передать число -11, которое надо поместить в
регистр rcx:
mov rcx, -11 ; Аргумент для GetStdHandle - STD_OUTPUT
После установки параметра этой функции вызываем ее с помощью инструкции call:
call GetStdHandle
В результате выполнения функция GetStdHandle возвращает дескриптор — объект, через который мы можем взаимодействовать с консолью. Этот дескриптор помещается в регистр
rax. Получив этот дескриптор, используем его для вывода на консоль строки с помощью функции WriteFile. Для справки ее определение на С++
BOOL WriteFile( [in] HANDLE hFile, [in] LPCVOID lpBuffer, [in] DWORD nNumberOfBytesToWrite, [out, optional] LPDWORD lpNumberOfBytesWritten, [in, out, optional] LPOVERLAPPED lpOverlapped );
Вызов функции GetStdHandle помещает в регистр rax дескриптор консоли. И для вывода строкии на консоль с помощью функции WriteFile нам надо поместить
этот дескриптор в регистр rcx
mov rcx, rax
Затем также с помощью инструкции mov загружаем в регистр rdx адрес выводимой строки
mov rdx, message
Далее в регистр r8d помещаем длину выводимой строки в байтах — в данном случае это 18 байт:
mov r8d, 18
Поскольку у нас строка с символами ASCII, и каждый символ эквивалентен 1 байту, то получаем, что в строке message с учетом последнего символа с числовым кодом 10 будет 18 байт.
Затем в регистре r9 устанавливаем адрес четвертого параметра функции WriteFile:
xor r9, r9
В данном случае нам не нужно количество считанных байтов, и с помощью инструкции xor обнуляем значение регистра r9.
Последний — пятый параметр функции WriteFile должен иметь значение NULL, по сути 0. Поэтому устанавливаем для него значение 0, смещаясь в стеке вперед на 32 байта (4 параметра * 8):
mov qword [rsp + 32], 0
Инструкция mov помещает значение в определенное место. Здесь в качестве значения служит число 0. А место определяется выражением
qword [rsp + 32]. qword указывает, что этот операнд описывает адрес размером в четыре слова, что означает 8 байтов (слово имеет длину 2 байта). То есть число 0 представляет 8-байтное значение и помещается по адресу rsp + 32.
И далее собственно вызываем функцию WriteFile:
call WriteFile
Этот вызов должен привести к выводу строки на консоль. После этого восстанавливаем значение верхушки стека. Для этого с помощью инструкции add прибавляем
к значению в регстре rsp ранее отнятые 40 байт:
add rsp, 40
И с помощью инструкции ret выходим из программы.
Компиляция
Поскольку теперь программа использует внешние функции WinApi — GetStdHandle и WriteFile, которые определены во внешней библиотеке kernel32.lib, то при компоновке
нам надо подключить эту библиотеку. В зависимости от используемого компоновщика/линкера этот процесс может немного отличаться. Например, при использовании компоновщика ld
из комплекта инструментов GCC все подключаемые библиотеки передаются с помощью опции -l:
ld hello.o -o hello.exe -l kernel32
Здесь последний параметр -l kernel32 как раз указывает, какую библиотеку надо подлючить, при чем название библиотеки указывается без расширения файла.
При использовании компоновщика link.exe от Microsoft подключаемая библиотека просто передается вместе с компонуемыми файлами:
link hello.o kernel32.lib /entry:_start /subsystem:console /out:hello2.exe
Итак, повторно скомпилируем файл и скомпонуем одним из компоновщиков. Затем запустим полученный исполняемый файл, и консоль должна вывести нам строку.
Полный процесс при использовании компоновщика ld из комплекта GCC:
c:\asm>nasm -f win64 hello.asm -o hello.o c:\asm>ld hello.o -o hello.exe -l kernel32 c:\asm>hello.exe Hello METANIT.COM! c:\asm>
Полный процесс при использовании компоновщика link от Microsoft (компоновка выполняется в программе x64 Native Tools Command Prompt for VS 2022):
c:\asm>nasm -f win64 hello.asm -o hello.o c:\asm>link hello.o kernel32.lib /entry:_start /subsystem:console /out:hello2.exe Microsoft (R) Incremental Linker Version 14.37.32824.0 Copyright (C) Microsoft Corporation. All rights reserved. c:\asm>hello2.exe Hello METANIT.COM! c:\asm>
