Необходимо получить адрес irq 6 (Контроллер накопителя на гибких магнитных дисках)..попробовал через 21 прерывание ( ah=35 , al=38), однако,если верить отладчику,после выполнения этого прерывания содержимое es:bx ни изменяется(хотя должно). Программу запускал в реальном режиме (не в эмуляторе), в чем же проблема?
Почему 35? когда 35h. И IRQ6 расположен по номеру вектора 8+6=Eh а у тебя 38? А флаги меняются? Обычно если есть ошибка то флаг CF поднимается.
Поподробнее пожал-ста Отписался неправильно, я имел ввиду 16-ную сс Поподробнее пожал-та не вкурил, что за формула?
IVT - Interrupt Vector Table таблица векторов прерываний. В реальном режиме процессора расположенно по 0 физическому адрессу. Каждый вектор это 4 байта. Структура такая смещение сегмент. К примеру нам надо считать вектор eh Код (Text): mov al, 0eh; GetVector: push ax xor bx,bx push bx pop es mov bl,al mov ax,es:[bx*4] mov es,es:[bx*4+2] mov bx,ax pop ax Есть два контроллера PIC соединенных каскадно. Так вот номер IRQ преобразуется в номер вектора int по следующей схеме. в контроллере pic записанна база она складывается с номером входа и получается номер вектора перывания. У ведущеко PIC база 08h у ведомого 70h Поэтому IRQ 6 будет иметь номер вектора прерывания равного 8+6=0Eh int 0Eh. Адресс прерывания можно узнать считав с адресса 0Eh*4=38h
Pavia Ну то что IDT расположена по 0 адресу в реальном режиме - правда отчасти. При желании она может болтаться в пределах 1 мегабайта памяти. По хорошему сначала надо получить её адрес и размер SIDT, а затем проводить манипуляции.
Pavia К примеру нам надо считать вектор eh - 1. в вашем коде не хватает пары команд - cli & sti в нужных местах 2. можно еще и так - mov ax,350Eh; int 21h;