2014-06-10 3 views
0

Windows에서 Linux로 프로젝트를 이식하려고합니다. 코드를 다음의 repo에 호스팅합니다 : Nspire Emu. 일부 컴파일 오류를 해결할 수 있었지만 많은 기능을 다시 구현해야하며 이해할 수없는 부분이 있습니다.인라인 어셈블리 설명

frame 변수 유형 정의 : 인라인의

typedef struct { void *prev, *function; } os_exception_frame_t; 

조각은 이해가 안 조립 : 누군가가 나를 앞의 코드를 이해하는 데 도움한다면

asm ("movl %%fs:(%1), %0" : "=r" (frame->prev) : "r" (0)); 

asm ("movl %0, %%fs:(%1)" : : "r" (frame), "r" (0)); 

난 정말 감사하겠습니다. 미리 감사드립니다.

+0

gcc와 visual c 컴파일러의 인라인 어셈블리 구문이 다릅니다. 필자는 컴파일러의 문서에서 시작하여 올바르게 작동하며 대상으로하는 컴파일러에서 요구하는 형식으로 변환합니다. – Jay

+1

힌트를 보내 주셔서 감사합니다. 이것은 mingw gcc를 사용하여 Linux에서 컴파일되었으므로 Windows와 Linux 모두에서 코드를 컴파일 할 수 있습니다. 그게 문제가 아니에요. 문제는 그 코드의 실제 의미입니다. 나는 최근에 fs : 0이 SEH가 Windows에서 일어나는 곳이며, 이제 코드가 무엇인지 알고있다. http://feepingcreature.github.io/handling.html을 참조하십시오. 시간과 인내심에 감사 드리며 제 질문에 답변 해 주셔서 감사합니다. PD : 평판 때문에 대답 할 수 없습니다. –

답변

1

이 인라인 asm은 구조적 예외 처리기 스택에서 Windows 예외 처리기 프레임을 팝합니다. Linux는 구조화 된 예외 처리기를 사용하지 않으므로이 코드는 Linux에서 제거해야하며 동일한 작업을 수행하는 완전히 다른 무언가로 대체해야합니다. 그것이 무엇인지는 코드가 SEH 스택을 조작하여 얻으려고하는 것에 달려 있습니다. 리눅스에서는 시그널 핸들러를 등록하는 것과 비슷합니다.

+0

고맙습니다. 나는 이것에 관해 읽는 것을 시작했다. http://feepingcreature.github.io/handling.html –