3

MS の単純なアセンブリ コードを gcc で使用するように変換しようとしています。変換しようとしている MS アセンブリはすぐ下にあります。2 つのint変数がnumberあり_returnます。

mov eax, number
neg eax
return, eax

そして、私はこれを試しました:

asm("movl %eax, %0" :: "g" ( number));
asm("neg %eax");
asm("movl %0, %%eax" : "=g" ( return ));

しかし、コンパイラは私にこのエラーを与えます:

main.c:17:9: エラー: 無効な 'asm': % 文字の後にオペランド番号がありません

エラーはどこにあり、このエラーを修正するにはどうすればよいですか? ありがとう

4

2 に答える 2

9

コンパイラに通知せずにレジスタを上書きしているため、そのようにすることはできません。また、%printf に似た特殊文字です。

また、すべての命令を 1 つにまとめたほうasmがよいでしょう。

代わりにこれを試してください:

asm("movl %%eax, %1\n\t"
    "neg %%eax\n\t"
    "movl %0, %%eax" : "=g" ( _return )  : "g" ( number) : "eax");

ただし、おそらくより良い方法があります。

asm("neg %0": "=a" ( _return )  : "a" ( number));

なぜできないのかわかりません(Cで):

_return = -number;
于 2013-02-27T13:56:14.857 に答える
5

次のようなものを試してください:

#include <stdio.h>
#include <stdlib.h>
int main(int ac,char**av)
{
    int n=ac>1?atoi(av[1]):42;
    asm ("movl %0, %%eax \n\t"
         "neg %%eax \n\t"
         "movl %%eax, %0 \n\t" : "+r" (n)::"eax");
    printf("%d\n",n);
}     

問題は次のとおりです。

  • オペランドの順序はinstr src,dst
  • %% それ以外の %
  • アセンブラの独立した行はありません -- 入力/出力/クロバー リストはすべてのアセンブラ ブロックに関連付けられています。
  • '+r' は、入力と出力の両方として機能するパラメーターを持ちます
  • MSでさえキーワード「return」をそのように使用できるとは思えません

さらに効率的にするには、次のようにします。

asm("neg %0" : "+r" (n) ::);  // works as well
于 2013-02-27T13:58:40.710 に答える