我正在尝试使用gcc为m68k处理器实现上下文切换。我需要使用内联汇编来保存所有寄存器d0,d1 ... d7和a0,... a7。我想知道我是否可以在我的内联gcc中使用一个循环来允许我保存这些寄存器,而不是为每个寄存器写一个单独的代码行。
例如。
move.l%d0,temp pcb.cpuregs.d0 = temp
我想在d0中使0像循环计数器一样。
答案 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
。