2011-11-27 4 views
0

idt.c이라는 파일이 있는데이 파일에서 어셈블리에서 idt_load 함수를 호출해야합니다. 자, 어셈블리 파일에서 변수 idtp에 액세스해야하고 변수가 idt.c에 선언되어 있다는 것을 제외하고는이 작업이 정상적으로 작동합니다.순환 참조 및 저수준 어셈블리

링커에서 idt_load가 정의되지 않았거나 idtp가 정의되지 않았습니다. 어떻게 작동시킬 수 있습니까? idt.c의

관련 부품

struct idt_entry 
{ 
    unsigned short base_lo; 
    unsigned short sel; 
    unsigned char always0; 
    unsigned char flags; 
    unsigned short base_hi; 
} __attribute__((packed)); 

struct idt_ptr 
{ 
    unsigned short limit; 
    unsigned int base; 
} __attribute__((packed)); 


struct idt_entry idt[256]; 
struct idt_ptr idtp; 

extern void idt_load(); 

//Later in the code... 
idt_load(); 

idt.asm 밖으로 생각하는

global idt_load 
extern idtp 
idt_load: 
    lidt [idtp] 
    ret 
+0

재미있게 그냥 해결책을 제시해주세요. –

답변

1

두 가지 :

  1. idt는 어떤 유형입니까? (ANS : 그것은 idt_entry에 대한 포인터, 또는 엄격하게이 주소 idt[0]의 이름입니다.)

  2. 당신은 ASM 파일의 포인터에 대한 외부 참조를 선언 할 방법

    ?

이 모든 물건을 얻을 수있는 가장 쉬운 방법은 적절한 플래그와 함께 C 코드를 컴파일하는 것입니다 (적어도 GCC에서 나는 -S의 생각 ) 및 생성 된 어셈블리 코드를 참조하십시오.

순환 참조가 없으므로 C 코드에 정의 된 idt에 정의 된 메모리를 참조하고 있음을 링커에 알리면됩니다.