Как использовать встроенную сборку gcc в icc?

У меня есть следующий код C со встроенной сборкой в ​​стиле встроенной сборки gcc

asm goto("1: jmp %l[t_no]\n"
      "2:\n"
      ".section .altinstructions,\"a\"\n"
      " .long 1b - .\n"
      " .long 0\n"
      " .word %P0\n"
      " .byte 2b - 1b\n"
      " .byte 0\n"
      ".previous\n"
      : : "i" (bit) : : t_no);

Я хотел бы скомпилировать его с помощью icc, но при компиляции возникает ошибка:

error: invalid constant in assembly language instruction  
asm goto("1: jmp %l[t_no]\n"  

Как решить проблему? Спасибо.


person qpalz    schedule 16.02.2012    source источник
comment
Для проблемы jmp: если бы вы компилировали с помощью gcc, я бы подозревал, что у вас не было метки t_no, определенной в вашем коде c. Для icc, возможно, они не поддерживают указание таких меток. Вы пробовали использовать jmp %l1?   -  person David Wohlferd    schedule 07.03.2015


Ответы (2)


Я считаю, что вам следует использовать ссылку -fasm-blocks.

person sschuberth    schedule 16.02.2012
comment
Я это знаю, но ошибки случаются. Я считаю, что это проблема стиля AT&T и стиля Intel. - person qpalz; 16.02.2012

icc поддерживает стили ассемблера Intel (nasm) и GNU.

Для синтаксиса Gnu используйте примитив __asm__:

__asm__ ("
   movq %rsp, %rbpn
");

Для синтаксиса Intel используйте __asm{}:

__asm{
  mov      rbp, rsp;
}
person jupp0r    schedule 16.02.2012
comment
Является ли asm("something") для синтаксиса Gnu или синтаксиса Intel? - person qpalz; 16.02.2012
comment
На самом деле это синтаксис GNU. Возможно, вам придется вставить некоторые макросы препроцессора, которые переключаются между директивами в зависимости от компилятора. - person jupp0r; 16.02.2012
comment
Ошибка для asm goto("1: jmp %l[t_no]\n"): ошибка: недопустимая константа в инструкции на ассемблере. Почему? - person qpalz; 16.02.2012
comment
Можете ли вы обновить вопрос с некоторым кодом? Трудно сказать иначе. - person jupp0r; 16.02.2012