#assembly #x86-16 #masm
#сборка #x86-16 #masm
Вопрос:
У меня возникла проблема с пониманием этой части кода:
CSEG_B SEGMENT AT FF100h
ASSUME CS: CSEG_B, DS: DSEG
...
MOV WORD PTR ES:[8], OFFSET NMI_ISR
MOV WORD PTR ES:[10], SEG NMI_ISR
...
CSEG_B ENDS
CSEG_C SEGMENT 'CODE'
ASSUME CS: CSEG_C
NMI_ISR PROC FAR
...
NMI_ISR ENDP
CSEG_C ENDS
Я знаю, что инструкции MOV WORD PTR ES:[8], OFFSET NMI_ISR
и MOV WORD PTR ES:[10], SEG NMI_ISR
имеют какое-либо отношение к указанию на функцию NMI_ISR
в другом сегменте кода, чего я не понимаю, так это зачем использовать дополнительный сегмент для этого? Какова цель ES:[8]
и ES:[10]
.
Заранее спасибо!
Комментарии:
1. Вероятно
es
, загружается с нулевым базовым значением для доступа к таблице векторов прерываний. Два слова со смещением 8 в IVT (равным линейному адресу 00008h) являются смещением и сегментом обработчика NMI (прерывание 2).2. Спасибо Tnx за вашу помощь..
3.Да, часть кода, который вы вырезали и заменили на
...
wasMOV AX, DSEG
MOV DS, AX
MOV AX, 0
MOV ES, AX
DS, имеет значение DSEG, а ES имеет значение ноль для доступа к таблице векторов прерываний в базе памяти, начиная с 0x0000: 0x00004. Есть ли другой способ доступа или инициализации векторной таблицы?
5. Да, это так, и намного лучше: программное обеспечение DOS прерывает 0x21 с AH = 0x25: ctyme.com/intr/rb-2602.htm