Есть два шага к этому.Сначала вы должны экспортировать метку как глобальную из файла сборки, используя директиву 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 );
Обратите внимание, что некоторые компиляторы добавляют подчеркивание в начале имен переменных и функций Си.Например, GCC делает это в Mac OS X, но не в Linux.Я не знаю о других платформах / компиляторах.Чтобы быть в безопасности, вы можете добавить оператор asm
в объявление переменной, чтобы сообщить GCC, каково имя сборки для переменной.
extern uint8_t MyLabel asm("MyLabel");