2017-05-07 5 views
1

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.

+0

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. –

+0

@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. –

+0

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 –

Antwort

4

Um einen 64-Bit-QWORD zu erhöhen, können Sie die add und adc Anweisungen verwenden können:

ADD WORD [DAP+ 8], 1 
ADC WORD [DAP+10], 0 
ADC WORD [DAP+12], 0 
ADC WORD [DAP+14], 0 

Oder, wenn Sie nicht ein 8088, 8086 oder 80286 zielen, können Sie auch ein 32 verwenden können -Bit hinzufügen/adc:

ADD DWORD [DAP+ 8], 1 
ADC DWORD [DAP+12], 0 

Beachten Sie, dass Sie nicht INC WORD [DAP+ 8] statt ADD WORD [DAP+ 8], 1, weil der vorige war nicht das Carry-Flag verwenden können.

+0

Danke @FUZ. Ich benutze NASM und sie arbeiten nicht für mich, ich werde zurück sein. –

+3

@fuz: Oder du könntest den direkten Weg gehen und die FPU missbrauchen, wenn du eine hast ('FILD qword [DAP + 8]/FLD1/FADDP/FISTP qword [DAP + 8]'). Zugegeben, schrecklich, aber die x87 hat ausreichende Präzision und korrekte Überlaufsemantik, um das Richtige zu tun. – doynax

+0

@doynax In der Tat, das würde funktionieren, aber es könnte schlechter laufen. – fuz

Verwandte Themen