4

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

例如。

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

我想在 d0 内制作 0 ,就像循环计数器一样。

4

3 回答 3

4

干得好:

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

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

ps 这可能不是 gcc 方言,因为当我编写该代码时 gcc 并不存在
,但我相信你可以弄清楚。

pps 为什么不用setjmp内联汇编来代替呢?
那么您的上下文切换器将是半便携式的。

于 2009-06-27T22:33:57.560 回答
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
于 2009-06-27T22:29:08.723 回答
1

您不能在块C内使用 -style for 循环。asm但是您可以使用您的 C 代码构建一个字符串并将其传递给asm.

于 2009-06-27T21:29:48.937 回答