С чего начать со сборки? - PullRequest
       1

С чего начать со сборки?

6 голосов
/ 16 сентября 2010

Эй, я могу программировать на C, немного на Python и Pascal, и я действительно хочу изучать ассемблер.Мне 18 лет, и я заканчиваю среднюю школу, программирование - мое хобби, потому что школьная работа, конечно, не большая проблема.

Я скачал несколько книг по ассемблеру, которые они представляют: Искусство собрания, Сборка дляНачинающие, Сборка для начинающих и Wrox Professional Assembly Language.Я также скачал компилятор FASM, MASM и HLA.

Теперь несколько вопросов.

  1. Примеры в сборке для начинающих для MASM, если я запустил их в эмуляторе, кто-то сказал мне, что я могу повредить мой компьютер, если я его не использую, иесли да, какой эмулятор мне использовать?

  2. Кроме того, как разработчики делают свой код сборки переносимым?Единственная информация, которую я нашел по этой теме, касается написания вирусов, так как вирусы, написанные на ассемблере, должны быть переносимыми.

  3. Что такое HLA и является ли он настоящим или просто HLL, замаскированным под сборку, чтобы помочь обучить начинающих сборке?

  4. А где находится сборочное сообщество, за исключением очевидных сайтов vxheaven и cracker?

В последнее время я читаю много, но чувствуюкак кто-то, кто изучает латынь, но никогда не доберется до Ватикана, чтобы встретиться с другими, которые говорят на латыни.Мои друзья все программируют на Java, но, похоже, они не заботятся о C или C ++, они думают, что могут использовать Java для всего.Я использую Windows 7 и Ubuntu 10.0.10 на Intel.Я программирую только около года ... я слишком рано погружаюсь в сборку?Мои причины для желающих изучать ассемблер:

  1. Хотите узнать больше о том, как работает процессор.
  2. Ищете вызов.
  3. Хотите научиться писать эффективный код.
  4. Хотите писать меньше и быстрее программ.
  5. Хотите узнать больше о OS dev, когда я освоил сборку.
  6. Если я освою ассемблер, изучение HLL будет проще.
  7. Хотите иметь что-то, что можно предложить при приеме на работу, которой у других не будет.
  8. Заинтересован в AVR, например, Arduino, который использует C, а не ассемблер, но хотел бы больше узнать о AVR.

Спасибо.T

Ответы [ 4 ]

6 голосов
/ 16 сентября 2010

1) Вы не можете на самом деле «повредить» свою систему, запустив программу сборки, чем, скажем, из C. В современной ОС худшее, что вы обычно получите, это сбой вашего процесса. Хотя может быть немного проще вывести ваш процесс из кода ассемблера непреднамеренно. Если вы хотите получить что-то полезное из эмулятора, посмотрите Bochs или QEMU - вместо того, чтобы просто поставить песочницу, у них есть полезные инструменты отладки. Но без vm все будет в порядке, если вы будете писать + тестировать код на своей обычной ОС с помощью обычного отладчика.

2) На самом деле нет. Вы можете сделать переносимым между операционными системами (но с тем же процессором), как вы делаете это для C, но сборка между процессорами просто не имеет смысла (если вы хотите это сделать, вы также можете использовать C, .NET или Java байт-код ).

3) Предмет многих огненных войн. Зависит от того, как вы на это смотрите ... Ассемблер на самом деле просто компилятор, который имеет дело с языком ассемблера. Там много вкусов сборки, некоторые выше, чем другие; большинство из доступных для x86 имеет поддержку макросов. HLA добавляет поддержку lot макросов и синтаксис, который многим не нравится, плюс большую стандартную библиотеку. Не моя чашка чая (я бы лучше использовал «настоящую» HLL), но в моей книге это все еще язык ассемблера.

4) http://www.asmcommunity.net/board/, http://board.flatassembler.net :) - держаться подальше от каналов IRC. Кроме того, держитесь подальше от usenet alt.lang.assembly, он был почти уничтожен несколькими подлыми людьми.

Что касается пары ваших причин изучения ассемблера:

6. Если я освою сборку, изучение HLL будет проще.

Не обязательно, и это может быть даже сложнее, если вы «сделаете слишком много», прежде чем копаться в HLL. Я обнаружил, что некоторые знания в области машинной архитектуры могут привести к написанию лучшего программного обеспечения, но только если вы научитесь не зацикливаться на крошечных нерелевантных деталях.

7.Хотите иметь что-то, что можно предложить при приеме на работу, которой у других не будет.

Не обязательно поможет вам, так как сборка совершенно не имеет значения в большинстве позиций. Черт возьми, вы рискуете предубеждением типа «о, он никогда не добьется успеха, заблудившись в бесполезной микрооптимизации».

1 голос
/ 25 сентября 2010

Здесь идет ...

  • x86 не идеален:
    • Очень немногие 3-операционные инструкции (lea обычно используется как 3-операционная добавка IIRC). Мне нравятся трехоперационные инструкции.
    • машинный код x86 очень отличается от микроопераций, которые фактически выполняются на процессоре. Выполнена большая куча предварительной обработки; сборка, которую вы видите, очень мало говорит о том, как на самом деле работает процессор.
    • Многие советы по сборке («эта инструкция быстрее») немного устарели. По-видимому, вы можете ускорить работу некоторых древних приложений x86, выполнив двоичный перевод x86 в x86, чтобы избавиться от медленных инструкций.
  • Сборка не обязательно научит вас писать "более быстрый код". Когда кто-то говорит: «О, эта $ large_function медленная, поэтому я напишу ее сам в сборке», обычно она оказывается медленнее. Считывание сборки и определение медленных битов полезно; затем вы можете настроить код, чтобы увидеть, что помогает компилятору (даже если он так прост, как «о, GCC не заметил, что результат этого вызова функции постоянен»).
  • Сборка, вероятно, позволяет писать меньший код (люди неплохо разбираются в гольф-коде), но наибольшая экономия места часто заключается в том, что вам не нужно включать среду выполнения C. Людям также может сойти с рук несоблюдение правил вызова.
  • Операционные системы в основном не написаны на ассемблере (здесь я выкапываю анекдот о человеке / людях, которые написали целую ОС только на ассемблере, чтобы узнать, что она медленнее). Несколько битов, самый большой из которых - загрузчик (который на x86 все еще находится в 16-битном «реальном режиме»). Я знаю кого-то, кто программировал вещи в своем загрузчике; это звучит забавно (но вы можете запустить его на виртуальной машине, если только вы сможете одновременно пользоваться Интернетом).
  • Сборка, вероятно, не поможет вам с большинством заданий (но так же, как я бы не работал в месте, где хотели бы видеть $ list_of_languages ​​в моем резюме, я бы не стал работать в месте, где мне отказали, потому что мы сделали несколько сборок для любителей).
  • Сборка не переносимая. Даже системы, использующие один и тот же процессор, часто используют разные ABI (например, «Классическая» Mac OS и Mac OS X).

Большинство курсов CS имеют тенденцию использовать RISCy (ARM, MIPS, SPARC). Я начал на M68K, в какой-то момент взял немного PPC и выучил ARM в университете. ARM достаточно чистый и потенциально полезный, если вы хотите работать с телефонами / встроенными устройствами или для ARM; для забавных вещей, которые вы можете делать на ARM, попробуйте SheevaPlug или аналогичный.

Я никогда ничего не делал на микроконтроллере, но это похоже на использование плат разработки ARM (возможно, самое забавное, что у меня было во всем моем курсе CS).

0 голосов
/ 16 сентября 2010

Оптимизация ассемблера остается в прошлом. Современные компиляторы и процессоры C / C ++ удивительно эффективны для оптимизации хорошо написанного кода на C. Они хорошо знают все приемы упорядочения инструкций, чтобы максимально увеличить параллельное выполнение и максимально эффективно использовать кэш. Это очень трудно сделать вручную. Большинство компиляторов также имеют возможность оптимизировать размер, если это является проблемой.

Если вы хотите поэкспериментировать со сборкой, вы можете проверить GNU-ассемблер. Это достаточно кроссплатформенная, но сборка по своей природе не кроссплатформенная. Вы программируете язык ассемблера, потому что хотите выполнить некоторые очень специфические аппаратные трюки, которые ваш компилятор может не знать.

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

Или научиться быть сильным в C ++. Проверьте boost.org или сайты по программированию игр. Это доставит вам массу проблем и скорости, которая вам нужна.

0 голосов
/ 16 сентября 2010

Как вы упоминаете в Nr. 8, я рекомендую вам использовать AVR, поскольку это хорошая платформа для изучения и использования ассемблера.

Почему?

Потому что на моем компьютере я не просто запустил бы какую-нибудь самописную программу на ассемблере, кроме как в эмуляторе.
Я не могу представить себе какую-либо обычную программу для ПК, в которой было бы больше смысла программировать на ассемблере, чем на современном сложном языке.

Программирование, связанное с AVR или другим микроконтроллером (µc), очень близко к аппаратному обеспечению, заполнению регистров, сдвиговым наборам битов и т. Д.
В микроконтроллере вы получаете немедленные результаты, которые вы можете показать (мигать светодиодом! Да.). Кроме того, микроконтроллеры имеют тенденцию быть короткими, и их скорость выигрывает от эффективного программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...