【问题标题】:Circular References and Low Level Assembly循环参考和低级组装
【发布时间】:2023-03-05 05:47:01
【问题描述】:

我有一个名为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

【问题讨论】:

  • 只是为了好玩,您为什么不向我们展示解决方案?

标签: c assembly operating-system osdev


【解决方案1】:

需要考虑的两件事:

  1. idt 是什么类型的? (Ans:它是指向idt_entry 的指针,或者严格来说是地址的名称idt[0]。)

  2. 如何在 asm 文件中声明对指针的外部引用?

获得所有这些东西的最简单方法是使用适当的标志编译 C 代码(至少在 gcc 中我认为它是 -S)并查看生成的汇编代码。

您没有任何循环引用,您只需让链接器知道您要引用名为idt 的C 代码中定义的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 2013-06-27
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多