[英]Circular References and Low Level Assembly
我有一个名为idt.c
的文件,在这个文件中,我需要从程序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
需要考虑的两件事:
idt
是什么类型? (回答:这是指向idt_entry
的指针,或者严格来说,它是地址idt[0]
的名称。)
您将如何在asm文件中声明对指针的外部引用?
获得所有这些东西的最简单方法是使用适当的标志(至少在我认为是-S的gcc中)编译C代码,并查看生成的汇编代码。
您没有任何循环引用,只需要使链接器知道您要引用名为idt
的C代码中定义的内存即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.