NASM

Поделись знанием:
Перейти к: навигация, поиск
NASM
Тип

компилятор

Операционная система

Windows, DOS, Mac OS, Linux

Лицензия

LGPL, с версии 2.07 — упрощённая лицензия BSD

Сайт

[www.nasm.us/ m.us]

К:Википедия:Статьи без изображений (тип: не указан)

NASM (Netwide Assembler) — свободный (LGPL и лицензия BSD) ассемблер для архитектуры Intel x86. Используется для написания 16-, 32- и 64-разрядных программ.





История

NASM был создан Саймоном Тэтхемом совместно с Юлианом Холлом и в настоящее время развивается небольшой командой разработчиков на SourceForge.net. Первоначально он был выпущен согласно его собственной лицензии, но позже эта лицензия была заменена на GNU LGPL после множества проблем, вызванных выбором лицензии. Начиная с версии 2.07 лицензия заменена на «упрощённую BSD» (BSD из 2 пунктов).

NASM может работать на платформах, отличных от x86, таких как SPARC и PowerPC, однако код он генерирует только для x86 и x86-64[1].

NASM успешно конкурирует со стандартным в Linux- и многих других UNIX-системах ассемблером gas.[2][3][4] Считается, что качество документации у NASM выше, чем у gas.[4] Кроме того, ассемблер gas по умолчанию[5] использует AT&T-синтаксис, ориентированный на процессоры не от Intel, в то время как NASM использует вариант традиционного для x86-ассемблеров Intel-синтаксиса; Intel-синтаксис используется всеми ассемблерами для под DOS/Windows, например, MASM, TASM, fasm.

Синтаксис языка

В NASM используется Intel-синтаксис записи инструкций. Предложение языка ассемблера NASM (строка программы) может состоять из следующих элементов:

Метка Инструкция Операнды Комментарий

Операнды отделяются между собой запятой. Перед строкой и после инструкции можно использовать любое количество пробельных символов. Комментарий начинается с точки с запятой, а концом комментария считается конец строки. В качестве инструкции может использоваться команда или псевдокоманда (директива компилятора). Если строка очень длинная, то её можно перенести на следующую, используя обратный слеш \, подобно тому, как это делается в языке Си.

Компиляция и компоновка

NASM компилирует программы под различные операционные системы в пределах x86-совместимых процессоров. Находясь в одной операционной системе, можно беспрепятственно откомпилировать исполняемый файл для другой.

Компиляция программ в NASM состоит из двух этапов. Первый — ассемблирование, второй — компоновка. На этапе ассемблирования создаётся объектный код. В нём содержится машинный код программы и данные, в соответствии с исходным кодом, но идентификаторы (переменные, символы) пока не привязаны к адресам памяти. На этапе компоновки из одного или нескольких объектных модулей создаётся исполняемый файл (программа). Операция компоновки связывает идентификаторы, определённые в основной программе, с идентификаторами, определёнными в остальных модулях, после чего всем идентификаторам даются окончательные адреса памяти или обеспечивается их динамическое выделение.

Для компоновки объектных файлов в исполняемые в Windows можно использовать свободный бесплатно распространяемый компоновщик alink[3](для 64-х битных программ компоновщик GoLink), а в Linux — компоновщик ld, который есть в любой версии этой операционной системы.

Для ассемблирования файла нужно ввести следующую команду:

nasm -f format filename -o output

Инструкции перехода

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

В командах условного и безусловного (jmp) переходов используется по умолчанию ближний тип переходов — near. Поэтому при возможности короткого перехода, чтобы не завысить размер программы на лишний байт, необходимо специально указать тип перехода short. С версии 0.98.09b были добавлены опции оптимизации -Ox, которые позволяют автоматически оптимизировать размер инструкций перехода[6], в более ранних версиях или без таких опций минимальный размер программы можно получить только ручной модификацией исходного кода.

Формат выходных файлов

NASM поддерживает множество форматов выходных файлов, среди них[7]:

  • bin — файл произвольного формата, определяемого только исходным кодом. Пригоден как для файлов данных, так и для модулей с исполняемыми кодами — например, системных загрузчиков, образов ПЗУ, модулей операционных систем, драйверов .SYS в MS-DOS или исполняемых файлов .COM.
  • obj — объектный модуль в формате OMF, совместимый с MASM и TASM.
  • win32 и win64 — объектный модуль для 32- и 64-битного кода, совместимый с Win32- и Win64-компиляторами Microsoft.
  • aout — объектный модуль в варианте формата a.out, использовавшемся в ранних Linux-системах.
  • aoutb — версия формата a.out для BSD-совместимых операционных систем.
  • coff — объектный модуль в формате COFF, совместимом с компоновщиком из DJGPP.
  • elf32 и elf64 — объектный модуль в форматах ELF32 и ELF64, используемых в Linux и Unix System V, включая Solaris x86, UnixWare и SCO Unix.

Формат выходного файла можно задать с помощью ключа командной строки -f. Форматы могут расширять синтаксис некоторых инструкций и добавлять собственные инструкции.

Примеры программы Hello, world! под разные ОС

Примеры программы Hello, world!, которая выводит соответствующее сообщение и завершается.

Известные программы, написанные на NASM

  • Asmutils — набор системных утилит для операционных систем BSD, UnixWare, Solaris и AtheOS.
  • Проект AsmOS[9] — операционная система на ассемблере NASM (сейчас на стадии разработки).

Напишите отзыв о статье "NASM"

Примечания

  1. [www.nasm.us/doc/nasmdoc1.html#section-1.1 1.1 What Is NASM?]. The Netwide Assembler: NASM. Официальный сайт. — «NASM, is an 80x86 and x86-64 assembler»  Проверено 14 июля 2010. [www.webcitation.org/65XBOjJzE Архивировано из первоисточника 18 февраля 2012].
  2. [www.ibm.com/developerworks/ru/library/l-gas-nasm/ Ассемблеры для Linux: Сравнение GAS и NASM]
  3. 1 2 [www.sysbin.com/files/lowlevel/nasm_windows.htm Использование ассемблера NASM в Windows]
  4. 1 2 Рэндолл Хайд. [webster.cs.ucr.edu/AsmTools/WhichAsm.html Which Assembler is the Best?] (англ.). Проверено 18 июля 2010. [www.webcitation.org/65XFzUpUn Архивировано из первоисточника 18 февраля 2012].
  5. Поддержка Intel-синтаксиса, вызываемого через специальную директиву .intel_syntax, появилась в gas-2.10; см. [sourceware.org/cgi-bin/cvsweb.cgi/src/gas/NEWS?rev=1.114&content-type=text/x-cvsweb-markup&cvsroot=src&only_with_tag=MAIN gas/NEWS] (англ.). Проверено 18 июля 2010. [www.webcitation.org/65XG070wP Архивировано из первоисточника 18 февраля 2012].
  6. [nasm.us/doc/nasmdocc.html#section-C.2.33 C.2.33 Version 0.98.09b with John Coffman patches released 28-Oct-2001]. The Netwide Assembler: NASM. Appendix C: NASM Version History. Официальный сайт. Проверено 18 июля 2010. [www.webcitation.org/65XG0dvaY Архивировано из первоисточника 18 февраля 2012].
  7. [www.nasm.us/doc/nasmdoc7.html Chapter 7: Output Formats]. The Netwide Assembler: NASM. Официальный сайт. Проверено 14 июля 2010. [www.webcitation.org/65XG1A32w Архивировано из первоисточника 18 февраля 2012].
  8. [diamondz.land.ru/hll/hll.htm#nasm Использование различных компиляторов в КолибриОС]
  9. [asmdev.narod.ru/asmos/asmos.html Операционная система на ассемблере NASM]

Литература

  • Рудольф Марек. Ассемблер на примерах. Базовый курс. — СПб.: Наука и техника, 2005. — 240 с. — ISBN 5-94387-232-9.
  • А. В. Столяров. [www.stolyarov.info/books/asm_unix Программирование на языке ассемблера NASM для ОС Unix]. — М.: МАКС Пресс, 2011. — 188 с. — ISBN 978-5-317-03627-0.

Ссылки

  • [www.nasm.us/ Официальный сайт]
  • [sourceforge.net/projects/nasm/ Проект NASM на сайте SourceForge.net]
  • [www.opennet.ru/docs/RUS/nasm/ Расширенный ассемблер: NASM]
  • [www.nestor.minsk.by/kg/2004/50/kg45004.html Введение в NASM (низкоуровневое программирование для Windows)]


Отрывок, характеризующий NASM

Что произвело это необычайное событие? Какие были причины его? Историки с наивной уверенностью говорят, что причинами этого события были обида, нанесенная герцогу Ольденбургскому, несоблюдение континентальной системы, властолюбие Наполеона, твердость Александра, ошибки дипломатов и т. п.
Следовательно, стоило только Меттерниху, Румянцеву или Талейрану, между выходом и раутом, хорошенько постараться и написать поискуснее бумажку или Наполеону написать к Александру: Monsieur mon frere, je consens a rendre le duche au duc d'Oldenbourg, [Государь брат мой, я соглашаюсь возвратить герцогство Ольденбургскому герцогу.] – и войны бы не было.
Понятно, что таким представлялось дело современникам. Понятно, что Наполеону казалось, что причиной войны были интриги Англии (как он и говорил это на острове Св. Елены); понятно, что членам английской палаты казалось, что причиной войны было властолюбие Наполеона; что принцу Ольденбургскому казалось, что причиной войны было совершенное против него насилие; что купцам казалось, что причиной войны была континентальная система, разорявшая Европу, что старым солдатам и генералам казалось, что главной причиной была необходимость употребить их в дело; легитимистам того времени то, что необходимо было восстановить les bons principes [хорошие принципы], а дипломатам того времени то, что все произошло оттого, что союз России с Австрией в 1809 году не был достаточно искусно скрыт от Наполеона и что неловко был написан memorandum за № 178. Понятно, что эти и еще бесчисленное, бесконечное количество причин, количество которых зависит от бесчисленного различия точек зрения, представлялось современникам; но для нас – потомков, созерцающих во всем его объеме громадность совершившегося события и вникающих в его простой и страшный смысл, причины эти представляются недостаточными. Для нас непонятно, чтобы миллионы людей христиан убивали и мучили друг друга, потому что Наполеон был властолюбив, Александр тверд, политика Англии хитра и герцог Ольденбургский обижен. Нельзя понять, какую связь имеют эти обстоятельства с самым фактом убийства и насилия; почему вследствие того, что герцог обижен, тысячи людей с другого края Европы убивали и разоряли людей Смоленской и Московской губерний и были убиваемы ими.
Для нас, потомков, – не историков, не увлеченных процессом изыскания и потому с незатемненным здравым смыслом созерцающих событие, причины его представляются в неисчислимом количестве. Чем больше мы углубляемся в изыскание причин, тем больше нам их открывается, и всякая отдельно взятая причина или целый ряд причин представляются нам одинаково справедливыми сами по себе, и одинаково ложными по своей ничтожности в сравнении с громадностью события, и одинаково ложными по недействительности своей (без участия всех других совпавших причин) произвести совершившееся событие. Такой же причиной, как отказ Наполеона отвести свои войска за Вислу и отдать назад герцогство Ольденбургское, представляется нам и желание или нежелание первого французского капрала поступить на вторичную службу: ибо, ежели бы он не захотел идти на службу и не захотел бы другой, и третий, и тысячный капрал и солдат, настолько менее людей было бы в войске Наполеона, и войны не могло бы быть.
Ежели бы Наполеон не оскорбился требованием отступить за Вислу и не велел наступать войскам, не было бы войны; но ежели бы все сержанты не пожелали поступить на вторичную службу, тоже войны не могло бы быть. Тоже не могло бы быть войны, ежели бы не было интриг Англии, и не было бы принца Ольденбургского и чувства оскорбления в Александре, и не было бы самодержавной власти в России, и не было бы французской революции и последовавших диктаторства и империи, и всего того, что произвело французскую революцию, и так далее. Без одной из этих причин ничего не могло бы быть. Стало быть, причины эти все – миллиарды причин – совпали для того, чтобы произвести то, что было. И, следовательно, ничто не было исключительной причиной события, а событие должно было совершиться только потому, что оно должно было совершиться. Должны были миллионы людей, отрекшись от своих человеческих чувств и своего разума, идти на Восток с Запада и убивать себе подобных, точно так же, как несколько веков тому назад с Востока на Запад шли толпы людей, убивая себе подобных.
Действия Наполеона и Александра, от слова которых зависело, казалось, чтобы событие совершилось или не совершилось, – были так же мало произвольны, как и действие каждого солдата, шедшего в поход по жребию или по набору. Это не могло быть иначе потому, что для того, чтобы воля Наполеона и Александра (тех людей, от которых, казалось, зависело событие) была исполнена, необходимо было совпадение бесчисленных обстоятельств, без одного из которых событие не могло бы совершиться. Необходимо было, чтобы миллионы людей, в руках которых была действительная сила, солдаты, которые стреляли, везли провиант и пушки, надо было, чтобы они согласились исполнить эту волю единичных и слабых людей и были приведены к этому бесчисленным количеством сложных, разнообразных причин.
Фатализм в истории неизбежен для объяснения неразумных явлений (то есть тех, разумность которых мы не понимаем). Чем более мы стараемся разумно объяснить эти явления в истории, тем они становятся для нас неразумнее и непонятнее.
Каждый человек живет для себя, пользуется свободой для достижения своих личных целей и чувствует всем существом своим, что он может сейчас сделать или не сделать такое то действие; но как скоро он сделает его, так действие это, совершенное в известный момент времени, становится невозвратимым и делается достоянием истории, в которой оно имеет не свободное, а предопределенное значение.
Есть две стороны жизни в каждом человеке: жизнь личная, которая тем более свободна, чем отвлеченнее ее интересы, и жизнь стихийная, роевая, где человек неизбежно исполняет предписанные ему законы.
Человек сознательно живет для себя, но служит бессознательным орудием для достижения исторических, общечеловеческих целей. Совершенный поступок невозвратим, и действие его, совпадая во времени с миллионами действий других людей, получает историческое значение. Чем выше стоит человек на общественной лестнице, чем с большими людьми он связан, тем больше власти он имеет на других людей, тем очевиднее предопределенность и неизбежность каждого его поступка.
«Сердце царево в руце божьей».
Царь – есть раб истории.
История, то есть бессознательная, общая, роевая жизнь человечества, всякой минутой жизни царей пользуется для себя как орудием для своих целей.
Наполеон, несмотря на то, что ему более чем когда нибудь, теперь, в 1812 году, казалось, что от него зависело verser или не verser le sang de ses peuples [проливать или не проливать кровь своих народов] (как в последнем письме писал ему Александр), никогда более как теперь не подлежал тем неизбежным законам, которые заставляли его (действуя в отношении себя, как ему казалось, по своему произволу) делать для общего дела, для истории то, что должно было совершиться.
Люди Запада двигались на Восток для того, чтобы убивать друг друга. И по закону совпадения причин подделались сами собою и совпали с этим событием тысячи мелких причин для этого движения и для войны: укоры за несоблюдение континентальной системы, и герцог Ольденбургский, и движение войск в Пруссию, предпринятое (как казалось Наполеону) для того только, чтобы достигнуть вооруженного мира, и любовь и привычка французского императора к войне, совпавшая с расположением его народа, увлечение грандиозностью приготовлений, и расходы по приготовлению, и потребность приобретения таких выгод, которые бы окупили эти расходы, и одурманившие почести в Дрездене, и дипломатические переговоры, которые, по взгляду современников, были ведены с искренним желанием достижения мира и которые только уязвляли самолюбие той и другой стороны, и миллионы миллионов других причин, подделавшихся под имеющее совершиться событие, совпавших с ним.
Когда созрело яблоко и падает, – отчего оно падает? Оттого ли, что тяготеет к земле, оттого ли, что засыхает стержень, оттого ли, что сушится солнцем, что тяжелеет, что ветер трясет его, оттого ли, что стоящему внизу мальчику хочется съесть его?
Ничто не причина. Все это только совпадение тех условий, при которых совершается всякое жизненное, органическое, стихийное событие. И тот ботаник, который найдет, что яблоко падает оттого, что клетчатка разлагается и тому подобное, будет так же прав, и так же не прав, как и тот ребенок, стоящий внизу, который скажет, что яблоко упало оттого, что ему хотелось съесть его и что он молился об этом. Так же прав и не прав будет тот, кто скажет, что Наполеон пошел в Москву потому, что он захотел этого, и оттого погиб, что Александр захотел его погибели: как прав и не прав будет тот, кто скажет, что завалившаяся в миллион пудов подкопанная гора упала оттого, что последний работник ударил под нее последний раз киркою. В исторических событиях так называемые великие люди суть ярлыки, дающие наименований событию, которые, так же как ярлыки, менее всего имеют связи с самым событием.
Каждое действие их, кажущееся им произвольным для самих себя, в историческом смысле непроизвольно, а находится в связи со всем ходом истории и определено предвечно.


29 го мая Наполеон выехал из Дрездена, где он пробыл три недели, окруженный двором, составленным из принцев, герцогов, королей и даже одного императора. Наполеон перед отъездом обласкал принцев, королей и императора, которые того заслуживали, побранил королей и принцев, которыми он был не вполне доволен, одарил своими собственными, то есть взятыми у других королей, жемчугами и бриллиантами императрицу австрийскую и, нежно обняв императрицу Марию Луизу, как говорит его историк, оставил ее огорченною разлукой, которую она – эта Мария Луиза, считавшаяся его супругой, несмотря на то, что в Париже оставалась другая супруга, – казалось, не в силах была перенести. Несмотря на то, что дипломаты еще твердо верили в возможность мира и усердно работали с этой целью, несмотря на то, что император Наполеон сам писал письмо императору Александру, называя его Monsieur mon frere [Государь брат мой] и искренно уверяя, что он не желает войны и что всегда будет любить и уважать его, – он ехал к армии и отдавал на каждой станции новые приказания, имевшие целью торопить движение армии от запада к востоку. Он ехал в дорожной карете, запряженной шестериком, окруженный пажами, адъютантами и конвоем, по тракту на Позен, Торн, Данциг и Кенигсберг. В каждом из этих городов тысячи людей с трепетом и восторгом встречали его.