OSDev http://osdev.su/ |
|
fasm: статическая инициализация IDT http://osdev.su/viewtopic.php?f=6&t=1028 |
Страница 1 из 1 |
Автор: | Эдуард [ 13 дек 2014, 13:51 ] |
Заголовок сообщения: | fasm: статическая инициализация IDT |
Необходимо статически инициализировать IDT пример кода: Код: struc descINT p,s,a { .off_l dw LOWORD p .sel dw s db 0 .attr1 db a .off_h dw HIWORD p } idt_table: ... idt_32 descINT _timer_int,0x8,10001110b ... _timer_int: ... есть ли в фасме что-то наподобие LOWORD, HIWORD ?? |
Автор: | phantom-84 [ 13 дек 2014, 19:13 ] |
Заголовок сообщения: | Re: fasm: статическая инициализация IDT |
А логическими операторами слабо воспользоваться? Код: DF_INT32 equ 1110b
DF_PRESENT equ 80h macro desc p1, p2, p3 { dw (p2) and 0FFFFh dw (p1) and 0FFFFh db (p1) shr 16 and 0FFh db (p3) and 0FFh or DF_PRESENT db ((p2) or (p3)) shr 16 and 0FFh db ((p1) or (p2)) shr 24 } desc 8,_timer_int,DF_INT32 |
Автор: | Эдуард [ 14 дек 2014, 12:52 ] |
Заголовок сообщения: | Re: fasm: статическая инициализация IDT |
"invalid use of symbol" выдает на Код: dw _timer_int and 0FFFFh _timer_int является 32р адресом, если заменить dw на dd то норм, но дескриптор имеет другую структуру, вот мне и надо вытащить отдельно старшее и младшее слова.... |
Автор: | Bargest [ 14 дек 2014, 14:04 ] |
Заголовок сообщения: | Re: fasm: статическая инициализация IDT |
Вы что-то делаете не так. И с макросом так же компилируется: Код: use32 org 1234567 struc descINT p,s,a { .off_l dw p and 0FFFFh .sel dw s db 0 .attr1 db a .off_h dw p shr 16 } idt_table: idt_32 descINT _timer_int,0x8,10001110b _timer_int: LOWORD/HIWORD есть по сути те же макросы на логических операторах, и никакой магии, которая заставит все работать, в них нет. Если не работает на логических операторах, не сработает и с этими макросами, если их сделать. А что конкретно не работает по одной строке кода сказать невозможно. |
Автор: | phantom-84 [ 14 дек 2014, 16:27 ] |
Заголовок сообщения: | Re: fasm: статическая инициализация IDT |
fasm должен знать значение _timer_int. Bargest для этого разместил выше директиву org. Даже если выходной файл поддерживает дробление релоков, навряд ли вам какой-нибудь компилятор позволит сделать такое с неизвестным адресом. Не можете вычислить адрес статически, вычисляйте его динамически на этапе выполнения. |
Автор: | Эдуард [ 14 дек 2014, 17:32 ] |
Заголовок сообщения: | Re: fasm: статическая инициализация IDT |
похоже разобрался, адрес известен будет лишь на этапе линковки, а из-за "format MS COFF " fasm выдает ошибку (( |
Автор: | phantom-84 [ 14 дек 2014, 20:03 ] |
Заголовок сообщения: | Re: fasm: статическая инициализация IDT |
По идее org можно использовать и внутри секций файлов опред. формата. Главное, на этапе выполнения обеспечить совпадение адресов. Например, если известен базовый адрес загрузки, разместите _timer_int в специальной секции и дайте инструкцию компоновщику разместить эту секцию в файле первой по счету. |
Автор: | kailot2 [ 07 май 2015, 19:59 ] |
Заголовок сообщения: | Re: fasm: статическая инициализация IDT |
Если еще актуально Код: format ELF include 'macro/proc32.inc' ;/ Определения стандартных вызовов section '.text' executable org 0x400000 ;Базовый адрес секции ...КОД... ;Описание структуры дескриптора STRUC IDT_Unit offs,sel,type { .offs_l dw offs and 0xFFFF ;0 .sel dw sel ;2 .cntr db 0 ;4 .dtype db type ;5 .offs_h dw ((offs shr 16) and 0xFFFF) ;6 } ;Собственно сама IDT. Можно расположить в любой секции IDT: _int0 IDT_Unit EXCEPTION.INT_0,8,0x8F _int1 IDT_Unit EXCEPTION.INT_1,8,0x8F _int2 IDT_Unit EXCEPTION.INT_2,8,0x8F _int3 IDT_Unit EXCEPTION.INT_3,8,0x8F Надеюсь помог чем нибудь |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |