Доступ к массиву с помощью встроенной сборки с использованием синтаксиса AT&T

Я хочу назначить массив, используя встроенную сборку, используя синтаксис AT&T. Я хочу добиться чего-то вроде следующего. Обратите внимание, что rsp здесь — регистр %rsp.

long saved_sp[N];
long new_sp[N];

void some_function( unsigned int tid, ... )
{
 // These two lines should be in assembly
 saved_sp[tid] = rsp; 
 rsp = new_sp[tid];   
 ......
}

person MetallicPriest    schedule 25.11.2011    source источник


Ответы (1)


Я уверен, что мне не нужно предупреждать вас...

__asm__ __volatile__ (

    "movq %%rsp, (%0, %2, 8)\n\t"
    "movq (%1, %2, 8), %%rsp\n\t"

    : : "r" (saved_sp), "r" (new_sp), "r" ((long) tid));

Возможно, следует добавить «память» в качестве затирания, но это кажется излишним. Куда бы вы ни пошли после этого, помните, что указатель фрейма "%rbp" будет недействителен.

person Brett Hale    schedule 25.11.2011
comment
О, хорошо, я понял, что вы пытаетесь сделать :)! - person MetallicPriest; 25.11.2011