Код процедуры прерывания

Тема в разделе "WASM.BEGINNERS", создана пользователем ToJIka4, 23 июн 2011.

  1. ToJIka4

    ToJIka4 New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2011
    Сообщения:
    2
    Решил посмотреть код процедуры прерывания 10h. Составил программу для выдачи таблицы векторов прерываний. Решил узнать, что лежит по одному из таких адресов этой таблицы. Но программа не берёт данные из другого сегмента, берёт только из нулевого.
    Как получить байты из другого сегмента? И как получить код процедуры прерывания?
    Запускаю программу через Virtual Box.


    Код (Text):
    1. [BITS 16]
    2. [ORG 0x7c00]
    3. _start:
    4.     cli
    5.     mov ax, cs
    6.     mov ds, ax
    7.     mov ss, ax
    8.     mov sp, _start  
    9.    
    10.     mov ebx, 0x0 ; если ebx = 0 я получаю таблицу прерываний, если 0xF000FF53, показывает 0000:FF53
    11.     mov cx, 8*24 ; количество двойных слов на выдачу
    12.    
    13. _main_loop:
    14.  
    15.     mov eax, [ebx]
    16.     call _proc
    17.     add ebx, 4
    18.     xor eax, eax
    19.     loop _main_loop
    20.  
    21.     hlt
    22.     jmp $
    23.    
    24. _proc:              ; процедура выводит на экран
    25.     push cx         ; HEX представление регистра EAX
    26.     mov cx, 8
    27.     mov edx, eax
    28. _loop_proc:
    29.     rol edx, 4
    30.    
    31.     mov ax, dx
    32.     and ax, 0fh
    33.  
    34.     cmp ax, 10
    35.     jae _A__F
    36.     add ax, 48
    37.     jmp _proc_res_wr
    38. _A__F: 
    39.     add ax, 55
    40. _proc_res_wr:
    41.     call _write
    42.     loop _loop_proc
    43.    
    44.     mov al, 32
    45.     int 0x10
    46.     mov al, 32
    47.     int 0x10
    48.     pop cx
    49.     ret
    50.        
    51. _write:             ; процедура печати символа
    52.     mov ah, 0x0E
    53.     mov bh, 0x00
    54.     int 0x10
    55.     ret
    56.      
    57.     times 510-($-$$) db 0
    58.     db 0xaa, 0x55
     
  2. dinoweb

    dinoweb Дмитрий

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    129
    Адрес:
    Россия. Красноярск
    Код (Text):
    1.     mov ebx, 0x0 ; если ebx = 0 я получаю таблицу прерываний, если 0xF000FF53, показывает 0000:FF53
    2.     mov cx, 8*24 ; количество двойных слов на выдачу
    3.    
    4. _main_loop:
    5.  
    6.     mov eax, [ebx]
    7.     call _proc
    8.     add bx, 4
    9.     xor eax, eax
    10.     loop _main_loop
    11.  
    12.     hlt
    13.     jmp $
    0xF000FF53 - Это вообще что? Линейный адрес? Или всё-таки сегмент:смещение
    Чтение по линейным адресам будет работать только в нереальном режиме, когда лимит сегмента больше 0xFFFF.
    Адрес F000:FF53 в реальном режиме соответствует линейному адресу 0x000FFF53 (segment << 4 + offset)

    Делайте, например, так:
    Код (Text):
    1.     push 0xF000
    2.     pop es
    3.     mov bx, 0xFF53 ;
    4.     mov cx, 8*24 ;
    5.    
    6. _main_loop:
    7.  
    8.     mov eax, [es:bx]
    9.     call _proc
    10.     add bx, 4
    11.     xor eax, eax
    12.     loop _main_loop
    13.  
    14.     hlt
    15.     jmp $
    Есть ещё такая инструкция - les, можете использовать её (загружает сегмент в es, и смещение куда попросишь):
    Код (Text):
    1. var dd 0xF000FF53
    2. les bx, [var]
    Дизассемблировать
     
  3. ToJIka4

    ToJIka4 New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2011
    Сообщения:
    2
    Благодарю! Теперь всё работает!
     
  4. shm

    shm New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2010
    Сообщения:
    93
    А чего ты интересного хочешь из Virtual Box получить? У него открытый исходный код и обработчик прерывания можно посмотреть "не напрягаясь". Намного интересней дизассемблировать код обработчика прерывания на реальном железе, хотя с другой стороны и тут нужное можно найти в открытом драйвере Linux.