2010-09-16 5 views
6

Эй, я могу программировать на 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. Хотите узнать больше об ОС dev, когда я освоил сборку.
  6. Если я осваиваю сборку, больше узнать HLL было бы проще.
  7. Хотите иметь что предложить, подавая заявку на работу, которую другие не имеют.
  8. Интересует AVR, например, Arduino, который использует C, а не сборку, но хотел бы больше узнать о AVR.

Спасибо. T

ответ

0

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

Почему?

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

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

+0

Это хороший ответ, но я все равно хотел бы программировать больше, чем просто микроконтроллеры. Я нашел сайт Virtual Box, он выглядит неплохо, чтобы попробовать. Для других, кто хочет попробовать http://www.virtualbox.org/ Timo – Timo

+1

Да, VirtualBox - это ваша песочница/эмулятор для безопасного программирования, но вы также учитывали накладные расходы кода в вашем коде asm только для, например.пишут «hello world» на консоль в окнах? –

+0

Хороший вопрос не думал об этом. – Timo

0

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

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

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

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

+0

«Оптимизация языка ассемблера ушла в прошлое». Это неверно, это требуется гораздо реже. В настоящее время обычно не записывать большие части кода в сборку, но для + оптимизации + кода это по-прежнему ценно. Редко необходимо, но все же. – PhiS

+0

Я не соглашусь с тем, что вы в крайних случаях можете оптимизировать некоторые внутренние циклы, кроме того, что может сделать компилятор для вас. Я был там в золотой «демо» возрасте, где мы написали 95% чистой сборки, но это была другая игра. Аппаратное обеспечение было проще и намного медленнее, поэтому было много чего выиграть. Теперь у нас есть молодой человек, который хочет, чтобы его руки были грязными, а то, что я имел в виду «в прошлом», - это то, что сборку нужно делать для молодых начинающих программистов в начале девяностых. Ассамблея больше не является границей. Получите удовольствие от использования графических процессоров, телефонных приложений или чего-то другого. – Holstebroe

6

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

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

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

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

В течение нескольких ваших причин для обучения сборки:

6.Ел осваивает собрание, обучение более ЯВЫ будет легче.

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

7.Хотите что-то предложить, подавая заявку на работу, которую другие не имеют.

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

+0

Я считаю, что при переполнении стека есть немало людей, которые знают сборку достаточно хорошо, чтобы быть полезными. –

+0

@Georg: действительно, но SO не является «сообществом сборки» - он ориентирован на взаимодействие вопросов/ответов, тогда как форумы/информационные панели имеют другие значения. – snemarch

1

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

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

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

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