встроенная сборка gcc для переключения контекста

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

для например.

move.l %d0, темп pcb.cpuregs.d0 = темп

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


person rsinha    schedule 27.06.2009    source источник


Ответы (3)


Ну вот:

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

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

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

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

person Rhythmic Fistman    schedule 27.06.2009
comment
Да, действительно, используйте setjmp. Если вы можете избежать ассемблерного кода, сделайте это. - person Max Lybbert; 02.07.2009
comment
Я делаю что-то подобное: устанавливаю указатели стека сопрограмм на их собственные отдельные пространства стека перед их вызовом, для чего одного setjmp недостаточно. Можно ли такой ассемблер поместить во встроенную функцию, которая может быть гарантированно встроена, или нужно использовать макрос, чтобы избежать функционального вызова (и связанных с этим мутаций в регистрах, которые мы хотим сохранить)? - person Alexander; 27.10.2017
comment
Зависит от вашего компилятора, но это звучит точно так же, как и встроенная сборка. - person Rhythmic Fistman; 31.10.2017

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

#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
person Adrian Panasiuk    schedule 27.06.2009

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

person eduffy    schedule 27.06.2009