Насколько непортативный ассемблер, / действительно/?

Нет, параметры функции не оценены в определенном порядке в C.

Видят ответы Martin York на , Каково все общее неопределенное поведение, о котором должен знать программист C++? .

7
задан Carson Myers 18 September 2009 в 06:53
поделиться

4 ответа

Помимо самого процессора, конечно, всегда есть другие соображения: каковы соглашения о вызовах на вашей целевой платформе? Как значения struct передаются другим функциям (например, API)? Какие регистры могут быть заблокированы вызываемым пользователем? Какие гарантированно сохранятся для звонящего? Как сделать системный вызов? Какая схема памяти подготовлена ​​для вас ОС при запуске процесса?

16
ответ дан 6 December 2019 в 05:06
поделиться

Перенос сборки, также существует проблема ABI, которая варьируется от ОС к ОС. Перенос программы C из Unix в Windows (или даже из Linux в OpenBSD) может быть простой перекомпиляцией, но для программы сборки вы можете обнаружить, что некоторые регистры сохранения вызываемого объекта становятся сохранением вызывающего объекта, или что параметры с плавающей запятой изменяются. прошло иначе.

И это не только теоретически, а именно. register r2 версий Linux и Mac OS X для PowerPC. На практике проблема может быть не такой уж серьезной, например, AMD опубликовала «рекомендуемый» ABI одновременно со своим 64-битным набором инструкций.

11
ответ дан 6 December 2019 в 05:06
поделиться

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

Но даже сейчас процессор arm возвращается (т.е. нетбук следующего поколения), и я уверен, что процессор не изменится в следующем году.

Я бы сказал, что ассемблер не является переносимым по дизайну.

3
ответ дан 6 December 2019 в 05:06
поделиться

Если вы думаете, что «ПК == Windows», то добавление ассемблера в программу на C не повредит. Если вы войдете в мир Unix, у вас будет много разных процессоров: PPC в PS3 или XBox, старые Mac и множество мощных серверов. Для многих небольших устройств у вас будет ARM. Встроенные устройства (на которые сегодня приходится подавляющее большинство установленных ЦП) обычно используют свой собственный ЦП со специальным набором инструкций.

Таким образом, хотя многие ПК сегодня могут запускать код Intel, это составляет лишь небольшую часть все ЦП.

Тем не менее, код x86 тоже не всегда одинаков. Есть две основные причины использования ассемблерного кода: вам нужен доступ к специальным функциям (например, регистрам прерываний) или вы хотите оптимизировать код. В первом случае код довольно переносимый. В последнем случае, каждый процессор немного отличается. Некоторые из них имеют SSE . Но вскоре SSE был заменен SSE2, который был заменен на SSE3 и SSE4. У AMD есть собственный бренд. Скоро будет AVX. На уровне кода операции каждый из них имеет немного разную синхронизацию на разных версиях ЦП.

Что еще хуже, некоторые коды операций содержат ошибки, которые исправляются в определенных степпингах ЦП. Вдобавок ко всему, некоторые коды операций намного быстрее на одних версиях процессоров, чем на других.

Затем вам нужно связать этот ассемблерный код с частью C. Обычно это означает, что вам нужно либо иметь дело с проблемами ABI .

Итак, вы можете видеть, что это может стать произвольно сложным.

У AMD есть собственный бренд. Скоро будет AVX. На уровне кода операции каждый из них имеет немного разную синхронизацию на разных версиях ЦП.

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

Затем вам нужно связать этот ассемблерный код с частью C. Обычно это означает, что вам нужно либо иметь дело с проблемами ABI .

Итак, вы можете видеть, что это может стать произвольно сложным.

У AMD есть собственный бренд. Скоро будет AVX. На уровне кода операции каждый из них имеет немного разную синхронизацию на разных версиях ЦП.

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

Затем вам нужно связать этот ассемблерный код с частью C. Обычно это означает, что вам нужно либо иметь дело с проблемами ABI .

Итак, вы можете видеть, что это может стать произвольно сложным.

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

Затем вам нужно связать этот ассемблерный код с частью C. Обычно это означает, что вам нужно либо иметь дело с проблемами ABI .

Итак, вы можете видеть, что это может стать произвольно сложным.

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

Затем вам нужно связать этот ассемблерный код с частью C. Обычно это означает, что вам нужно либо иметь дело с проблемами ABI .

Итак, вы можете видеть, что это может стать произвольно сложным.

9
ответ дан 6 December 2019 в 05:06
поделиться
Другие вопросы по тегам:

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