Статические методы следует вызывать в классе, методы экземпляра следует вызывать в экземплярах класса. Но что это значит на самом деле? Вот полезный пример:
Класс автомобиля может иметь метод экземпляра под названием Accelerate (). Вы можете только ускорить автомобиль, если автомобиль действительно существует (был построен), и поэтому это будет метод экземпляра.
Класс автомобиля может также иметь метод подсчета с именем GetCarCount (). Это вернет общее количество созданных (или построенных) автомобилей. Если никакие автомобили не были построены, этот метод вернет 0, но он все равно должен быть вызван, и поэтому он должен быть статическим методом.
вы можете объявить его дважды?
.global bar
.global _bar
Я не писал сборку через некоторое время, но идентификатор .global просто действует как ярлык?
Один из вариантов, хотя и опасен, заключается в том, чтобы убедить GCC опустить требуемое ABI главное подчеркивание.
blockquote>
-fleading-underscore
Этот параметр и его аналог ,-fno-leading-underscore
, принудительно изменить способ отображения символов C в объектном файле. Одно использование - это ссылка на устаревший ассемблерный код. Предупреждение: переключатель-fleading-underscore
заставляет GCC генерировать код, который не является бинарным, совместимым с кодом, сгенерированным без этого коммутатора. Используйте его для соответствия двоичному интерфейсу приложения, отличного от стандартного. Не все цели обеспечивают полную поддержку этого коммутатора.Другой, более безопасный вариант - явно указать GCC имя, которое будет использовать.
5.39 Управление именами, используемыми в коде ассемблера
Вы можете указать имя, которое будет использоваться в коде ассемблера для функции или переменной C, написав ключевое слово
asm
(или__asm__
) после объявления следующим образом:int foo asm ("myfoo") = 2;
Указывает, что имя, которое будет использоваться для переменной
foo
в коде ассемблера, должно быть `` myfoo' rather than the usual \``_foo
'.В системах, где обычно подчеркивается символ подчеркивания добавленный к имени функции или переменной C, эта функция позволяет вам определять имена для компоновщика, которые не начинаются с подчеркивания.
Не имеет смысла использовать эту функцию с нестационарным локальная переменная, так как такие переменные не имеют имен ассемблера. Если вы пытаетесь поместить переменную в определенный регистр, см. Явные реестры . GCC в настоящее время принимает такой код с предупреждением, но, вероятно, будет изменен, чтобы в будущем выпустить ошибку, а не предупреждение.
Вы не можете использовать
asm
таким образом в функции определение ; но вы можете получить тот же эффект, написав декларацию для функции перед ее определением и помещая тамasm
, например:extern func () asm ("FUNC"); func (x, y) int x, y; /* ... */
. Вы должны убедиться, что ассемблер называет вас выберите, не конфликтуйте с другими символами ассемблера. Кроме того, вы не должны использовать имя регистра; что приведет к совершенно недействительному ассемблерному коду. GCC пока не имеет возможности хранить статические переменные в регистрах. Возможно, это будет добавлено.
blockquote>В вашем случае
extern int bar(int x) asm("bar");
должно указывать GCC, что «
bar
использует имя asm` `bar` ', хотя это функция ccall ".
clang: error: unknown argument: '-no-leading-underscore'
clang: error: unknown argument: '-fno-leading-underscore'
clang: error: unknown argument: '-fleading-underscore'
– anon58192932
19 October 2016 в 13:45
Вы можете использовать препроцессор C для предварительной сборки сборки и использования макроса, чтобы добавить недостающие символы подчеркивания в Windows. Во-первых, вам нужно переименовать файл сборки из bar.s в bar.S (capital 'S'). Это говорит gcc использовать cpp для предварительной обработки файла.
Чтобы добавить недостающие символы подчеркивания, вы можете определить макрос «cdecl» следующим образом:
#if defined(__WIN32__)
# define cdecl(s) _##s
#else
# define cdecl(s) s
#endif
Затем используйте его так: :
.global cdecl(bar)
cdecl(bar):
movl 4(%esp), %eax
addl %eax, %eax
ret
Обратите внимание, что для Mac OSX также требуются ведущие символы подчеркивания, поэтому вы можете обновить первую строку макроса следующим образом:
#if defined(__WIN32__) || defined(__APPLE__)
Компиляторы для цели ELF не добавляют по умолчанию подчеркивания подчеркивания. Вы можете добавить -fleading-underscore
при компиляции в формат ELF (под Linux). Используйте условное выражение в файле makefile.
Ссылка: http://opencores.org/openrisc,gnu_toolchain (выполните поиск на странице «оставить глобальные имена без изменений»)