質問: ``` int sample(int n){ __asm__(" movl %eax,%edi \n\ /*引数nをeaxレジスタに*/ testl $1,%eax \n\ /*1とレジスタeaxの論理積*/ jz L1 \n\ /*論理積が1ならL1にジャンプ*/ movl &1,%eax \n\ /*戻り値を1にする*/ jmp end \n\ /*endへジャンプ*/ L1: \n\ movl $0,%eax \n\ /*戻り値を0にする*/ end: \n\ "); } main(void){ printf("%d\n",sample(2)); } ``` Cのプログラムの中にasm文でアセンブラ言語をかきました。しかし、 「'L1' is already defined」「'end' is already defined」というエラーが出てしまいます。 なぜ、このようなエラーが出てしまうのか分かりません。jz命令の書き方が間違っているのでしょうか?どこをどう直したら良いか教えて下さい。お願いします。
回答: L1:のあとに全角スペース入ってますね。 それを削除すればどうなるでしょうか ああ、 movl $0,%eax \n\ /*戻り値を0にする*/ にも全角スペースが。。 実際にコンパイルできるようにしてみました。 (コンパイルが通るようにしただけで、動作はどうなるかは関知しません) 疑問があればどうぞ。 ``` int sample(int n){ __asm__( "movl %eax,%edi \n" /*引数nをeaxレジスタに*/ "testl $1,%eax \n" /*1とレジスタeaxの論理積*/ "jz L1 \n" /*論理積が1ならL1にジャンプ*/ "movl $1,%eax \n" /*戻り値を1にする*/ "jmp end \n" /*endへジャンプ*/ "L1: \n" "movl $0,%eax \n" /*戻り値を0にする*/ "end: \n" ); } ```