(글쎄, 여기 처음 질문 할 때 영어가 제 첫 번째 언어가 아니므로 제 실수를 용서하십시오.) 그리고 나는 프로그램에서 친환경적입니다 .)인라인 어셈블러를 사용하여 레지스터 값을 저장하는 방법
OS 숙제를하면서이 문제를 만났습니다. 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에 대해 이야기하고 있습니까? 그리고 어셈블리 코드는 어디에 있습니까? Btw, 이것은 C의'setjmp()'/'longjmp()'(힌트) 구현과 매우 흡사합니다. –
글쎄, 내 CPU는 Pentium4 인 것 같다. 그리고 나는 C-FREE 컴파일을 사용하고있다. 내 어셈블리 코드를 시작하는 방법조차 모른다. 그래서 아무 것도 없다. – shellbye
그런 다음 몇 가지 어셈블리를 배우고 특정 질문으로 돌아 오는 방법은 무엇입니까? –