Можно ли получить доступ к переменным, определенным в сборке из C? - PullRequest
5 голосов
/ 12 марта 2012

Могу ли я читать или записывать переменную, определенную в моем файле сборки в моем C-файле?Я не мог понять это самостоятельно.Например, файл C выглядит следующим образом:

int num = 33;

и производит этот код сборки:

    .file   "test.c"
    .globl  _num
    .data
    .align 4
_num:
    .long   33

Когда я начал изучать ассемблер, я часто слышал, что скорость - причина, почему у меня естьвыбрать сборку и уменьшить размер файла и все такое прочее ...

Я использую сборку mnw (32 бит) GNU в Windows 7

Ответы [ 2 ]

6 голосов
/ 12 марта 2012

Да, компоновщик объединяет все файлы .o (созданные из файлов .s) и создает один объектный файл.Таким образом, все ваши файлы c сначала станут файлами сборки.

Каждый файл сборки будет иметь список импорта и список экспорта.Список экспорта содержит все переменные, которые имеют директиву .global или .globl.Список импорта содержит все переменные, начинающиеся с extern в файле c.(Однако, в отличие от NASM, GAS не требует объявления импорта. Все символы, которые не определены в файле, считаются внешними. Но получающиеся в результате объектные файлы .o или .obj будут иметь импортированные списки символов, которые онииспользовать и требовать определения где-то еще.)

Итак, если ваш файл сборки содержит это:

    .globl  _num        # _num is a global symbol, when it is defined
    .data               # switch to read-write data section
    .align 4
_num:                   # declare the label 
    .long  33           # 4 bytes of initialized storage after the label

Все, что вам нужно сделать, чтобы использовать num, - это создать externпеременная, подобная этой

extern int num;  // declare the num variable as extern in your C code   

, и тогда вы сможете прочитать или изменить ее.


Многие платформы (Windows, OS X) добавляют начальное подчеркивание к именам символовпоэтому переменная C num имеет имя asm _num.Linux / ELF этого не делает, поэтому имя asm также будет num.

4 голосов
/ 12 марта 2012

Да, вы можете совместно использовать переменные в обоих направлениях. используйте .globl как есть, а затем в C объявите внешнюю переменную, как если бы она была в другом модуле C, но вместо этого она находится в модуле asm.

...