Ich lese Sektoren von meinem erweiterten Laufwerk im Real-Modus mit dem Interrupt 0x13
mit der Funktion der erweiterten Laufwerke 0x42
.So erhöhen Sie die effektive Adresse des 64-Bit-Speichers im Real-Modus
I definieren DAP 16 Bytes in der folgenden Struktur zu sein:
DAP:
db 0x10 ; size of DAP
db 0 ; Reserved zero
dw 0x0001 ; Number of sectors to read
dd 0x00000200 ; Memory Location to load the sector (s)
dq 0 ; Start of the sectors to be read
Das DAP-Segment von 8 Bytes lang ist, wie man feststellen konnte. Während ich nach meinem Sektor suche (Sektoren überstreiche), inkrementiere ich das Segment und vergleiche es mit der tatsächlichen Größe meiner Festplatte. Der falsche Code, den ich zu erhöhen, bin mit beschränkt sich auf die 16-Bit-Modus:
mov ax, [DAP+0x08]
inc ax
mov [DAP+0x08], ax
Ich will nicht mehrere Mehrzweckregister in einem komplizierten Adressierungsmodus verwenden, um mein Ziel zu erreichen, ich denke, Sie haben einige einfacher und effizienter Weg.
Segment ist kein 8 Byte (64-Bit-Wert). Was Sie als 8-Byte-Wert aufgelistet haben, ist die LBA (Logische Blockadresse). Das Segment. Ist eigentlich die zweite 2 Bytes von dem, was Sie als "Offset" aufgeführt haben. Der Vier-Byte-Wert, den Sie als "Offset" aufgelistet haben, ist eigentlich ein Real-Modus-Segment: Offset-Paar. –
@MichaelPetch, Sie haben Recht mit meinen Code-Kommentaren. Dies lag daran, dass ein Teil des Codes nicht irgendwo kopiert wurde. Jedenfalls habe ich die Kommentare geändert. –
Der 4-Byte-Wert 0x200 entspricht tatsächlich 0x00000200, was zu einem Segment-Offset-Paar von 0x0000: 0x0200 führt. Ich hoffe, das ist nicht, wo im Speicher begonnen wurde, Sektoren zu lesen, weil das oben auf der Interrupt-Vektortabelle im unteren Speicher liegt, die von 0x0000 bis 0x3fff ausgeführt wird. Danach ist der BIOS-Datenbereich von 0x400 bis 0x4ff. Auf alter Hardware sind Bytes ab 0x500 reserviert. Ich würde empfehlen zu lesen 0x0000: 0x0600 –