Мне просто нужен способ загрузки адреса метки, например. MyLabel: в частности. 'src.asm' в переменную, например. 'Src.c. (Эти файлы будут связаны друг с другом) Я использую gcc и nasm для сборки этих файлов. Как загрузить адрес метки?
Использовать ярлык в сборке от C
Ответ 1
Для этого есть два шага. Во-первых, вы должны экспортировать метку глобально из файла сборки с помощью директивы global
.
global MyLabel
MyLabel: dd 1234 ; data or code, in whatever section. It doesn't matter.
Далее вы должны объявить метку как внешнюю в C. Вы можете сделать это либо в коде, используя его, либо в заголовке.
// It doesn't matter, and can be plain void,
// but prefer giving it a C type that matches what you put there with asm
extern void MyLabel(void); // The label is code, even if not actually a function
extern const uint32_t MyLabel[]; // The label is data
// *not* extern long *MyLabel, unless the memory at MyLabel *holds* a pointer.
Наконец, вы получите адрес метки в C так же, как вы получите адрес любой переменной.
doSomethingWith( &MyLabel );
Обратите внимание, что некоторые компиляторы добавляют символ подчеркивания к началу имен переменных C и функций. Например, GCC делает это на Mac OS X, но не на Linux. Я не знаю о других платформах/компиляторах. Чтобы быть в безопасности, вы можете добавить оператор asm
в объявление переменной, чтобы сообщить GCC, что такое имя сборки для переменной.
extern uint8_t MyLabel asm("MyLabel");
Ответ 2
Вы можете рассмотреть процедуру ассемблера "getter".
Кроме того, вы можете просто подделать ярлык, чтобы он выглядел как подпрограмма связующего элемента C, чтобы вы могли взять адрес "процедуры".