Переносимый исходный код между 386 и amd64? - PullRequest
0 голосов
/ 24 ноября 2011

Цель: иметь один исходный файл ассемблера, который будет собираться как в x86 (i386), так и в x86_64 (amd64)?

Возможно ли это, например, с YASM ?

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Язык ассемблера по определению не переносим между различными архитектурами ЦП.

В зависимости от используемого вами ассемблера, вы можете сделать несколько вещей, которые облегчат перенос части, как сказал Алекс, например, работать с разными именами регистров или команд с помощью макросов и условной сборки (не думайте, что это сделает ваш код более читабелен и не более удобен в обслуживании, чем наличие двух отдельных файлов).

Но на разных архитектурах нельзя ожидать, что один и тот же код будет работать нормально. Особенно с 32- и 64-битными архитектурами.

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

И, наконец, что не менее важно, у вас также будут проблемы с ABI. Соглашения о вызовах различаются даже между x86 (обычно CDECL - все аргументы передаются в стеке) и x86_64 (System V - сначала аргументы передаются в регистрах, затем в стеке).

1 голос
/ 24 ноября 2011

Если вы используете условную сборку, вы можете.Но не ждите, что вы напишете весь код один раз для x86, и он будет работать одинаково на x64 или наоборот.Используйте %if and %ifdef.

Вы также можете создать несколько макросов, которые будут расширяться для разных целей.Например, некоторые RAXPTR расширились бы до EAX или RAX в зависимости от того, какую платформу вы компилируете, и вы можете использовать эту RAXPTR, где EAX / RAX используется в качестве указателя.Аналогично, вы можете создать некоторые макросы PARAM1/2/etc, которые будут расширяться до стандартных параметров, например, ECX/RCX и EDX/RDX для первых двух параметров в соглашении fastcall и [EBP+some constant]/[RBP+some constant] для остальных.Использование макросов таким способом может помочь вам написать в основном переносимый код сборки x86 / x64, но, тем не менее, вы не сможете сделать это без таких вещей, как% if и% ifdef.

...