Ошибка компилятора в встроенной сборке ошибка: - C2400: синтаксическая ошибка встроенного ассемблера в "втором операнде"; найдена "новая строка"

Я тестировал код C и наткнулся на это странное ошибка компилятора

следующий код не будет компилироваться

#include<stdio.h>
void main()
{
    int length=6;    
    __asm
    {
        mov eax,length
    }
}

Visual Studio сообщает о следующей ошибке

test.c(7) : error C2400: inline assembler syntax error in 'second operand'; 
found 'newline'

однако я заметил, что если я изменил имя переменной на что-то другое, скажите lengths тогда все было в порядке, следующий код компилируется без каких-либо трудностей

#include<stdio.h>
void main()
{
    int lengths=6;    
    __asm
    {
        mov eax,lengths
    }
}

Я пробовал с другими компиляторами, такими как Digital Mars и Intel Compiler, но везде первый код не может быть скомпилирован.

в чем может быть проблема ? Есть ли другое определение для length в другом месте.

Я хотел бы также добавить, что это один файл, а не проект не может быть нескольких объявлений.

2 ответов


смотрите здесь: http://msdn.microsoft.com/en-US/library/wxh0awwe%28v=vs.80%29.aspx

конкретно

операторы длины, размера и типа имеют ограниченное значение в встроенной сборке. Они вообще не могут использоваться с оператором DUP (поскольку невозможно определить данные с помощью директив или операторов MASM). Но вы можете использовать их, чтобы найти размер переменных или типов C или c++:


Я думаю, причина может быть в том, что длина - это функция-член

и MSDN говорит:

на длина, операторы размера и типа имеют ограниченное значение в inline собрание. Их вообще нельзя использовать с оператором DUP (потому что вы не можете определить данные с директивами или операторами MASM). Но вы можете используйте их, чтобы найти размер переменных или типов C или c++:

в длина оператор может возвращать количество элементов в массиве. Он возвращает значение 1 для non-массив переменных.