用于上下文切换的gcc内联汇编

时间:2009-06-27 21:20:41

标签: c gcc assembly inline-assembly

我正在尝试使用gcc为m68k处理器实现上下文切换。我需要使用内联汇编来保存所有寄存器d0,d1 ... d7和a0,... a7。我想知道我是否可以在我的内联gcc中使用一个循环来允许我保存这些寄存器,而不是为每个寄存器写一个单独的代码行。

例如。

move.l%d0,temp pcb.cpuregs.d0 = temp

我想在d0中使0像循环计数器一样。

3 个答案:

答案 0 :(得分:4)

你走了:

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

您不必使用堆栈,您可以使用其他地址 我觉得预减量模式是强制性的,
但我现在无法测试,因为我没有68k机器。

P.S。这可能不是gcc方言,因为当时gcc不存在 我写了那段代码,但我相信你可以搞清楚。

p.p.s为什么不使用setjmp而不是内联汇编? 然后您的上下文切换器将是半便携式的。

答案 1 :(得分:2)

您可能需要考虑宏:

#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

答案 2 :(得分:1)

您不能在C块内使用asm - 样式循环。但是您可以使用C代码构建字符串并将其传递给asm