2011-11-27 27 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),並查看生成的彙編代碼。

您沒有任何循環引用,您只需使鏈接器知道您想引用在名爲idt的C代碼中定義的內存。