Tu masz bardzo ładny przykład działania funkcji 0x42, przerwania 0x13.
https://github.com/akasei/Cyjon/blob/master/bootloader/stage1.asm
Dokumentacja:
http://www.ctyme.com/intr/rb-0708.htm
; rozpoczynamy wczytanie programu rozruchowego do pamięci
mov ah, 0x42 ; procedura - rozszerzony odczyt danych
mov si, variable_table_disk_address_packet ; o rozmiarze i miejscu docelowym opisanym za pomocą pakietu danych
int 0x13 ; wykonaj funkcje - rozszerzony odczyt z nośnika
variable_table_disk_address_packet:
db 0x10 ; rozmiar struktury, czyli tej tablicy (nie zmieniać)
db 0x00 ; zarezerwowane
dw 0x0001 ; ilość sektorów do odczytania (0x01, 512 Bajtów)
; gdzie zapisać odczytane sektory (0x00001000)
dw 0x1000 ; przesunięcie
dw 0x0000 ; segment
; bezwzględny (LBA, liczony od zera) numer sektora do odczytu
dq 0x0000000000000001 ; drugi sektor, w pierwszym jest MBR
Widocznie "pakietem" nazywali jeden sektor... (dla zmylenia przeciwnika)
Druga odpowiedź:
Bochs rozpozna kod wynikowy asemblacji jako "warty" uwagi jeśli plik będzie większy lub równy 1 MiB, ustaw rozmiar skompilowanego kodu:
; dopisz na koniec kodu od nowej linii
align 0x00100000
Trzecia odpowiedź:
Z różnych przyczyn, na pierwszą i podstawową już sobie odpowiedziałeś (choć jest to niecodzienne zagranie). Częstym zachowaniem jest skopiowanie samego siebie pod adres 0x0000:0x1000 i skok w to miejsce, dzięki temu mamy dostęp do ponad 630 KiB pamięci.
Rozwijając myśl, gwarantowana wolna przestrzeń, którą możesz wykorzystać do własnych celów to adres od:
np. Bochs:
0x00000500 - 0x0009EFFF (o ten adres musisz zapytać BIOS, może się dynamicznie przemieszczać - za każdym restartem jednostki, choć pewnym jest 0x0007FFFF)
Daje nam to 634,75 KiB przestrzeni.