2016-10-05 21 views
1

私は64ビットLinuxシステムのために私自身の読み込みシステムコールを作ろうとしています。それは私が悪いタイプを持っていることを私に伝え続けます。コンパイラが間接的にbufに対処しようとしていますか?私は自分の入力制約の中でうんざりしている気がします。私はちょうど%2でbufのアドレスが必要です。インラインasmタイプの不一致

エラー:

test.c: Assembler messages: 
test.c:28: Error: operand type mismatch for `movq' 


static int myread(int fd, char *buf, int size) { 
    register int bytes; 

    asm(
    "movq $0, %%rax\n" 

    "movq %1, %%rdi\n" 
    "movq %2, %%rsi\n" 
    "movq %3, %%rdx\n" 
    "syscall\n" 

    "movq %%rax, %0" 

    : "=r" (bytes) 
    : "m" (fd), "m" (buf), "m" (size) 
    : "%rax", "%rdi", "%rsi", "%rdx" 
    ); 

    return bytes; 
} 
+1

'int'が32ビット整数の場合、これらのエラーが発生します。 – Mysticial

答えて

1

神秘は不一致エラーは、あなたが(FDやサイズなど)32ビット整数に(64ビットの値です)movqを使用しているという事実から来て、言ったように。

しかし、それ以外の場合、このコードはとなります。実際にはには微妙な(しかし危険な)欠陥があります。たぶんもっとこのような何か:これを理解するには

static int myread(int fd, char *buf, int size) { 
    register int bytes; 

    asm(
     "syscall" 

    : "=a" (bytes) 
    : "D" (fd), "S" (buf), "d" (size), "0" (0) 
    : "rcx", "r11", "memory", "cc" 
    ); 

    return bytes; 
} 

、i386用machine constraintsをチェックしてください。

syscallsはrcxとr11レジスタを壊すことに注意してください。これらの値を変更していることをコンパイラーに知らせないと、非常に奇妙な問題が発生する可能性があります。そして、問題はシステムコールではなく、100ライン下流で発生します。

私はまた、インラインasmを使用しないためのピッチを作るつもりです。なぜあなたは単にシステムコールを使いたくないのか分かりませんが、あなたは悲しみのために自分自身を設定しています。

+0

私は学術目的のためだけに些細なシェルプログラムを書いています。 https://github.com/MrOutput/learning/blob/master/shell/shell.c gccは何かを駄目にすることなくコードをさらに最適化できないようです。 AMD64のabiでは、どのレジスタが特定のシステムコールによって閉塞されているかについての情報は見つかりませんでした。あなた自身で学習の方向に私を指摘できますか?あなたの時間をありがとう! – Rafael

+0

aha私はちょうどA.2.1でそれを見つけました – Rafael

+0

私は低レベルの詳細を学ぶことは本当に私がより高いレベルでより良いプログラムを助けることがわかります。私はこれらの些細なプログラムが私のために非常に啓発されていることを知ります。 – Rafael

関連する問題