Wie schreibt man auf die Festplatte mit der bios-interrupt 13h
Möchte ich kopiere meinen Bootloader in den ersten Sektor(512) Festplatte-in sich selbst (ich sollte die bios-interrupt 13h) und ich fand diesen code:
mov bx, buffer1 ; set BX to the address (not the value) of BlahBlah
mov ah,03h ;When ah=, int13 reads a disk sector
mov al,5 ;Al is how many sectors to read
mov cl,0 ;Sector Id
mov dh,0 ;Head
mov dl,80h ;Drive (0 is floppy)
mov cx,512 ;One sector /2
mov ah, 0x3 ; set function 2h
int 0x13
bu-es funktioniert nicht!
- Copy-pasta-code ist nie ein guter Weg, Dinge zu tun. Sie sollten lernen, einige assembler und versuchen zu verstehen, warum der code nicht funktioniert. Dann können Sie versuchen, es zu lösen sich und kommen Sie hier, wenn Sie nicht weiterkommen.
- Haben Sie bemerkt, dass die Kommentar-Funktion sagt 2h ? aber es bewegt sich tatsächlich 0x3 ah
- ich weiß, was code tut! ich ändere es eigentlich (3h ist ein Beispiel)! was ich nicht weiß ist, warum es nicht funktioniert!
- Haben Sie laden Sie die segment-register mit den entsprechenden segment Teil des Puffers mit Adresse? Haben Sie mit dem BIOS-Referenz (z.B. Ralf Brown ' s Interrupt List), dass Sie über diese BIOS-Funktion richtig (Einstellung anderen Registern zu korrigieren, Werte)?
- starten Sie durch das lernen zu Lesen von einer funktionierenden disk first, get verwendet, um das bios Aufrufe, dann werden Sie wissen, was zu tun ist, wenn es Zeit ist, zu schreiben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code ist sehr chaotisch. Um Sie richtig zu nutzen
int 13h
mitAH = 3
müssen Sie auch festlegenES
(das segment, in demBX
befindet, z.B.ES:BX
ist die Adresse des Puffers, die gelesen werden sollen und auf die Festplatte geschrieben), undCX
eine Kombination aus Zylinder-und Sektor-Nummer (cylinder = CL[7:6] || CH
,sector = CL[5:0]
).Unter der Annahme, dass Sie schreiben wollen, auf einen Sektor (512 bytes) von der physischen Adresse
5000h
CHS 0:0:1 auf Festplatte 0, würde der code wie folgt Aussehen :Sollten Sie auch daran denken, zu prüfen, ob das Carry-Flag gesetzt wurde, nach der Ausführung des Interrupts. Es wird klar sein, wenn die Funktion richtig durchgeführt wurde. Wenn er gesetzt ist, dann wird der
AH
register enthält einen Fehlercode.BIOS-Funktionen Eingabe Parameter. Wenn Sie nicht bekommen, alle von der input-Parameter Recht, die BIOS-Funktion ist nicht in der Lage, zu erraten, was Sie meinte. Für die BIOS-Funktion, die Sie verwenden haben Sie einen Blick auf: http://www.ctyme.com/intr/rb-0608.htm
Soweit ich das beurteilen kann, sind Sie fehlen vernünftige Werte für beide CH und ES, also das BIOS kann das schreiben von Daten aus einer völlig anderen Adresse auf einem völlig anderen Sektor. Beachten Sie auch, dass CL ist die niedrigste die Hälfte der CX-register - macht es keinen Sinn, laden Sie einen Wert in CL und dann überschreiben es mit dem laden etwas in CX.
BIOS-Funktionen return-Werte zu. In Ihrem Fall kann das BIOS wieder ein status-code, der Ihnen sagt, was schief ging, und weil Sie nicht überprüfen Sie nicht wissen, wenn etwas schief ging oder was es war, wenn Sie es Tat.