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
4

1 に答える 1

1

考えるべき2つのこと:

  1. idtどんなタイプですか?(回答:これは、へのポインタidt_entry、または厳密にはアドレスの名前ですidt[0]。)

  2. asmファイル内のポインタへの外部参照をどのように宣言しますか?

これらすべてを取得する最も簡単な方法は、適切なフラグを使用してCコードをコンパイルし(少なくともgccでは-Sだと思います)、生成されたアセンブリコードを確認することです。

循環参照はありません。リンカに、という名前のCコードで定義されたメモリを参照することを認識させる必要がありますidt

于 2011-11-27T04:00:35.353 に答える