Использовать ярлык в сборке от C

Мне просто нужен способ загрузки адреса метки, например. MyLabel: в частности. 'src.asm' в переменную, например. 'Src.c. (Эти файлы будут связаны друг с другом) Я использую gcc и nasm для сборки этих файлов. Как загрузить адрес метки?

Ответ 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, чтобы вы могли взять адрес "процедуры".