2014-08-10 2 views
0

Мне нужно получить кодировку команд для атомного приращения длинной переменной. Я думал написать некоторую встроенную сборку gcc и использовать вывод gdb дизассемблированный, чтобы получить ответ. Вот что я сделал.Инструкция кодирования для атомного приращения длинной переменной

#include <stdint.h> 

int lock_inc(uint64_t *value) { 

    __asm__ __volatile__ 
    (
    "lock inc %0;\n" 
    : 
    : "r"(value) 
    : "memory" 
); 
} 

uint64_t value = 0; 

int main() { 

    lock_inc(&value); 

} 

Но когда я пытаюсь скомпилировать его, я получаю следующее сообщение об ошибке.

lockinc.c: Assembler messages: lockinc.c:5: Error: expecting lockable instruction after `lock'

Что я делаю неправильно? Кстати, если кто-то знает прямой ответ (кодирование), который тоже будет отличным. (Я имел в виду некоторые сайты для получения его напрямую, но не был уверен в ответе. Felt позволяет gcc делать это было бы проще.)

+0

Что вы укажете в инструкции? Я не предполагаю, что вы будете проводить такую ​​работу, не открывая и не открывая руководство для консультаций в любое время. –

+0

Звуковое предложение. :). Думаю, я пытался найти легкий выход. – chamibuddhika

+0

Вопрос «как это сделать», который не требует asm: stackoverflow.com/questions/2353371/how-to-do-an-atomic-increment-and-fetch-in-c –

ответ

1

Вы не можете использовать блокировку для регистров. Вы должны использовать «m» для ограничения, а не «r». Кроме того, поскольку вы оба читаете и записываете, «значение» должно быть результатом, помеченным знаком «+». И почему бы просто не использовать __sync_add_and_fetch?

+0

Получил это от ваших предложений. Благодарю. Я не могу использовать __sync_add_and_fetch, потому что этот код необходимо сгенерировать во время выполнения, а затем выполнить. Кстати, ответ «f0 48 ff 05 0a 04 20 00», который переводится как «lock incq 0x20040a (% rip)» в моем случае, когда f0 является префиксом LOCK, 48 является префиксом REX, а ff - кодом операции для incq. – chamibuddhika

+0

@chamibuddhika Вложение магических констант типа '0x20040a' в примеры/ответы кода - это очень редко фактический (правильный) ответ. В частности, если вы говорите о _генерированном коде_. В зависимости от того, где в памяти живет блок кода, эта «магия» изменится. Лучше всего, что джинн вернулся в бутылку ;-) –

+0

True :). Но мое требование состояло в том, чтобы получить кодировку самой инструкции с блокировкой и требуемыми префиксами, игнорируя часть «0x20040a», которая является только частью операнда инструкции, которая все равно изменится. – chamibuddhika

Смежные вопросы