2017-05-31 6 views
0

私はCからインラインアセンブリへのコードを書き直すことになっています。コードは10進数を16進数に変換しています。Cとインラインアセンブリ

コードIを転送することが出来るのですが、次のとおりです。

#include <stdio.h> 
static int a; 
int main() { 
char str[]="XX je hex\n"; 

if (scanf("%i", &a)==1) { 

    /* This part of code i am supposed to transfer */ 

    int tmp = (a>>4)&0x0f; 
    if (tmp <= 9) { 
    tmp+='0'; 
    } else { 
    tmp+='A'-10; 
    } 
    str[0]=tmp; 
    tmp = a&0x0f; 
    if (tmp <= 9) { 
    tmp+='0'; 
    } else { 
    tmp+='A'-10; 
    } 
    str[1]=tmp; 
    /* Ends here */ 
    write(1, str, 10); 
} 
return 0; 
} 

これまでのところ、私はこの

asm volatile (

     "mov %a,%bx;" 
     "shrw $4,%%bx;" 
     "and $0x0f, %%bx;" 

     "cmp $9,%bx;" 
     "jle lessOrEq;" 
     "jg greater;" 

     "mov %bx,%str[0];" 

     "mov %a,%bx;" 
     "and $0x0f, %%bx;" 

     "cmp $9,%bx;" 
     "jle lessOrEq;" 
     "jg greater;" 


     "mov %bx,%str[1];" 

     "lessOrEq: add '0',%bx; ret;" 

     "greater: add 'A',%bx; sub 10,%bx; ret;" 

    :"=c"(str[0]), "=d" (str[1]) 
    :"a"(a),"c"(str[0]),"d"(str[1]) 
    : 
); 

を持って、私はこのエラーを取得しています:無効な 'ASM':オペランド番号は、%-letter後に行方不明。

私は何が間違っていますか?アドバイスをいただければ幸いです。

+2

おそらく、どの行がエラーを出すかについて言及することをお勧めします。 –

+0

申し訳ありません。最初の行でエラーが発生しました..エラー:invalid 'asm':%-letter asm volatileの後にオペランドの番号がありません( –

+0

なぜこれをインラインアセンブリとして記述しますか? – fuz

答えて

2

gccのインラインアセンブリでは、レジスタ名の先頭にという2つの命令と第3の命令の2つの命令()がありますが、他の場所は忘れてしまいます。 %bx%%bxに置き換えるだけでエラーを修正できます。

+0

ありがとうございます!今すぐ正しくコンパイルしましたが、セグメンテーションフォルト(コアダンプ)が出力として表示されます。 –

+1

@ a.vele自分でデバッグ作業をすることをお勧めします(デバッグフラグを使ってコンパイルし、デバッガを使ってプログラムをステップ実行する)。そして、segfaultが発生する行を特定したらあなた自身で修正することができますし、そうでない場合は、新しい質問を開くことができます。なぜなら、この問題に関する問題は修正されているからです。 –

関連する問題