Как я могу стать хорошим в блоке?

Ответ на этот вопрос, конечно, "запишите некоторый ассемблерный код!"

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

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

Для C можно предложить, "пишут, что многопоточная программа" или "пишет сервер/клиент сокета". Для PHP предложения могли бы быть "записью персональное программное обеспечение блога". Изучить синтаксис языка, "Эйлеру проекта" часто предлагают.

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

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

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

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

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

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

9
задан poundifdef 15 December 2009 в 20:28
поделиться

6 ответов

Assembly can do many things that C cannot, and the optimizer is not magic. That said, most useful things that don't require you to be an assembly semi-deity fall into the compiler, standard libraries and interpreter runtime categories.

Trampolines, for example are or might be useful in all three of them, and you just cannot use C to compose an arbitrary call stack.

To write better assembly, read the manuals here:

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

To see programs written exclusively in assembly and a community obsessed with optimization to benchmark you:

http://flatassembler.net/

3
ответ дан 4 December 2019 в 13:02
поделиться

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

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

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

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

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

play system для них.

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

play system для них.

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

1
ответ дан 4 December 2019 в 13:02
поделиться

Что писать:

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

2
ответ дан 4 December 2019 в 13:02
поделиться

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

.
3
ответ дан 4 December 2019 в 13:02
поделиться

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

.
6
ответ дан 4 December 2019 в 13:02
поделиться

Если вам подходит прыжок обеими ногами, рассмотрим возможность улучшения внутренних циклов вычислений распределенной массы BOINC project-подобно SETI@Home. (Другие проекты здесь.)

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

.
1
ответ дан 4 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: