OSDev
http://osdev.ru/

fasm: статическая инициализация IDT
http://osdev.ru/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/