Независимые от режима макросы
Если Вы хотите записать ассемблерный код, работающий и в 32-разрядном PowerPC и в 64-разрядных средах PowerPC, необходимо удостовериться, что специфичный код на 32 бита работает в 32-разрядных средах и специфичных выполнениях кода на 64 бита в 64-разрядных средах. Это приложение представляет макросы, включенные в OS X v10.4 SDK для упрощения разработки ассемблерного кода, работающего в обеих средах.
mode_independent_asm.h
файл в /usr/include/architecture/ppc
определяет ряд макросов, которые упрощают писать код, работающий в 32-разрядном PowerPC и 64-разрядных средах PowerPC. Они макросы включают и явные константы и псевдо мнемонику. Например, GPR_BYTES
постоянный также 4
или 8
(размер регистров общего назначения). И lg
псевдо мнемосхема расширяется до lwz
в 32-разрядной среде или ld
в 64-разрядной среде. Документы заголовочного файла все макросы подробно.
Например, 32-разрядный код для получения указателя при смещении 16 от GPR15 в GPR14:
lwz r14,16(r15) |
64-разрядный код:
ld r14,16(r15) |
Один способ поддерживать обе среды при помощи условных операторов включения. Например, следующее использование кода __ppc64__
определить, работает ли программа в 64-разрядном режиме и выполняет надлежащий оператор:
#ifdef __ppc64__ |
ld r14,16(r15) |
#else |
lwz r14,16(r15) |
#endif |
Однако более простой путь состоит в том, чтобы использовать lg
псевдо мнемосхема, как показано здесь:
#include <architecture/ppc/mode_independent_asm.h> |
... |
lg r14,16(r15) |
Если Вы пишете код, вызывающий функции, которые могут быть перемещены, Вы, возможно, должны создать ленивый указатель символа в 32-разрядном коде, подобном этому:
.lazy_symbol_pointer |
L_foo$lazy_ptr: |
.indirect_symbol _foo |
.long dyld_stub_binding_helper |
Последовательность сборки для что касается 64-разрядного кода, подобно 32-разрядному коду, но необходимо гарантировать, чтобы Вы выделили 8-байтовую площадь для символа, с помощью .quad
вместо .long
, как показано здесь:
.lazy_symbol_pointer |
L_foo$lazy_ptr: |
.indirect_symbol _foo |
.quad dyld_stub_binding_helper |
Используя g_long
независимый от режима макрос вместо .long
или .quad
, можно записать оптимизированную последовательность двойной среды, не добавляя #ifdef
оператор. Независимая от режима последовательность была бы похожа на это:
#include <architecture/ppc/mode_independent_asm.h> |
... |
.lazy_symbol_pointer |
L_foo$lazy_ptr: |
.indirect_symbol _foo |
.g_long dyld_stub_binding_helper |