1

アトミックインラインアセンブリコードを使用して、次のコードを模倣しようとしています。

struct Node{
    Node * next;
    int value;
}

typedef struct Node * Node_ptr;

Node_ptr store(Node_ptr ** L, Node_ptr * I){
    pthread_mutex_lock (&queue_mutex);
    Node_ptr tmp = **L; 
    **L = *I;
    pthread_mutex_unlock (&queue_mutex)
    return tmp;
}

これが私が試したことです:

Node_ptr tmp;
__asm volatile ("lock; movq %1, %%rax; movq %%rax, %0"
                    : "=r" (tmp)
                    : "r" (**L)
                    : "%rax"
                    );

__asm volatile ("lock; movq %1, %%rax; movq %%rax, %0"
                    : "=r" (**L)
                    : "r" (*I)
                    : "%rax"
                    );
return tmp;

しかし、「Illegal Instruction」エラーが発生し、どこが間違っているのかわかりません。誰かが問題が何であるかについていくつかの洞察を持っていますか?

ありがとう

編集:node_ptrの定義を追加

4

2 に答える 2

1

LOCKIntelのマニュアルには、プレフィックスのトピックについて次のように記載されています。

LOCKプレフィックスは、次の命令と、デスティネーションオペランドがメモリオペランドである命令の形式にのみ付加できます:ADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、 NOT、OR、SBB、SUB、XOR、XADD、およびXCHG。これらの命令のいずれかでLOCKプレフィックスが使用され、ソースオペランドがメモリオペランドである場合、未定義のオペコード例外(#UD)が生成される可能性があります。上記のリストにない命令でLOCKプレフィックスが使用された場合も、未定義のオペコード例外が生成されます。

ここで行う最善のことは(インテルから数千ページの厚さのマニュアルを読むことを除いて)、コンパイラーがc++コードに対してどのような出力を生成するかを調べることです。

于 2013-03-14T08:01:16.230 に答える
0

あなたが探しているのはCMPXCHG指示です。LOCK(プレフィックスは引き続き必要です。)

于 2013-03-14T08:50:20.973 に答える