Я пытаюсь определить постоянную запись IDT (Interrupt Descriptor Table) в NASM, и для этого мне нужно испустить в таблицу данных высокое слово двойного слова адрес , который не разрешен до момента ссылки. Есть ли способ сделать это?NASM: emit MSW значения нескалярного (link-time)
Вот обработчик прерываний:
;;; Interrupt 3 (breakpoint) handler. For now, just poke the screen and halt.
align 8
int3:
mov [0xb8000],dword '* * '
hlt
А вот запись IDT, который ссылается на это. Наиболее незначимые и наименее значимые слова о необходимости смещения должны храниться отдельно и не смежно:
;; Interrupt 3 - breakpoint
dw int3 ; offset (low) <---- WORKS
dw codesel ; code selector
db 0 ; unused
db 0b10001111 ; present, ring 0, 32-bit trap gate
dw int3 >> 16 ; offset (high) <---- ASSEMBLY ERROR
NASM правильно вызывает ЛД испускать младшее слово адреса Int3, но старшее слово терпит неудачу при сборке с эта ошибка:
pgm.asm:240: error: shift operator may only be applied to scalar values
NASM не будет использовать математику со значением, которое не определено до момента соединения. Я понимаю, но мне нужен способ обойти это. Я мог бы:
- найти Int3 абсолютно
- Построить IDT во время выполнения вместо времени сборки
Я, вероятно, в конечном итоге строить IDT во время выполнения, но было бы хорошо знать если есть способ заставить ассемблер/линкер испускать в таблицу данных высокое слово адреса, которое не разрешено до времени ссылки.
Частности:
- NASM 2.20.01
- выходной формат NASM "Aout"
- Ld версии 2.22
- 32-битный режим (NASM "биты 32", выданные директивы)
См. Также: http: // stackoverflow.com/questions/12861843/static-defined-idt? rq = 1. Строго говоря, этот вопрос является дубликатом этого вопроса - это та же проблема, с той же причиной (ld + swizzled IDT), но с разными языками. –