INT 13H, BIOS tarafından sağlanan ve x86 mimarisinde disk erişimi için kullanılan düşük seviyeli bir kesme(interrupt) servisidir.
İnterrupt vektör tablosunda 20.kesme (0x13) karşılık gelir. BIOS tarafından sağlanan disk erişimi servisi olup yani örnek olarak sabit disk(HDD) veya Disket(Floppy) gibi depolama aygıtlarında sektör seviyesinde okuma ve yazma işlemleri yapmayı mümkün kılar.
INT 13H, IBM uyumlu kişisel bilgisayarların (PC) ilk döneminde itibaren kullanılmaya başlanmıştır, aslen disket sürücüleri üzerinden veri erişimi sağlamak amacıyla tasarlanmıştır. Zamanla sabit disklerin yaygınlaşmasıyla birlikte bu interrupt genişletilmiş ve daha karmaşık diskler için yapıları desteklenmiştir
CHS(Cylinder-Head-Sector), INT 13H'nin erken sürümleri disk erişimini fiziksel geometriye dayalı olarak gerçekleştirilir. Bu modelde:
CHS modelinde en büyük dezavantaj, adresleme kapasitesinin sınırlı olmasıdır. Bu yöntemle genellikle 8 GB disk sınırına takılmaktadır.
(bakınız: Boot)
INT 13H, en kritik ve önemi kullanım alanı, sistem açılış sürecidir (boot). BIOS boot edilebilir bir aygıt bulduğunda ilk sektörü RAM (MBR)'e yükler. MBR içerisindeki bootleader, işletim sisteminin geri kalanını yüklemek için INT 13H kullanır. Bu nedenle boot zincirinin temel bileşenlerinden biridir.
Modern işletim sistemlerinde :
Örnek olarak gösterilen bu ASM(assembly) kodları:
;hedefteki disk okunur
mov ah, 02h ; okuma fonksiyonu
mov al, 01h ; 1 sektör
mov ch, 00h ; cylinder
mov cl, 02h ; sector
mov dh, 00h ; head
mov dl, 80h ; HDD
mov bx, buffer ; hedef adres
int 13h
jc disk_error ; hata varsa
Disk okuma örneği;
;Basit disk okuması
org 0x7C00 ; BIOS boot sector adresi
start:
mov ah, 02h ; INT 13h: read sectors
mov al, 01h ; 1 sektör oku
mov ch, 00h ; cylinder = 0
mov cl, 02h ; sector = 2 (1 genelde boot sector)
mov dh, 00h ; head = 0
mov dl, 80h ; drive = HDD
mov bx, 0x8000 ; verinin yükleneceği offset
mov es, bx ; ES:BX hedef adres olacak
xor bx, bx
int 13h ; BIOS çağrısı
jc disk_error ; Carry Flag set ise hata
success:
jmp $ ; sonsuz döngü
disk_error:
mov si, error_msg
call print_string
jmp $
; Basit string yazdırma (INT 10h kullanır)
print_string:
mov ah, 0Eh
.loop:
lodsb
cmp al, 0
je .done
int 10h
jmp .loop
.done:
ret
error_msg db "Disk hatası!",0
times 510-($-$$) db 0
dw 0xAA55