Urs Thuermann
2006-07-16 08:33:27 UTC
Nach langer Zeit habe ich eben mal wieder was mit dem BIOS und
real-mode gemacht und stolpere gerade über ein Problem mit dem BIOS.
Ich will eine Diskette track-weise mit int 0x13 einlesen an die
Adresse 1000:0000. Es ist %es:%bx mit 1000:0000 initialisiert. Ich
lese immer 18 Sektoren und erhöhe dann %es um 0x240, %bx ist immer 0.
Das geht aber schief, sobald ich über die Adresse 0x1FFFF hinauskomme:
Loading...
ax cx dx es bx
0212 0001 0000 1000 0000
0212 0001 0100 1240 0000
0212 0101 0000 1480 0000
0212 0101 0100 16C0 0000
0212 0201 0000 1900 0000
0212 0201 0100 1B40 0000
0212 0301 0000 1D80 0000
0212 0301 0100 1FC0 0000 Error 09
Im Fehlerfall rufe ich int 0x13 also auf mit
%ah = 2 read
%al = 0x12 18 sectors
%ch = 3 track 3
%cl = 1 sector 1
%dh = 1 head 1
%dl = 0 drive 0
%es:%bx = 0x1FC0:0000 destination
Der int 0x13 kommt mit %ah = 9 zurück, also Segmentüberschreitung.
Das finde ich merkwürdig, denn ich lese in das Segment 0x1FC0 ab dem
Offset 0x0000 von der Diskette 18 Sektoren, also 0x2400 Bytes ein,
also von 0x1FC0:0000 bis 0x1FC0:2400. Da wird doch keine
Segmetgerenze überschritten. Das Problem scheint zu sein, daß der
Zugriff nicht innerhalb eines 64k-aligned Segments liegt. Ist das
BIOS also so blöd, daß es hier von 0x1000:FC00 bis 0x2000:2000 lesen
will, was natürlich eine Segmentgrenze überschreit?
urs
real-mode gemacht und stolpere gerade über ein Problem mit dem BIOS.
Ich will eine Diskette track-weise mit int 0x13 einlesen an die
Adresse 1000:0000. Es ist %es:%bx mit 1000:0000 initialisiert. Ich
lese immer 18 Sektoren und erhöhe dann %es um 0x240, %bx ist immer 0.
Das geht aber schief, sobald ich über die Adresse 0x1FFFF hinauskomme:
Loading...
ax cx dx es bx
0212 0001 0000 1000 0000
0212 0001 0100 1240 0000
0212 0101 0000 1480 0000
0212 0101 0100 16C0 0000
0212 0201 0000 1900 0000
0212 0201 0100 1B40 0000
0212 0301 0000 1D80 0000
0212 0301 0100 1FC0 0000 Error 09
Im Fehlerfall rufe ich int 0x13 also auf mit
%ah = 2 read
%al = 0x12 18 sectors
%ch = 3 track 3
%cl = 1 sector 1
%dh = 1 head 1
%dl = 0 drive 0
%es:%bx = 0x1FC0:0000 destination
Der int 0x13 kommt mit %ah = 9 zurück, also Segmentüberschreitung.
Das finde ich merkwürdig, denn ich lese in das Segment 0x1FC0 ab dem
Offset 0x0000 von der Diskette 18 Sektoren, also 0x2400 Bytes ein,
also von 0x1FC0:0000 bis 0x1FC0:2400. Da wird doch keine
Segmetgerenze überschritten. Das Problem scheint zu sein, daß der
Zugriff nicht innerhalb eines 64k-aligned Segments liegt. Ist das
BIOS also so blöd, daß es hier von 0x1000:FC00 bis 0x2000:2000 lesen
will, was natürlich eine Segmentgrenze überschreit?
urs