我正在尝试使用 gcc 为 m68k 处理器实现上下文切换。我需要使用内联汇编来保存所有寄存器 d0、d1...d7 和 a0、...a7。我想知道是否可以在我的内联 gcc 中使用一个循环来保存这些寄存器,而不是为每个寄存器编写单独的代码行。
例如。
move.l %d0, temp pcb.cpuregs.d0 = temp
我想在 d0 内制作 0 ,就像循环计数器一样。
我正在尝试使用 gcc 为 m68k 处理器实现上下文切换。我需要使用内联汇编来保存所有寄存器 d0、d1...d7 和 a0、...a7。我想知道是否可以在我的内联 gcc 中使用一个循环来保存这些寄存器,而不是为每个寄存器编写单独的代码行。
例如。
move.l %d0, temp pcb.cpuregs.d0 = temp
我想在 d0 内制作 0 ,就像循环计数器一样。
干得好:
MOVEM.L D0-D7/A0-A7,-(A7) ;Save registers onto stack.
您不必使用堆栈,您可以使用其他地址。
我感觉预减量模式是强制性的,
但我现在无法测试,因为我没有 68k 机器。
ps 这可能不是 gcc 方言,因为当我编写该代码时 gcc 并不存在
,但我相信你可以弄清楚。
pps 为什么不用setjmp
内联汇编来代替呢?
那么您的上下文切换器将是半便携式的。
您可能需要考虑宏:
#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
您不能在块C
内使用 -style for 循环。asm
但是您可以使用您的 C 代码构建一个字符串并将其传递给asm
.