11

Linuxでアセンブラから始めています。次のコードを testasm.c として保存し
、コンパイルしました

#include <stdio.h>
int main(void)
{
    int foo=10,bar=15;

    __asm__ __volatile__ ("addl %%ebx,%%eax"
        : "=eax"(foo) 
        : "eax"(foo), "ebx"(bar) 
        : "eax" 
    );

    printf("foo = %d", foo);

    return 0;
}

この問題を解決するにはどうすればよいですか? (ここから例をコピーしました。)

Debian Lenny、カーネル 2.6.26-2-amd64
gcc バージョン 4.3.2 (Debian 4.3.2-1.1)

解決策:
受け入れられた回答を参照してください。「変更された」句はサポートされていないようです。

4

3 に答える 3

10
__asm__ __volatile__ ("addl %%ebx,%%eax" : "=a"(foo) : "a"(foo), "b"(bar));

動作するようです。レジスター制約の構文は、ある時点で変更されたと思いますが、十分に文書化されていません。生のアセンブリを記述して手間を省く方が簡単だと思います。

于 2009-09-25T17:28:31.293 に答える
0

複数行を使用したい場合は、これも機能します..

  __asm__ __volatile__ (
        "addl %%ebx,%%eax; \
         addl %%eax, %%eax;" 
        : "=a"(foo) 
        : "a"(foo), "b"(bar)
    );

コンパイラが複数行の文字列 (命令) を受け入れるようにするには、'\' を追加する必要があります。

于 2010-01-21T22:42:18.323 に答える