Что означает сообщение об ошибке GCC Ошибка: не поддерживается для `mov '?

Я просто пытаюсь скомпилировать простой пример кода, который я набрал из книги, и GCC выдает мне указанную выше ошибку. Вот мой код:

$ cat -n test.cpp

 1  #define READ_COMMAND    3
 2  
 3  #define MSG_LENGTH  128
 4  
 5  #include <stdlib.h>
 6  #include <stdio.h>
 7  
 8  int main(int argc, char *arg[])
 9  {
10      int syslog_command = READ_COMMAND;
11      int bytes_to_read = MSG_LENGTH;
12      int retval;
13      char buffer[MSG_LENGTH];
14  
15      asm volatile(
16          "movl %1, %%ebx\n\t"
17          "movl %2, %%ecx\n\t"
18          "movl %3, %%edx\n\t"
19          "movl $103, %%eax\n\t"
20          "int $128\n\t"
21          "movl %%eax, %0"
22          :"=r" (retval)
23          :"m"(syslog_command),"r"(buffer),"m"(bytes_to_read)
24          :"%eax","%ebx","%ecx","%edx");
25      if (retval > 0) printf("%s\n", buffer);
26  
27  }
28  
29  

Код должен вызывать syslog() системный вызов для чтения последних 128 байтов из кольцевого буфера printk() ядра. Вот некоторая информация о моей ОС и конфигурации системы:

uname -a:

Linux 3.2.0-26-generic # 41-Ubuntu SMP Чт, 14 июня 17:49:24 UTC 2012 x86_64 x86_64 x86_64 GNU / Linux

gcc -v:

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu

Настраивается с помощью: ../src/configure -v --with-pkgversion = 'Ubuntu / Linaro 4.6.3-1ubuntu5' --with-bugurl = file: ///usr/share/doc/gcc-4.6/README. Ошибки --enable-languages ​​= c, c ++, fortran, objc, obj-c ++ --prefix = / usr --program-suffix = -4.6 --enable-shared --enable-linker-build-id --with- system-zlib --libexecdir = / usr / lib --without-included-gettext --enable-threads = posix --with-gxx-include-dir = / usr / include / c ++ / 4.6 --libdir = / usr / lib --enable-nls --with-sysroot = / --enable-clocale = gnu --enable-libstdcxx-debug --enable-libstdcxx-time = yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32 = i686 --with-tune = generic --enable-check = release --build = x86_64-linux-gnu --host = x86_64- Linux-GNU --target = x86_64-Linux-GNU

Thread model: posix

gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 

Вот полная ошибка:

$ gcc test.cpp

test.cpp: Assembler messages:

test.cpp:25: Error: unsupported for `mov'

person Dan    schedule 07.07.2012    source источник
comment
Это все сообщение? Для какой строки кода это?   -  person Alexey Frunze    schedule 07.07.2012
comment
Пожалуйста, не размещайте код с номерами строк; это значительно затрудняет его копирование и вставку. Просто добавьте комментарий, показывающий, какая строка находится под номером 25.   -  person Keith Thompson    schedule 07.07.2012
comment
Я пробовал это в своей системе (Ubuntu 12.04, gcc версий 4.6 и 4.7). Когда я компилирую его как C (с расширением файла .c, а не .cpp), он компилируется и связывается без ошибок. Я получаю странный segfault, когда запускаю его; Я недостаточно знаю, что он должен делать, чтобы понять это.   -  person Keith Thompson    schedule 07.07.2012


Ответы (1)


Вы пытаетесь скомпилировать 32-битный ассемблерный код на 64-битной машине. Указанная вами встроенная сборка компилируется в:

movl -24(%rbp), %ebx
movl %rsi, %ecx       <--- error here
movl -28(%rbp), %edx
movl $103, %eax
int $128
movl %eax, %r12d

Как видите, вы пытаетесь сохранить 64-битный регистр в 32-битном регистре, что является незаконным. Что еще более важно, это также не 64-битный протокол системных вызовов ABI.

Попробуйте скомпилировать с -m32, чтобы заставить 32-битный ABI.

person bdonlan    schedule 07.07.2012