этой ссылка: http://www.crossware.com/smanuals/c8051/_t243.html
имеет это о встроенном ассемблерном коде
Код ассемблера может быть встроен в ваш исходный код С двумя способами:
using the #asm/#endasm preprocessor directives
using the _asm keyword
Предпроцессорные директивы #asm и #endasm позволяют включать код ассемблера в любом месте файла исходного кода C, единственным ограничением является то, что он не может быть помещен в выражение. Все строки между #asm и #endasm передаются прямо через немодифицированный промежуточный файл, обработанный ассемблером, и поэтому поддерживаются все правила для исходного кода кросс-ассемблера.
Предписывающие процессоры директивы #if, #ifdef, #ifndef, #else, #elif и #endif действуют между #asm и #endasm и поэтому могут использоваться для поддержания кода ассемблера, если это необходимо.
Ключевое слово _asm можно использовать только в функциях. Он используется со следующим синтаксисом:
_asm();
Строковая константа передается непосредственно без изменений в виде одной строки в промежуточный файл, обработанный ассемблером. Поэтому каждая из них должна быть допустимой строкой кода ассемблера.
Одним из преимуществ синтаксиса _asm является то, что он подлежит замене токена препроцессором C. Поэтому оператор может быть сгенерирован рядом макросов.
Также с синтаксисом _asm компилятор поддерживает специальную конструкцию, которая обеспечивает легкий доступ к переменным C. Если имя переменной помещается в строку contant внутри фигурных скобок, компилятор заменяет имя переменной (и фигурные скобки) соответствующей подстрокой в зависимости от местоположения переменной. Более подробную информацию см. В следующих разделах.
Компилятор генерирует мнемонику верхнего регистра, и поэтому, если для строкового кода ассемблера выбран строчный регистр, он может быть четко отличен от кода, сгенерированного компилятором в файле списка.
однако правильный формат: '_asm ("nop");' потому что мнемоника инструкции по сборке не может быть первой вещью на линии (эта привилегия для этикеток)
Пожалуйста, покажите всю свою функцию и командную строку, которую вы используете, чтобы скомпилировать этот код. –
Вы говорите, что вы компилируете для 8051, и вы говорите GCC. Для меня это не имеет смысла - или есть порт GCC для 8051 сейчас? Какой компилятор вы действительно используете? Вы используете mcs51gcc? Кстати, что вы подразумеваете под «стандартным синтаксисом»? C89/C99/C11 не определяют синтаксис встроенной сборки. –
AFAIK: для gcc для обнаружения ключевого слова asm вам необходимо передать '-std = gnu99' как флаг gcc во время компиляции –