2014-12-31 3 views
2

Я использую GCC (исправление) SDCC с Eclipse IDE для компиляции кода C для встроенной цели архитектуры 8051. Мне нужно вставить несколько NOP для синхронизации, и я не могу заставить компилятор принять встроенный код сборки.sdcc inline asm() не работает

С __asm__ ("; This is a comment\nlabel:\n\tnop"); (как предложено ниже) или вариациями я получаю предупреждение 112: функции «__asm__» неявного объявления, а затем ошибка 101: слишком много параметров, как будто я пытаюсь вызвать необъявленную функцию. Я также пробовал все остальные опции в разделе 3.14. __asm ... __endasm дает синтаксическую ошибку на __asm, то же самое с одним нижним баром, а комбинации пробелов, строк новой строки или той же строки не помогают.

Если я склеивание командной строки из Makefile правильно (без пути #include), то CFLAGS в командной строке SDCC является:

-Wp,-MD,$(@:%.rel=%.d),-MT,[email protected],-MP --disable-warning 110 -Wa,-p --model-medium

+2

Пожалуйста, покажите всю свою функцию и командную строку, которую вы используете, чтобы скомпилировать этот код. –

+2

Вы говорите, что вы компилируете для 8051, и вы говорите GCC. Для меня это не имеет смысла - или есть порт GCC для 8051 сейчас? Какой компилятор вы действительно используете? Вы используете mcs51gcc? Кстати, что вы подразумеваете под «стандартным синтаксисом»? C89/C99/C11 не определяют синтаксис встроенной сборки. –

+1

AFAIK: для gcc для обнаружения ключевого слова asm вам необходимо передать '-std = gnu99' как флаг gcc во время компиляции –

ответ

1

Переехал из comment

В лексере sources of SDCC 3.1.0 «s, я вижу, что оба _asm/_endasm и __asm/__endasm поддерживаются. Я еще не заметил поддержки для __asm("string") в парсере.

Также в коде лексера, в типе лексического инлайн сборки маркера «Blob» получает изменено на CPP_ASMтолько если свойство называется preproc_asm устанавливается в 0, как можно видеть в sdcc/support/cpp/libcpp/lex.c:1900.

 result->type = CPP_NAME; 
     { 
     struct normalize_state nst = INITIAL_NORMALIZE_STATE; 
     result->val.node.node = lex_identifier (pfile, buffer->cur - 1, false, 
               &nst); 
     warn_about_normalization (pfile, result, &nst); 
     } 

     /* SDCC _asm specific */ 
     /* handle _asm ... _endasm ; */ 
     if (result->val.node.node == pfile->spec_nodes.n__asm || result->val.node.node == pfile->spec_nodes.n__asm1) 
     { 
      if (CPP_OPTION (pfile, preproc_asm) == 0) 
      { 
       comment_start = buffer->cur; 
       result->type = CPP_ASM; 
       _sdcpp_skip_asm_block (pfile); 
       /* Save the _asm block as a token in its own right. */ 
       _sdcpp_save_asm (pfile, result, comment_start, result->val.node.node == pfile->spec_nodes.n__asm); 
      } 
      result->flags |= ENTER_ASM; 
     } 
     else if (result->val.node.node == pfile->spec_nodes.n__endasm || result->val.node.node == pfile->spec_nodes.n__endasm1) 
     { 
      result->flags |= EXIT_ASM; 
     } 
     /* Convert named operators to their proper types. */ 
     else if (result->val.node.node->flags & NODE_OPERATOR) 
     { 
      result->flags |= NAMED_OP; 
      result->type = (enum cpp_ttype) result->val.node.node->directive_index; 
     } 
     break; 

Решение было добавить #pragma preproc_asm - (или +) в верхней части файла и использовать многострочный __asm/__endasm блоков.

+0

@CarpeCimex Я взял на себя смелость включить соответствующий исходный код lexer, тот, который заставил меня понять значимость '#pragma preproc_asm (+ | -)'. –

+1

@Iwillnotexist_Idonotexist '#pragma preproc_asm +' в верхней части файла и многострочный блок сборки __asm ​​... __endasm', как в верхней части страницы 51 в [manual] (http://sdcc.sourceforge.net/ doc/sdccman.pdf). Большое спасибо! – CarpeCimex

+0

@CarpeCimex С другой мыслью: содержит ли код просто _compile_ или 'nop' фактически присутствует в двоичном выходе? –

0

этой ссылка: 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");' потому что мнемоника инструкции по сборке не может быть первой вещью на линии (эта привилегия для этикеток)

+0

Вопрос о GCC. Вы ссылаетесь на ссылку для какой-либо другой системы. –

+2

В защиту ответа afaik GCC не поддерживает 8051, и вопрос был около 8051. Я бы сказал, что частично непонятно, что парень действительно спрашивает. –