2017-09-25 2 views
0

페이지 디렉토리를 가리키는 데 사용되는 CR3 레지스터와 같습니다. 리눅스는 또한 페이징을 사용하고 C로 작성되지만 C에서 이러한 레지스터를 사용하는 방법 (C를 사용하여 특정 레지스터를 선택하는 방법)은 무엇입니까?C에서 레지스터는 어떻게 사용됩니까?

+3

레지스터를 직접 사용하려면 어셈블리 언어로 코딩해야합니다. –

+0

어떻게 매크로를 초기화합니까? (나는 일부 매크로를 읽고 레지스터를 읽었다는 뜻입니다.) 그리고 리눅스에서 페이징 소스 코드에서 어셈블리 언어를 보지 못했습니다. 이 코드는 어떻게 작동합니까? –

+3

당신은 실제로 무엇을 성취하려고합니다. 일반적으로 C에서 CPU 레지스터를 사용할 필요가 없습니다. C 언어 C는 레지스터 액세스 방법을 지정하지 않습니다. 그러나 많은 컴파일러에는 직접 CPU 레지스터를 지정할 수있는 확장 기능이 있습니다. –

답변

5

C 언어는 특정 프로세서 레지스터에 액세스 할 수있는 방법이 없습니다. 이것은 모두 컴파일러에 달려 있습니다.

특정 레지스터에 액세스하려면 코드의이 부분을 어셈블러에 작성해야합니다.

+0

당신의 대답이 질문에 대답하지 않는다는 것을 의미합니다, 당신은 논평으로 그것을 게시해야합니다. –

+3

@MichaelWalz -하지만 질문에 답합니다. OP는 순수 C의 범위에서 질문했습니다. 순수 C는 허용하지 않습니다. 그러므로 이것이 답입니다. 짧으면 그것이 그로 인해 해를 입히지 않습니다. – StoryTeller

+0

@StoryTeller 예, 아마도 제 의견을 삭제하겠습니다. –

4

당신이 말하는 레지스터는 언어의 속성이 아니라 프로그램을 실행하는 하드웨어의 속성입니다. 나는 당신이 x86 타입의 하드웨어에 대해 이야기하고 있다고 믿는다. cr0-4 및 orther 특정 regs는 운영 체제의 속성이며 페이징 테이블을 포함하여 운영 체제에 의해 관리됩니다.

그래서이 언어는 hw 특정 레지스터에 액세스하는 방법을 제공하지 않습니다. 유일한 방법은 어셈블리 코드 (하드웨어 관련)를 작성하여 조작하는 것입니다. 언어가 제공하는 유일한 것은 프로그램에 어셈블리 코드를 삽입 할 수있는 asm() 연산자입니다.

+1

'__asm__ '특정 구현에 의해 제공되는 * 확장자입니다. 표준 C 언어 정의의 일부가 아닙니다. –

+0

@ 존행 오른쪽, 표준 하나는'asm()'입니다. 나는 그것을 고쳤다. – Serge

+2

'asm'은 일반적인 확장자로 J.5.10에 나열되어 있지만 핵심 언어 또는 라이브러리의 일부는 아닙니다. J.5/1에서 말한 것처럼 "다음 확장은 많은 시스템에서 널리 사용되지만 모든 구현에는 이식 할 수 없습니다." –

3

표준 C는 프로세서 레지스터에 직접 액세스하는 기능을 제공하지 않습니다. 일부 구현 은 gcc가 제공 한 asm 확장과 같이 C 코드에 어셈블리 코드를 임베드 할 수있는 확장을 제공합니다.

일반적으로 프로세서 레지스터 (또는 다른 하드웨어 관련 위치)에 직접 액세스해야하는 경우 해당 루틴을 어셈블러에 기록하고이를 더 큰 프로그램에 연결하십시오.

관련 문제