2009-12-15 2 views
7

Ответ на этот вопрос, конечно, «напишите код сборки!».Как я могу стать хорошим на собрании?

Но я могу сделать это: Я знаю, что базовый синтаксис x86, типы регистров и как использовать их, подпрограммы и т.д. и т.п.

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

Для C можно предложить «написать многопоточную программу» или «написать сервер/клиент сокета». Для PHP предложения могут быть «написать личное программное обеспечение для блога». Чтобы узнать синтаксис языка, часто предлагается «эйлер проекта».

Так что мой вопрос (ы):

  1. Какие вещи я могу написать в сборке, которая позволит мне отточить мои сборки и эффективности навыков? Например, я мог бы решить проблему эйлера проекта в x86, но это не помогает мне с конкретными навыками сборки. Какие проектные идеи я могу сделать, которые могут быть действительно закодированы в ассемблере?

  2. Как бы мне расспросить, действительно ли я пишу «хороший» код? Например, с C и сокетами в Интернете есть миллиард учебных пособий, и в моем списке друзей есть миллиард человек, которые могут смотреть на мой код, и есть около миллиарда вопросов о них: так что легче измерить прогресс.

  3. Существуют ли существующие тяжелые проекты сборки, на которые я могу смотреть, чтобы учиться? Или даже части программ, в которых они разбиваются на сборку для [конкретной задачи] ради эффективности?

  4. Какие книги мне следует читать? Блоги людей, которые регулярно смотрят на вещи низкого уровня?

(. Предпочтительно вещи, которые я мог бы сделать на x86 на Linux Я полагаю, что понятия будут перенесены на другие архитектуры.)

+3

Просто любопытно - Как только вы получите «хороший» на собрании, что вы собираетесь с ним делать? В наши дни компиляторы записывают лучшую сборку, чем вы можете, в * почти * каждом случае (за исключением функций процессора, которые не поддерживаются на C, например, чтения битвы переполнения или чего-то еще). – Seth

+0

Rhat сказал: изучите тексты fatmap.txt и fatmap2.txt. Вы найдете их через Google. Они были написаны в 90-х годах и по-прежнему остаются не-плюс-ультра, когда речь заходит о растеризации программного обеспечения.В течение последнего десятилетия были улучшения, но в основном они сосредоточены на аппаратных реализациях. –

+2

@Seth: Если на самом деле «хорошо» при написании сборки, то текущие компиляторы, безусловно, делают * не * лучше писать сборку, чем вы. –

ответ

3

Сборка может делать много вещей, которые C не могут, а оптимизатор - не волшебство. Тем не менее, большинство полезно вещи, которые не требуют, чтобы вы являлись сборщиком полубожества, попадают в компилятор, стандартные библиотеки и категории времени выполнения интерпретатора.

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

писать лучше сборку, прочитайте руководства здесь:

http://www.agner.org/optimize/

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

http://flatassembler.net/

+0

Мне не было известно ни об одном из этих ресурсов; Спасибо! – poundifdef

2

Что написать:

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

+1

+1 - графика всегда хороша для глаз и все еще ниша, где вы можете сделать заметную разницу с ассемблером. Получение текстурного картирования не является тривиальным. Разумеется, конечно, но все-таки задача. –

3

Одним из подходов может быть выбор функций из стандартной библиотеки C (например, строковых функций, mem *()) для реализации с нуля в сборке. Создайте бенчмаркинг для измерения производительности вашего кода, посмотрите, можете ли вы обеспечить равную или лучшую производительность библиотек, предоставляемых в вашей системе. Я бы не стал обманывать, чтобы разобрать код системной библиотеки (после того, как вы на него набросились), часто полезные методы можно найти, осмотрев дизассемблированный код. Очень рекомендуется чтение кода других людей (возможно, начиная с битов сборки codde, найденных в источниках ядра Linux.)

6

Хорошие ответы. Я также предложил бы написать небольшой компилятор и написать ему ассемблер для вас. Таким образом, вы можете подумать о различных способах делать вещи в ассемблере, например, передавать аргументы, создавать кадры стека, составлять выражения адресов, индексировать массивы, управлять памятью, условными обозначениями, циклами, try-catch и т. Д. И т. Д.

+1

Это кажется лучшим ответом на меня. Посмотрим правде в глаза: в наши дни в сборке есть только 3 причины. 1) вы не можете получить компилятор для своей платформы. 2) вам нужно написать компилятор. 3) вам нужно оптимизировать код, который компилятор просто не получает. Это единственное предложение, которое может помочь с 2 и 3, и действительно нет ничего, что могло бы помочь с 1, и это довольно необычно. –

+0

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

+0

@San: Thx. Я использовал много ассемблера для различных платформ, но единственным компилятором был Fortran. Кроме того, когда дело доходило до графики, особенно на 8088, вам нужно отлично справляться с циклами подсчета. –

1

Если вы прыгаете с помощью двух ножек, подумайте о том, чтобы улучшить внутренние петли распределенных массовых вычислений BOINC project-like [email protected]. (Other projects here.)

На моих компьютерах каждый рабочий блок SETI @ Home нуждается в часах, чтобы хрустнуть, и почти идеально связан с процессором. Как правило, компиляторы C/C++ не превосходны при организации параллельных операций с плавающей точкой и целого числа, особенно для каждого типа ЦП. Было бы особенно полезно оптимизировать, скажем, инструкции x86 для оптимизации для конкретных возможностей процессора, на котором он фактически работает: SSE SSE2, 80586, 80686, Athlon и т. Д. Те, кто все еще работает с оборудованием с десятью годами года, оценят такие оптимизация и современное оборудование, несомненно, принесут пользу и в значительной степени.

1

Во-первых, как определить «хороший код сборки»? Самый быстрый код, наиболее совместимый с ABI код или код, который легче всего читать? Я думаю, что «хороший» зависит от общей цели, и вы действительно не сказали нам, для чего хотите использовать сборку.

Другие рекомендовали написать растеризатор программного обеспечения. Я мог бы зацепиться за это, но поскольку вы уже знаете мнемонику x86, вам не нужно писать больше кода сборки. Вам нужно больше понять, как машины работают под капотом.

Мое предложение - написать общесистемный или пользовательский космический эмулятор. Я написал системный эмулятор для ARM920 и выучил тонну, не написав одну сборную мнемонику! Хорошо, это закончилось медленным медленным, но я написал его как переводчика в чистом C. Теперь я знаю большую часть темных секретов архитектуры ARM, и это дало мне новую перспективу в отношении того, как работают встраиваемые компьютеры.

Просто помните, что периферийные устройства могут быть сложными для эмулирования. Нет ничего плохого в эмуляции процессора, но добавление упрощенных psuedo-периферийных устройств. Если вы хороши, вы можете даже создать для них игровое устройство &.

Возможно, вы захотите ознакомиться с источниками QEMU и DosBox, чтобы получить хорошие идеи, хотя они используют схему JIT. Мой переводчик находится здесь gp2xemu. Это была попытка эмулятора для GP2x, но я застрял из-за сосательной документации.

Смежные вопросы