Решил посмотреть код процедуры прерывания 10h. Составил программу для выдачи таблицы векторов прерываний. Решил узнать, что лежит по одному из таких адресов этой таблицы. Но программа не берёт данные из другого сегмента, берёт только из нулевого. Как получить байты из другого сегмента? И как получить код процедуры прерывания? Запускаю программу через Virtual Box. Код (Text): [BITS 16] [ORG 0x7c00] _start: cli mov ax, cs mov ds, ax mov ss, ax mov sp, _start mov ebx, 0x0 ; если ebx = 0 я получаю таблицу прерываний, если 0xF000FF53, показывает 0000:FF53 mov cx, 8*24 ; количество двойных слов на выдачу _main_loop: mov eax, [ebx] call _proc add ebx, 4 xor eax, eax loop _main_loop hlt jmp $ _proc: ; процедура выводит на экран push cx ; HEX представление регистра EAX mov cx, 8 mov edx, eax _loop_proc: rol edx, 4 mov ax, dx and ax, 0fh cmp ax, 10 jae _A__F add ax, 48 jmp _proc_res_wr _A__F: add ax, 55 _proc_res_wr: call _write loop _loop_proc mov al, 32 int 0x10 mov al, 32 int 0x10 pop cx ret _write: ; процедура печати символа mov ah, 0x0E mov bh, 0x00 int 0x10 ret times 510-($-$$) db 0 db 0xaa, 0x55
Код (Text): mov ebx, 0x0 ; если ebx = 0 я получаю таблицу прерываний, если 0xF000FF53, показывает 0000:FF53 mov cx, 8*24 ; количество двойных слов на выдачу _main_loop: mov eax, [ebx] call _proc add bx, 4 xor eax, eax loop _main_loop hlt jmp $ 0xF000FF53 - Это вообще что? Линейный адрес? Или всё-таки сегмент:смещение Чтение по линейным адресам будет работать только в нереальном режиме, когда лимит сегмента больше 0xFFFF. Адрес F000:FF53 в реальном режиме соответствует линейному адресу 0x000FFF53 (segment << 4 + offset) Делайте, например, так: Код (Text): push 0xF000 pop es mov bx, 0xFF53 ; mov cx, 8*24 ; _main_loop: mov eax, [es:bx] call _proc add bx, 4 xor eax, eax loop _main_loop hlt jmp $ Есть ещё такая инструкция - les, можете использовать её (загружает сегмент в es, и смещение куда попросишь): Код (Text): var dd 0xF000FF53 les bx, [var] Дизассемблировать
А чего ты интересного хочешь из Virtual Box получить? У него открытый исходный код и обработчик прерывания можно посмотреть "не напрягаясь". Намного интересней дизассемблировать код обработчика прерывания на реальном железе, хотя с другой стороны и тут нужное можно найти в открытом драйвере Linux.