У меня 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
(%edi)
внутри встроенного asm. Вы только сказали компилятору, что указатель является входом, а не памятью, на которую указывает, поэтому он все равно будет оптимизировать сохранение вA[0]
иA[1]
, а также, возможно, инициализацию. Перебор массивов с помощью встроенной сборки, а также Информирование clang эта встроенная сборка считывает определенную область памяти. - person Peter Cordes   schedule 26.10.2018