(這是我第一次在這裏提出問題,英文不是我的第一語言,所以請原諒我的一些錯誤。 )如何使用內聯彙編程序保存寄存器值
我在做我的操作系統作業時遇到了這個問題,我們被要求模擬函數SwitchToFiber,而我目前的問題是我不知道如何保存寄存器值以便下次恢復函數被稱爲。
我不知道我的問題是否清楚。雖然我不認爲我的代碼有用,但我會把它們放在下面。
#include <stdio.h>
#define INVALID_THD NULL
#define N 5
#define REG_NUM 32
unsigned store[N][REG_NUM];
typedef struct
{
void (*address) (void * arg);
void* argu;
}thread_s;
thread_s ts[N];
void StartThds();
void YieldThd();
void *CreateThd(void (*ThdFunc)(void*), void * arg);
void thd1(void * arg);
void thd2(void * arg);
void StartThds()
{
}
void YieldThd()
{
thd2((void*)2);
}
void *CreateThd(void (*ThdFunc)(void*), void * arg)
{
ts[(int)arg].address = (*ThdFunc);
ts[(int)arg].argu = arg;
}
void thd2(void * arg)
{
for (int i = 4; i < 12; i++)
{
printf("\tthd2: arg=%d , i = %d\n", (int)arg, i);
//in order to see clearly,i added /t abouve
YieldThd();
}
}
void thd1(void * arg)
{
/*
__asm__(
);
*/
for (int i = 0; i < 12; i++)
{
printf("thd1: arg=%d , i = %d\n", (int)arg, i);
YieldThd();
}
}
int main()
{
//this is my first plan, to store the register value in some static arry
for(int i = 0; i<N; i++)
for(int j = 0; j<REG_NUM; j++)
store[i][j] = 0;
//create the two thread
if (CreateThd(thd1, (void *)1) == INVALID_THD)
{
printf("cannot create\n");
}
if (CreateThd(thd2, (void *)2) == INVALID_THD)
{
printf("cannot create\n");
}
ts[1].address(ts[1].argu); //thd1((void*)1),argu = 1;
// StartThds();
return 0;
}
這是我現在的整個代碼,因爲我不知道哪個部分可能有用,所以我把它們放在上面。正如你所看到的,他們中的大多數仍然是空的。
我們在談論什麼CPU?你的彙編代碼在哪裏?順便說一句,這看起來很像實現C的'setjmp()'/'longjmp()'(提示)。 –
好吧,我的CPU似乎是Pentium4,而我正在使用C-FREE編譯。我甚至不知道如何開始我的彙編代碼,所以沒有任何東西。 – shellbye
那麼學習一些程序集並返回具體問題怎麼樣? –