Меню Рубрики

Windows hello world nasm

Как написать hello world в ассемблере под Windows?

Я хотел написать что-то основное в сборке под Windows, я использую NASM, но я ничего не могу заставить работать.

Как написать и скомпилировать hello world без помощи функций C в Windows?

8 ответов

вызов libc stdio printf , осуществляет int main()

там же невежественные новички руководство Hello World в Nasm без использования библиотеки C. Тогда код будет выглядеть так.

16-битный код с системными вызовами MS-DOS: работает в эмуляторах DOS или в 32-битных окнах с поддержкой NTVDM. Невозможно запустить » напрямую» (прозрачно) под любой 64-разрядной Windows, потому что ядро x86-64 не может использовать режим vm86.

построить в .com исполняемый файл, поэтому он будет загружен на cs:100h со всеми регистрами сегмента, равными друг другу (крошечная модель памяти).

в этом примере показано, как перейти непосредственно к API Windows и не связываться в стандартной библиотеке C.

для компиляции вам понадобится NASM и LINK.EXE (из Visual studio Standard Edition)

это примеры Win32 и Win64 с использованием вызовов Windows API. Они предназначены для MASM, а не NASM, но посмотрите на них. Вы можете найти более подробную информацию в этой статьи.

чтобы собрать и связать их с помощью MASM, используйте это для 32-разрядного исполняемого файла:

или это для 64-битного исполняемого файла:

Плоский Ассемблер не нужен дополнительный компоновщик. Это делает программирование ассемблера довольно простым. Он также доступен для Linux.

это hello.asm из примеров Fasm:

Fasm создает исполняемый файл:

вы можете увидеть три звонка: GetCommandLine , MessageBox и ExitProcess .

получить .exe с NASM’Compiler и компоновщиком Visual Studio этот код отлично работает:

Если этот код сохранен, например, на » test64.asm», затем скомпилировать:

производит «test64.параметр obj» Затем перейти по ссылке из командной строки:

здесь path_to_link может быть C:\Program файлы (x86)\Microsoft Visual Studio 10.0\VC\bin или где ваша ссылка.exe программы на вашем компьютере, path_to_libs может быть C:\Program файлы (x86)\Windows Kits\8.1\Lib\winv6.3 \ um\x64 или где находятся ваши библиотеки (в этом случае оба kernel32.lib и библиотека user32.lib находятся на одном месте, в противном случае используйте один вариант для каждого пути, который вам нужен) и /largeaddressaware:нет опция необходима, чтобы избежать жалоб компоновщика на адреса long (для user32.lib в данном случае). Кроме того, как это делается здесь, если компоновщик Visual вызывается из командной строки, необходимо настроить среда ранее (запустите один раз vcvarsall.bat and/or see в MS c++ 2010 и mspdb100.dll файлы).

Если вы не позвоните некоторые функция это совсем не тривиально. (И, серьезно, нет никакой реальной разницы в сложности между вызовом printf и вызовом функции win32 api.)

даже DOS int 21h-это просто вызов функции, даже если это другой API.

Если вы хотите сделать это без помощи, вам нужно напрямую поговорить с вашим видеооборудованием, вероятно, написав растровые изображения букв «Hello world» в фреймбуфер. Даже тогда видеокарта выполнение работы по переводу этих значений памяти в сигналы VGA/DVI.

обратите внимание, что, действительно, ни один из этих вещей вплоть до аппаратного обеспечения не более интересен в ASM, чем в C. программа «hello world» сводится к вызову функции. Одна хорошая вещь в ASM заключается в том, что вы можете использовать любой ABI, который хотите, довольно легко; вам просто нужно знать, что такое ABI.

Если вы хотите использовать компоновщик NASM и Visual Studio (ссылка.exe) с примером Hello World от anderstornvig вам придется вручную связать с библиотекой времени выполнения C, содержащей функцию printf ().

надеюсь, это кому-то поможет.

лучшими примерами являются fasm, потому что fasm не использует компоновщик, который скрывает сложность программирования windows другим непрозрачным слоем сложности. Если вы довольны программой, которая записывает в окно gui, то есть пример для этого в каталоге примера fasm.

Если вы хотите консольную программу, которая позволяет перенаправление standard in и standard out, что также возможно. Существует (helas очень нетривиальная) примерная программа, Доступная, что не использует gui и работает строго с консолью, то есть с самим fasm. Это может быть сведено к основам. (Я написал четвертый компилятор, который является еще одним примером без gui, но он также нетривиален).

такая программа имеет следующую команду для создания надлежащего исполняемого заголовка, обычно выполняемого компоновщиком.

раздел под названием ‘.idata ‘ содержит таблицу, которая помогает windows во время запуска связывать имена функций со временем выполнения адреса. Он также содержит ссылку на KERNEL.DLL, которая является операционной системой Windows.

формат таблицы накладывается windows и содержит имена, которые просматриваются в системных файлах при запуске программы. FASM скрывает некоторые из сложность за ключевым словом rva. Таким образом, _ExitProcess@4-это метка fasm, а _exitProcess-строка, которая просматривается Windows.

программа находится в разделе ‘.текст». Если вы объявите этот раздел доступным для чтения и записи, исполняемый файл, это единственный раздел, который вам нужно добавить.

вы можете вызвать все объекты, которые вы объявили в.секции idata по. Для консольной программы вам нужно _GetStdHandle найти его filedescriptors для standard in и standardout (используя символические имена, такие как STD_INPUT_HANDLE, который fasm находит в файле include win32a.inc). После того, как у вас есть файловые дескрипторы, вы можете сделать WriteFile и ReadFile. Все функции описаны в документации kernel32. Вы, вероятно, знаете или вы не стали бы пытаться программировать ассемблер.

в резюме: есть таблица с именами asci, которые соединяются с ОС windows. Во время запуска это преобразуется в таблицу вызываемых адресов, которую вы используете в своей программе.

Источник

How to write hello world in assembler under Windows?

I wanted to write something basic in assembly under Windows, I’m using NASM, but I can’t get anything working.

How to write and compile hello world without the help of C functions on Windows?

8 Answers 8

Calling libc stdio printf , implementing int main()

There’s also The Clueless Newbies Guide to Hello World in Nasm without the use of a C library. Then the code would look like this.

16-bit code with MS-DOS system calls: works in DOS emulators or in 32-bit Windows with NTVDM support. Can’t be run «directly» (transparently) under any 64-bit Windows, because an x86-64 kernel can’t use vm86 mode.

Build this into a .com executable so it will be loaded at cs:100h with all segment registers equal to each other (tiny memory model).

This example shows how to go directly to the Windows API and not link in the C Standard Library.

To compile, you’ll need NASM and LINK.EXE (from Visual studio Standard Edition)

These are Win32 and Win64 examples using Windows API calls. They are for MASM rather than NASM, but have a look at them. You can find more details in this article.

This uses MessageBox instead of printing to stdout.

Win32 MASM

Win64 MASM

To assemble and link these using MASM, use this for 32-bit executable:

or this for 64-bit executable:

Why does x64 Windows need to reserve 28h bytes of stack space before a call ? That’s 32 bytes (0x20) of shadow space aka home space, as required by the calling convention. And another 8 bytes to re-align the stack by 16, because the calling convention requires RSP be 16-byte aligned before a call . (Our main ‘s caller (in the CRT startup code) did that. The 8-byte return address means that RSP is 8 bytes away from a 16-byte boundary on entry to a function.)

Shadow space can be used by a function to dump its register args next to where any stack args (if any) would be. A system call requires 30h (48 bytes) to also reserve space for r10 and r11 in addition to the previously mentioned 4 registers. But DLL calls are just function calls, even if they’re wrappers around syscall instructions.

Fun fact: non-Windows, i.e. the x86-64 System V calling convention (e.g. on Linux) doesn’t use shadow space at all, and uses up to 6 integer/pointer register args, and up to 8 FP args in XMM registers.

Using MASM’s invoke directive (which knows the calling convention), you can use one ifdef to make a version of this which can be built as 32-bit or 64-bit.

The macro variant is the same for both, but you won’t learn assembly this way. You’ll learn C-style asm instead. invoke is for stdcall or fastcall while cinvoke is for cdecl or variable argument fastcall . The assembler knows which to use.

You can disassemble the output to see how invoke expanded.

Flat Assembler does not need an extra linker. This makes assembler programming quite easy. It is also available for Linux.

This is hello.asm from the Fasm examples:

Fasm creates an executable:

And this is the program in IDA:

You can see the three calls: GetCommandLine , MessageBox and ExitProcess .

To get an .exe with NASM’compiler and Visual Studio’s linker this code works fine:

If this code is saved on e.g. «test64.asm», then to compile:

Produces «test64.obj» Then to link from command prompt:

where path_to_link could be C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin or wherever is your link.exe program in your machine, path_to_libs could be C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64 or wherever are your libraries (in this case both kernel32.lib and user32.lib are on the same place, otherwise use one option for each path you need) and the /largeaddressaware:no option is necessary to avoid linker’s complain about addresses to long (for user32.lib in this case). Also, as it is done here, if Visual’s linker is invoked from command prompt, it is necessary to setup the environment previously (run once vcvarsall.bat and/or see MS C++ 2010 and mspdb100.dll).

Unless you call some function this is not at all trivial. (And, seriously, there’s no real difference in complexity between calling printf and calling a win32 api function.)

Even DOS int 21h is really just a function call, even if its a different API.

If you want to do it without help you need to talk to your video hardware directly, likely writing bitmaps of the letters of «Hello world» into a framebuffer. Even then the video card is doing the work of translating those memory values into VGA/DVI signals.

Note that, really, none of this stuff all the way down to the hardware is any more interesting in ASM than in C. A «hello world» program boils down to a function call. One nice thing about ASM is that you can use any ABI you want fairly easy; you just need to know what that ABI is.

The best examples are those with fasm, because fasm doesn’t use a linker, which hides the complexity of windows programming by another opaque layer of complexity. If you’re content with a program that writes into a gui window, then there is an example for that in fasm’s example directory.

If you want a console program, that allows redirection of standard in and standard out that is also possible. There is a (helas highly non-trivial) example program available that doesn’t use a gui, and works strictly with the console, that is fasm itself. This can be thinned out to the essentials. (I’ve written a forth compiler which is another non-gui example, but it is also non-trivial).

Such a program has the following command to generate a proper header for 32-bit executable, normally done by a linker.

A section called ‘.idata’ contains a table that helps windows during startup to couple names of functions to the runtimes addresses. It also contains a reference to KERNEL.DLL which is the Windows Operating System.

The table format is imposed by windows and contains names that are looked up in system files, when the program is started. FASM hides some of the complexity behind the rva keyword. So _ExitProcess@4 is a fasm label and _exitProcess is a string that is looked up by Windows.

Your program is in section ‘.text’. If you declare that section readable writeable and executable, it is the only section you need to add.

You can call all the facilities you declared in the .idata section. For a console program you need _GetStdHandle to find he filedescriptors for standard in and standardout (using symbolic names like STD_INPUT_HANDLE which fasm finds in the include file win32a.inc). Once you have the file descriptors you can do WriteFile and ReadFile. All functions are described in the kernel32 documentation. You are probably aware of that or you wouldn’t try assembler programming.

In summary: There is a table with asci names that couple to the windows OS. During startup this is transformed into a table of callable addresses, which you use in your program.

Источник

MASM, TASM, FASM, NASM под Windows и Linux

В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под Windows и Linux, а также указать ссылки на ресурсы и книги, посвященные изучению данной темы.

Используется для создания драйверов под Windows.

По ссылке переходим на сайт и скачиваем пакет (masm32v11r.zip). После инсталляции программы на диске создается папка с нашим пакетом C:\masm32. Создадим программу prog11.asm, которая ничего не делает.

Произведём ассемблирование (трансляцию) файла 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.

Программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. В настоящее время Borland прекратила распространение своего ассемблера.

Скачать можно, например, здесь. Инсталлятора нет, просто извлекаем программу. Вот исходник из книги Питера Абеля (рис. 3.2) «Язык Ассемблера для IBM PC и программирования».

Выполним ассемблирование (трансляцию) файла abel32.asm.

Корректность работы программы можно проверить, произведя линковку (tlink.exe) объектного файла и запустив полученный файл в отладчике.

Как было сказано выше, MASM можно использовать для работы с 16-битными программами. Выполним ассемблирование (трансляцию) программы abel32.asm с помощью ассемблера MASM:

Ключ /coff здесь не используется.
Линковка производится файлом link16.exe

В статье Криса Касперски «Сравнение ассемблерных трансляторов» написано, что «FASM — неординарный и весьма самобытный, но увы, игрушечный ассемблер. Пригоден для мелких задач типа „hello, world“, вирусов, демок и прочих произведений хакерского творчества.»

Скачаем FASM с официального сайта. Инсталлятора нет, просто извлекаем программу. Откроем fasm editor — C:\fasm\fasmw.exe. В папке C:\fasm\EXAMPLES\HELLO есть файл HELLO.asm.

Откроем файл HELLO.asm из fasmw.exe. Изменим строку include ‘win32ax.inc’ на строку include ‘c:\fasm\INCLUDE\WIN32AX.INC’. Запускаем из меню Run → Run.

Вот ссылки на ресурсы, посвященные 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” есть на личном сайте автора.

Выполним ассемблирование и линковку и запустим файл hello.asm.

Для 64bit необходимо использовать команду nasm -f elf64 hello.asm

NASM для Windows можно установить, скачав соответствующий дистрибутив с соответствующего сайта.

Ассемблирование:
nasm -f bin имя_файла.asm -o имя_файла.com

Ссылки на ресурсы, посвященные Nasm:

Стандартный ассемблер практически во всех разновидностях UNIX, в том числе Linux и BSD. Свободная версия этого ассемблера называется GAS (GNU assembler). Позволяет транслировать программы с помощью компилятора GCC.

Из учебников удалось найти только книгу на английском «Programming from the ground up». На русском удалось найти только одну главу из книги С. Зубкова «Assembler для DOS, Windows и UNIX».

Возьмем пример программы, которая ничего не делает, с сайта. Создадим программу gas.s

Выполним ассемблирование (трансляцию), линковку и запуск программы:

Если в данной программе изменить _start на main, то можно выполнить ассемблирование (трансляцию) и линковку компилятором gcc.

Выполним ассемблирование (трансляцию), линковку и запуск программы:

Выводы: если вы изучаете программирование под Windows, то вы можете остановить свой выбор на Masm; Tasm больше не поддерживается, но для обучения по старым классическим учебникам подойдёт.
Под Linux Gas подойдет тем, кто использует GCC, а тем, кому не нравится синтаксис Gas, подойдёт Nasm.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Windows hello windows phone
  • Windows hello lumia 930
  • Windows has finished checking the disk
  • Windows hardware dev center portal
  • Windows grep как пользоваться