Если вы думаете «PC == Windows», то добавление ассемблера в программу на C не сильно повредит. Если вы вступите в мир Unix, у вас будет много разных процессоров: PPC в PS3 или XBox, старые Mac и множество мощных серверов. Для многих маленьких устройств у вас будет ARM. Встраиваемые устройства (на которые сегодня приходится подавляющее большинство установленных процессоров) обычно используют свои собственные процессоры со специальным набором инструкций.
Таким образом, хотя многие ПК сегодня могут выполнять код Intel, на него приходится лишь небольшая доля всех процессоров.
Тем не менее, код x86 тоже не всегда одинаков. Существует две основные причины для ассемблерного кода: вам нужно получить доступ к специальным функциям (таким как регистры прерываний) или вы хотите оптимизировать код. В первом случае код довольно переносим. В последнем случае каждый процессор немного отличается. Некоторые из них имеют SSE . Но вскоре SSE был заменен SSE2, который был заменен SSE3 и SSE4. У AMD есть свой бренд. Скоро будет AVX. На уровне кода операции у каждого из них есть немного различное время на разных версиях процессоров.
Что еще хуже, некоторые коды операций имеют ошибки, которые исправлены в определенных степенях процессора. Кроме того, в некоторых версиях процессоров некоторые коды операций выполняются намного быстрее, чем в других.
Затем вам нужно будет связать этот код сборки с частью C. Обычно это означает, что вам либо нужно решить ABI проблемы.
Итак, вы можете видеть, что это может стать сколь угодно сложным.