2017-11-24 19 views
1

CでインラインアセンブリコードとしてAtomic LDSET ARM命令(http://www.keil.com/support/man/docs/armclang_asm/armclang_asm_chi1476202820379.htm)を使用しようとしていますが、何らかの形で正しいオペランドを特定できません。私はこのLDSETインラインアセンブリとしてのARM命令

int value = 1024; //operate on this value 
int setBit = 7; //set the 7th bit 
int initValue = 0; //return the original value in this 
asm("ldset %w0, %w2, %x1" : "+r"(value), "=r"(initValue) : "r"(setBit)); 

を書いて、このエラーを得た :

test-lib.cpp:26:9: error: invalid operand for instruction 
    asm("ldset %w0, %w2, %x1" : "+r"(value), "=r"(initValue) : "r"(setBit)); 
    ^
<inline asm>:1:17: note: instantiated into assembly here 
     ldset w9, w10, x10 
        ^

はこの上でいくつかの助けをしてください必要があります。

答えて

1

page you linkedによれば、第3オペランドはメモリ参照でなければならず、オフセットなしでただ1つのレジスタを使用するオペランドでなければなりません。 Q constraint is for specifically this purposeので、試してみてください。

asm("ldset %w0, %w2, %1" : "+r"(value), "=Q"(initValue) : "r"(setBit)); 

これはldset w0, w1, [x2]のようなものを生成する必要があります。

関連する問題