Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2010, 17:10   #1
Subaru
 
Регистрация: 25.12.2007
Сообщений: 7
Печаль Дизассемблировать Обработчик прерываний Bios для клавиатуры

Не знаю уж у кого спросить, чтоб подсказали. Перенесите, если уж совсем не в той теме.
В университете задали задание вытащить программу базового обработчика прерываний BIOS для клавиатуры(09H)
Сказали использовать пакет программ RunBIOS: вроде как прога intview должна выдавать адрес сегмента и адрес смещения, а потом в sourcere вбиваешь этот адрес и получаешь текст программы обработчика. Если так делать, то выдается какая-то ерунда, не похожая на то, что нужно! Есть подозрение, что обработчик прерывания int 9 не указывает в BIOS, а указывает в DOS, так как DOS устанавливает свой обработчик
Чел из параллельной группы сказал посмотреть команду JMP в сегменте F000 со смещением E987, которая перескакивает на начало обработчика прерываний (им так объяснил их преподаватель). Вот только откуда берется этот адрес непонятно. Наш препод требует объяснений. Может кто-нибудь знает откуда этот(F000 E987) адрес берется?
Subaru вне форума Ответить с цитированием
Старый 26.11.2010, 19:00   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Таблица векторов прерываний валяется в первом килобайте памяти начиная со смещения 0000:0000 в виде массива из 256 dword'ов. Соответственно адрес обработчика прерывания int9 лежит по адресу 9*4=36 он же 0000:0024h
пыщь
JTG вне форума Ответить с цитированием
Старый 26.11.2010, 19:35   #3
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Ну вот, набросал быстренько boot сектор для дискеты, создал пустой образ дискетки с этим загрузчиком и загрузил в виртуальной машине Virtual PC 2007. Удивительно, но адрес и в правду совпал с вышеуказанным. В архиве прикладываю файл-образ дискеты (testimg.img), который можно записать на обычную 1,44Mb дискету и загрузиться на реальном компе с нее, а можно подцепить образ в любую виртуальную машину. Так же в архиве исходный код загрузчика (boot.asm) и уже скомпилированная версия (boot.bin).
Исходный код загрузчика:
Код:
.MODEL tiny
.CODE
.STARTUP
  
start:          jmp boot_loader                 ; прыгаем на начало

oem_id          DB 'Tronix  '                   ; (C) Tronix
bytespersector  DW 512                          ; Табличка заполнена 
sectorspreclu   DB 1                            ; для 1,44Mb дискеты
reservedsectors DW 1
fatcount        DB 2
rootsize        DW 224
totalsectors    DW 2880
mediadescriptor DB 0F0h
fatsize         DW 9
sectorspertrack DW 18
readwriteheads  DW 2
hiddensectorsl  DW 0
hiddensectorsh  DW 0
longtotal       DW 0,0
drivenum        DB 0
reserved        DB 1
extbmagic       DB 29H                          ; Extended record
serialnum       DW 0,0
volumelab       DB 11 dup (?)
fattype         DB 'FAT12   '

boot_loader:
	cli		; запрет прерываний
	mov ax,cs	; инициализируем сегментные регистры
	mov ds,ax
	mov es,ax
	mov ss,ax
	mov sp,7C00h	; установим стек
	sti		; разрешить прерывания
	cld		; установить флаг направления - вперед.


	mov di,offset addr+7b00h ;прибавляем 7b00h, ибо org 100h
	mov dx,ds:[9*4+2]	; получить смещение 9 прерывания в таблице
	call word2hex		; конвертнуть в 16-ричную по адресу ds:di

	mov di,offset offs+7b00h
	mov dx,ds:[9*4]		; сегмент 9 прерывания в таблице
	call word2hex		; конвертнуть в 16-ричную по адресу ds:di

	mov si,offset mes+7b00h
	call loop_out		; печатаем все на экране

	hlt			; вешаем процессор.

;процедура вывода текста на экран.
;в SI - смещение на строку. 0 - признак конца
;строки 
loop_out:
  	push ax
  	push bx
l_o:
  	lodsb                                   
	test al,al
  	jz done                            
  	mov ah,0eh                          
  	mov bx,7h           ; BH=0(Page) Bl=7(Color)
  	int 10h                             
  	loop short l_o                       
done:
  	pop bx
  	pop ax
  	ret

;конвертирование байта в Hex
byte2hex:
       push    cx
       mov     cx,2
L1:    rol     dl,4
       mov     ax,300fh
       and     al,dl
       aaa
       aad     11h
       stosb
       loop    L1
       pop     cx
       ret
 
;конвертирование слова в Hex
word2hex:
       push    cx
       mov     cx,2
L2:    rol     dx,8
       call    byte2hex
       loop    L2
       pop     cx
       ret

mes	db '(c) Tronix 2010',10,13
	db 'Hello from BOOT!',10,13
	db 'INT 09h vector at '
addr	db 4 DUP('?')
	db ':'
offs	db 4 DUP('?')
	db 10,13,10,13
	db 'Press RESET or CTRL+ALT+DEL...',0

Free    EQU (512 - 2) - ($-start)
	
	db free dup(0)

if Free LT 0
	.ERR
	 %out FATAL PROBLEM: boot sector is too large (>512 bytes)
endif

id              DW 0AA55h
end
Компилировал:
tasm boot.asm
tlink /t boot.obj
Изображения
Тип файла: jpg int9.jpg (14.6 Кб, 123 просмотров)
Вложения
Тип файла: rar test_img.rar (1.9 Кб, 24 просмотров)
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 28.11.2010, 19:22   #4
Subaru
 
Регистрация: 25.12.2007
Сообщений: 7
По умолчанию

Tronix, огромное спасибо за помощь! Это было как раз то, что нужно! =)
Subaru вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват прерываний от клавиатуры и работа с видеопамятью sunlightik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 26.02.2010 00:32
Обработчик клавиатуры Raven77 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 28.09.2009 09:04
обработчик прерываний по таймеру Петруха Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 26.03.2009 20:57