встроенная сборка gcc для переключения контекста - PullRequest
4 голосов
/ 28 июня 2009

Я пытаюсь реализовать переключение контекста, используя gcc для процессоров m68k. Мне нужно использовать встроенную сборку для сохранения всех регистров d0, d1 ... d7 и a0, ... a7. Мне было интересно, смогу ли я использовать цикл в моем встроенном gcc, который позволил бы мне сохранить эти регистры вместо того, чтобы писать отдельную строку кода для каждого регистра.

например,

ход.% D0, темп pcb.cpuregs.d0 = temp

я хочу сделать 0 внутри d0 как счетчик циклов.

Ответы [ 3 ]

4 голосов
/ 28 июня 2009

Вот, пожалуйста:

MOVEM.L D0-D7/A0-A7,-(A7) ;Save registers onto stack.

Вам не нужно использовать стек, вы можете использовать другой адрес.
У меня такое ощущение, что режим предварительного декремента является обязательным,
но я не могу проверить это сейчас, так как у меня нет машины 68k.

p.s. это, вероятно, не диалект gcc, поскольку gcc не существует, когда
Я написал этот код, но я уверен, что вы можете понять это.

p.p.s, почему бы не использовать setjmp вместо встроенной сборки?
тогда ваш переключатель контекста будет полупереносимым.

2 голосов
/ 28 июня 2009

Вы можете рассмотреть макросы:

#define SAVE_REG_DXX(no)  __asm__ __volatile__("move.l %%d" #no ", %0" : "=g" (pcb.cpuregs.d ## no))

SAVE_REG_DXX(0);
SAVE_REG_DXX(1);
SAVE_REG_DXX(2);

#undef SAVE_REG_DXX
1 голос
/ 28 июня 2009

Нельзя использовать стиль C для цикла внутри блока asm. Но вы можете использовать ваш C-код для построения строки и передать ее asm.

...