Вопрос по assembly, x86 – Какие проекты (кроме очевидных вещей ОС) используют язык ассемблера?

10

Похоже, в настоящее время никто не использует сборку, кроме как для разработки драйверов устройств или самого ядра ядер ОС и т. Д. Кто-нибудь знает, что в настоящее время он используется для других целей?

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

У меня не было намерения унизить, просто мое любопытство было специфическим для мира ПК / серверов. JCCyC
Нет необходимости ввязывать какие-либо вещи, есть несколько четырехъядерных процессоров Cortex и аналогичные встроенные микроконтроллеры, которые могут курить ваш типичный розничный ПК. Даже эти приложения являются C / C ++ по большей части, с немного большей сборкой благодаря тому факту, что команда разработчиков, вероятно, знает сборку. marr75

Ваш Ответ

16   ответов
1

как набор инструкций становится ассемблером (если вы понимаете основную архитектуру). Но иногда ассемблер не может быть побежден. Обратите внимание, что написать дрянной, неэффективный ассемблерный код можно так же легко, как написать дрянной C-код. А ассемблер гораздо проще в обслуживании. И он никуда не переносится.

И все зависит от качества компилятора C, который вы используете. Некоторые делают лучше, чем другие. Большинство компиляторов позволяют вам увидеть код ассемблера, который они генерируют. Если вы думаете, что можете добиться большего успеха, а сегмент кода имеет решающее значение, сделайте это. В противном случае, избегайте этого. Тщательно созданный C может быть очень близок к металлу, учитывая приличный компилятор.

0

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

Возвращаясь к Quake I (см. Мой ответ выше), так как он был одним из самых ранних полностью трехмерных игровых движков: он не использовал ASM в основных циклах. Хотя обслуживание не является проблемой, возможность контролировать то, что происходит в цикле, все еще важна.
Но это, как правило, написание инструкций, доступных в графическом процессоре, а не на языке ассемблера ПК.
Даже шейдеры написаны на языках высокого уровня (Cg, HLSL, GLslang) в наши дни.
@Nosredna: Да, это правильно для этого примера.
0

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

Я "d файл, который под" очевидные вещи ОС ". JCCyC
технически это не часть ОС (см., например, Linux), но я понимаю, что вы имеете в виду;)
2

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

1

когда взламывал исходный код Quake I. Все математические библиотеки (особенно что-либо для точечных продуктов) были написаны на MASM Джоном Кармаком. Этот материал был интенсивным с плавающей запятой, и в то время C не был так хорош, как искусно созданный вручную ASM для операций с плавающей запятой. Кроме того, поскольку компьютеры были гораздо более ограничены по процессору, а Quake использовал процессор для рендеринга, каждая отдельная операция имела значение, поэтому ASM работал лучше всего.

1

которые язык более высокого уровня не ожидал поддерживать. Старый пример, когда я пытался получить некоторые тонкости, которые C и Unix предоставили, работая с Fortran на RSX-11M. Я хотел передать строки форматирования и использовать более простой стиль Си. Функция printf () должна была выполнять некоторые операции приведения типа. У Fortran такой концепции не было, поэтому icast () и rcast () были написаны на ассемблере. Другими реализованными функциями были move () и clone (). Это было сделано не столько для эффективности, сколько для расширения концепций за пределами мышления Фортрана.

0

укт, продаваемый поставщиком, используемый крупными компаниями), которое собирало информацию из хуков в операционной системе. Тем не менее, я занимался программированием только в стиле jane: экраны, отчеты и т. Д. На ассемблере. Он работал удивительно быстро, но был полностью в ассемблере. Я уверен, что он все еще работает и продается сегодня по ценам, значительно превышающим цены, характерные для программного обеспечения для платформ Windows и Linux.

В IBM 370 было самое приятное программирование на ассемблере, которое я когда-либо делал. Набор инструкций был разработан для легкого ручного программирования на ассемблере, и сам ассемблер был очень хорош в течение дня.
0

о уровня, и вместо них используется встроенная сборка. Например, есть некоторая встроенная сборка в библиотеке Ct C ++; Я полагаю, что он используется для части системы самоанализа объекта.

Кроме того, glibc (библиотека C для gcc) использует сборку для оптимизации. В одной из программных математических реализаций с плавающей запятой IIRC есть значительные куски, написанные на ассемблере.

Однако одной из основных причин изучения ассемблера является отладка. В некоторых случаях я попадал в ситуации, когда незнание сборки не позволило бы мне отладить особо неприятную проблему.

1
Skizz = Безумный инопланетянин-мутант из ада. : -О JCCyC
1

исходного кода C / C ++, вы очень быстро заметите, что большинство хороших оптимизирующих компиляторов делают сборку лучше, чем даже хорошие программисты на ассемблере. Решения о том, когда встроить функцию, как обрабатывать циклы, пост-пре-инкремент (что многие компиляторы сами решают, как обрабатывать для вас сейчас) и т. Д. управлять адресами и определениями, чем вы, по крайней мере при нормальных обстоятельствах.

Даже драйверы устройств и ядра ОС обычно не пишутся с использованием множества сборок. Небольшие критически важные для производительности разделы программ реального времени - это то место, где вы найдете сборки в современных приложениях.

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

0

изучается эффективность алгоритмов. В своих книгах он упоминает, что нет лучшего способа изучить, как работает алгоритм, чем писать в сборке.

2

Roller Coaster Tycoon был полностью (или почти) написан в сборке x86 Крисом Сойером (ссылка на википедию).

9

Увеличениебудучи современным C ++, использует встроенную сборку для низкоуровневых критичных к производительности битов, таких какатомные общие счетчики.

производительность & quot; это неправильное слово здесь. Boost использует язык ассемблера для вещей, которые не могут быть выполнены в стандартном C ++, таких как атомика (и встроенные функции компилятора по некоторым причинам недоступны).

@JCCyC, да, где код был одной командой на строку и отформатирован в столбцах ...
Критическое отношение к характеристикам атомных операций аналогично вызову брони на танке М1 «с высокой степенью защиты». своего рода упущение. Атомарные операции кодируются в сборке, чтобы гарантировать, что они на самом деле являются атомарными, а не так, чтобы они выполнялись быстрее. Они могут занимать порядка миллисекунд и все же быть полезными, но если они не являются атомарными, не имеет значения, какая малая доля наносекунды требуется, чтобы закончить.
Yowza. Это не язык ассемблера вашего дяди. Выглядит странно, как ад. Ну, я привык к почтенному типу встроенной сборки MASM / TASM и Borland. JCCyC
Хорошо, у вас есть смысл, хотя мне нравится, что мой коммутирующий M1 имеет высокий уровень безопасности :)
Интересно, каков набор инструкций вашего дяди, risc :)?
0

определяющих скорость (после того, что требуется динамически для управления памятью) почти на каждом языке, является подпрограмма, используемая средой выполнения (-library) для перемещения памяти. Move (), memcpy и т. Д., А также примитивы, такие как поиск байта (strchr) и т. Д.

Они также часто пишутся на ассемблере, со специальным выделенным кодом для использования выравнивания.

9

что ассемблерное программирование необходимо для серверных частей компилятора и связанных с ним технологий, таких как динамическая перекомпиляция симуляторов ЦП.

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

Edit: В наши дни игры делают большую часть своих вычислений в графическом процессоре. Получить максимум от этих вычислительных ресурсов не всегда возможно, используя только OpenGL или DirectX, и производители этих процессоров предоставляют множество инструментов, позволяющих выжать больше из своего оборудования. Хотя Cuda или OpenCL являются хорошо известными терминами, они все еще находятся на относительно высоком уровне абстракции по сравнению с аппаратным обеспечением GPU, выполняя роль, которая очень похожа на роль C в типичных (Von Neuman) процессорах. Посмотрите наразработчик страницы для этих продуктов вы найдете десятки способов оптимального использования ресурсов вычислений на GPU на любом уровне абстракции.

@ Что бы то ни было: я не хотел делать вывод, что игры написаны полностью на ассемблере. Хотелось бы надеяться, что игры написаны более выразительно, и только очень горячие области кода преобразуются в ассемблер.
Вероятно, не случайно, что скомпилированные языки & apos; преимущества перед сборкой наиболее существенны с кодом, который включает в себя множество логики принятия решений, где графические процессоры работают относительно плохо, а преимущества кода сборки являются лучшими в коде, чей общий поток не влечет за собой никаких сложных решений, что также является ситуацией где графические процессоры работают лучше всего.
Учитывая, что основная часть работы в игровом программировании связана с GPU и с дисковым вводом / выводом, сборка в большинстве случаев не приносит вам большой пользы в этой области. С другой стороны, в программировании игр вы не слишком беспокоитесь о поддержке кода, поэтому один из основных недостатков сборки не применяется.
В наши дни большинство игровых программ ведется на C или C ++. Основными оставшимися исключениями будет код, использующий преимущества SIMD-блоков (например, VMX XU60 или SPU Cell), хотя даже в этих случаях часто используются библиотеки или встроенные функции компилятора, а не встроенная сборка.
3

что проект параллельных вычислений Folding @ Home использует оптимизированный код сборки для максимальной скорости. *

& # xA0; * Примечание. Это не означает, что сборка всегда выполняется быстрее, чем C / C ++.

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