irq 6

Тема в разделе "WASM.ASSEMBLER", создана пользователем smileman, 21 май 2009.

  1. smileman

    smileman New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2009
    Сообщения:
    11
    Необходимо получить адрес irq 6 (Контроллер накопителя на гибких магнитных дисках)..попробовал через 21 прерывание ( ah=35 , al=38), однако,если верить отладчику,после выполнения этого прерывания содержимое es:bx ни изменяется(хотя должно). Программу запускал в реальном режиме (не в эмуляторе), в чем же проблема?
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Почему 35? когда 35h. И IRQ6 расположен по номеру вектора 8+6=Eh а у тебя 38?
    А флаги меняются? Обычно если есть ошибка то флаг CF поднимается.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Прочитай напрямую IVT
     
  4. smileman

    smileman New Member

    Публикаций:
    0
    Регистрация:
    16 фев 2009
    Сообщения:
    11
    Поподробнее пожал-ста :)
    Отписался неправильно, я имел ввиду 16-ную сс
    Поподробнее пожал-та :) не вкурил, что за формула?
     
  5. DEADHUNT

    DEADHUNT New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2009
    Сообщения:
    34
    первые 8 аппаратных прерываний в режиме реальной адресации начинаются с 8 вектора.
     
  6. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    IVT - Interrupt Vector Table таблица векторов прерываний. В реальном режиме процессора расположенно по 0 физическому адрессу. Каждый вектор это 4 байта. Структура такая смещение сегмент.

    К примеру нам надо считать вектор eh

    Код (Text):
    1. mov al, 0eh;
    2. GetVector:
    3. push ax
    4. xor bx,bx
    5. push bx
    6. pop es
    7. mov bl,al
    8. mov ax,es:[bx*4]
    9. mov es,es:[bx*4+2]
    10. mov bx,ax
    11. pop ax
    Есть два контроллера PIC соединенных каскадно.
    Так вот номер IRQ преобразуется в номер вектора int по следующей схеме.
    в контроллере pic записанна база она складывается с номером входа и получается номер вектора перывания.
    У ведущеко PIC база 08h у ведомого 70h
    Поэтому IRQ 6 будет иметь номер вектора прерывания равного 8+6=0Eh int 0Eh.

    Адресс прерывания можно узнать считав с адресса 0Eh*4=38h
     
  7. MirrorBlack

    MirrorBlack Алексей

    Публикаций:
    0
    Регистрация:
    21 июн 2008
    Сообщения:
    249
    Адрес:
    Moscow
    Pavia
    Ну то что IDT расположена по 0 адресу в реальном режиме - правда отчасти. При желании она может болтаться в пределах 1 мегабайта памяти.
    По хорошему сначала надо получить её адрес и размер SIDT, а затем проводить манипуляции.
     
  8. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    Pavia
    К примеру нам надо считать вектор eh -
    1. в вашем коде не хватает пары команд - cli & sti в нужных местах
    2. можно еще и так - mov ax,350Eh; int 21h;