Используйте метку в сборке из C - PullRequest
12 голосов
/ 08 ноября 2011

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

Ответы [ 2 ]

16 голосов
/ 08 ноября 2011

Есть два шага к этому.Сначала вы должны экспортировать метку как глобальную из файла сборки, используя директиву 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");
0 голосов
/ 08 ноября 2011

Вы можете рассмотреть подпрограмму "getter" на ассемблере.

Кроме того, вы можете просто подделать метку, чтобы она выглядела как подпрограмма для связывателя C, чтобы вы могли взять адрес процедуры "».

...