작동하지 않습니다 interrupt_manager.asm에서 매크로 :NASM 매크로 내 커널의 IDT를 설정하기 위해 노력하고있어하지만이 연결 오류가있어 제대로
extern void interrupt_handler_1();
void setup_idt()
{
// Set the special idt_pointer
idt_pointer.limit = (sizeof(struct InterruptDescriptorTableEntry) * 256) - 1; // Subsract 1 because sizeof doesn't start from 0
idt_pointer.address = (uint32)&idt;
// Clear the whole idt to zeros
memset(&idt, 0, sizeof(struct InterruptDescriptorTableEntry) * 256);
for(unsigned int i = 0; i < 256; i++)
{
idt_set_gate(i, (uint32)&interrupt_handler_1, 0x8, 0x8E);
}
__asm__ __volatile__("lidt %0": :"m"(idt_pointer));
}
내가 잘못 만든 어떤했다 : 여기
%macro no_error_code_interrupt_handler 1
global interrupt_handler_%1
interrupt_handler_%1:
cli
push dword 0 ; push 0 as error code
push dword %1 ; push the interrupt number
jmp common_interrupt_handler ; jump to the common handler
%endmacro
는 setyup_idt 기능입니다 ?
추가 질문 : 매크로가/내가 핸들러를 인터럽트에 자동으로 GDT의 전 항목을 연결하는 또 다른 방법은, 내가 더 나은 자신을 설명하려고하자 :
는내가 뭘 원하는이 같은 것입니다 : interrupt_handler는 [I] 인터럽트 handler_을 것
for(unsigned int i = 0; i < 256; i++)
{
idt_set_gate(i, (uint32)&interrupt_handler_[i], 0x8, 0x8E);
}
는 [내가] 당신은 당신의 NASM 코드에서 매크로를 확장하는 데 필요한 NASM 매크로
링커에서 매크로를 볼 수 없습니다. 함수를 사용하십시오. –
매크로가 코드의 일부가 아니므로 매크로가 어셈블 된 실제 코드로 확장되도록 * 사용 *해야합니다. –
@Joachim Pileborg Okey, 추가 질문은 어떻습니까? –