Возможно ли использование инструкции для захвата указателя массива C/C++?

У меня GAS проблемы со сборкой. С компилятором Visual C++ я могу использовать значения C/C++ прямо в своих блоках сборки. Например:

int A[2] = {0, 0};

_asm
{
  mov ecx, 2
  lea edi, A
  label1:
  mov [edi], ecx
  add edi, 4
  loop label1
}

Этот код будет без проблем скомпилирован с помощью инструментов Microsoft Visual C++, а значениями массива будут A[0] == 2 и A[1] == 1. Итак, мой вопрос: могу ли я leal указать адрес начала массива C/C++ в GCC's GAS сборке? Чтобы получить вид:

leal %edi, A

person Max Vlasov    schedule 25.10.2018    source источник
comment
Нет, вам нужны входные ограничения. локальные переменные не имеют имен символов, которые вы можете использовать в ассемблере. Руководства см. на stackoverflow.com/tags/inline-assembly/info.   -  person Peter Cordes    schedule 26.10.2018
comment
gcc использует совершенно другой встроенный синтаксис asm с ограничениями. Хотя вы можете добиться этого, вам, вероятно, следует использовать внешний модуль asm с функцией, которую вы можете вызывать. Также обратите внимание, что только потому, что вы кодируете его на ассемблере, он не обязательно будет быстрее (если это ваша мотивация).   -  person Jester    schedule 26.10.2018
comment
Да, поэтому я думаю, что мне нужно изучить кое-какую документацию. Но не могли бы вы, пожалуйста, привести мне какой-нибудь наглядный пример того, как это могло бы выглядеть?   -  person Max Vlasov    schedule 26.10.2018
comment
@Jester: этого недостаточно, чтобы безопасно разыменовывать (%edi) внутри встроенного asm. Вы только сказали компилятору, что указатель является входом, а не памятью, на которую указывает, поэтому он все равно будет оптимизировать сохранение в A[0] и A[1], а также, возможно, инициализацию. Перебор массивов с помощью встроенной сборки, а также Информирование clang эта встроенная сборка считывает определенную область памяти.   -  person Peter Cordes    schedule 26.10.2018