2017-09-24 26 views
0

を使わないでアセンブラコードを記述します。

test.c: Assembler messages: 
test.c:7: Error: bad or irreducible absolute expression 
test.c:7: Error: expecting scale factor of 1, 2, 4, or 8: got `$2' 

その後、私は

"leal 2(%%ebx,%%eax,2),%1" 

"leal 2(%%ebx,%%eax,$2),%1" 

を変更: は非常にまず最初に、私は、GCC 5.4.0コンパイラはエラーメッセージを表示します

#include<stdio.h> 
int main(){ 
    int x,y; 
    asm("movl $2,%eax"); 
    asm volatile(
        "movl $1,%0\n\t" 
        "movl %0,%%ebx\n\t" 
        "leal 2(%%ebx,%%eax,$2),%1" 
        :"=m"(x),"=r"(y) 
        ); 
    printf("x is %d, y is %d\n",x,y); 
    return 0; 
} 

を書きました

k。しかし、$ 2は2と等しくないのですか?

+1

この構文では、数字は$が付いていないはずです。通常は$は定数を意味しますが、アドレッシングモードの特定の定数以外のものを持つことはできません。これは定数と言う接頭辞を使用しません。 –

+1

FYI、 '%ebx'をコンパイラーに知らせることなく(クローバー制約付きで)、予期しない結果が生じるでしょう。 (あなたが 'gcc -O2 -S'を使ってコンパイラからの最後のasm出力を読んでいれば予測可能です)。 https://stackoverflow.com/tags/inline-assembly/infoを参照してください。 –

答えて

0

Tの構文では、ドル記号$は、の即値オペランドを示します。は例えば、

add $16,%eax 

eax16を追加)から(eaxにアドレス16に値を追加)

add 16,%eax 

を区別する。これは整数定数には全く関係しないことに注意してください。あなただけのようにもfooは、いくつかのシンボルである

add foo,%eax 

add $foo,%eax 

を令状ができます。 disp(base,index,scale)表記は、SIBアドレッシングを使用するメモリオペランドを示します。このアドレッシングモードの3つの部分のそれぞれは固定された目的を持っていますので、scaleには何も付いていません。結局のところ、私たちはすでにアドレッシングモードを選択しています。なぜかっこ内に別のオペランドタイプのインジケータがあるべきですか?レジスタ名の前にある%は、レジスタ名をマクロ名またはシンボル名と区別するため、依然として必須であることに注意してください。

関連する問題