Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: nooooooooos am 17. September 2006, 17:28
-
Hallo zusammn....
Ich hab jetzt schon ne ganze Weile ein Problem mit so einem blöden Realmode code.
Er sollte den 5. Sektor auf der Diskette in den Speicher laden, welcher so aussieht: dw 'Tr'
dw 0,0
Dieser Sektor ist ganz sicher an der Position 0xA00 (also eben 5x512), ich habs mit nem Hex-Editor überprüft.
Dannach soll er die Datei nach 'Tr' durchsuchen, bis er auf eine Null stösst. Allerdings, findet der Code schon ganz am Anfang eine Null, was eingentlich nicht sein dürfte....Darum denk ich, liegt der Fehler am Code, welcher den Sektor lädt (ganz am Anfang dieses Codeabschnitts): xor ax,ax
mov ds,ax
mov es,ax
mov bx,0x8000
mov ah,2
mov cx,5
mov dx,0
mov al,5
int 0x13
jc nomal
mov bx,0x8000
jmp inschleiferein
wiederholeen:
add bx,24
inschleiferein:
cmp WORD[bx],0
je FehlerPlus3A
cmp WORD[bx+2],0
jne weitermachen
Fehler:
ax,0xB800
mov ds,ax
mov BYTE [0x10], '+'
jmp Fehler
weitermachen:
cmp WORD[bx],'Tr'
jne wiederholeen
Vielen Dank
Nooooooooooos
-
hi,
also wenn das der ganze Code ist, dann fehlt das initialisieren des Stacks (was aber theoretisch nicht ganz so schlimm sein sollte aber evt. zu Problemen führen kann).
jc nomal
wohin springt er wann ?
am besten poste mal den ganzen Code, dann kann ich des mal bei mir testen.
mfg,
stefan
-
Joa...also das ist ein Bootloader, fehlen tut eigentlich nur der obere Teil:
org 0x7C00 ;Dem Compiler mitteilen, dass die Adresse hier 0x7c00 ist
cli ;Interrupts ausschalten
mov ax, 0x6000 ;Stack festlegen
mov ss, ax
mov sp, 0
sti ;Interrupts wieder einschalten
xor ax,ax ;Segmentregister setzen
mov ds,ax
mov es,ax
mov ax,3 ;Bildschirm löschen
int 0x10
Wiederholen:
xor ax,ax ;Funktion auswählen
int 13h ;Den Interrupt ausführen
jc Wiederholen ;Bei Fehler wiederholen
nomal:
xor ax,ax
mov ds,ax
mov es,ax
mov bx,0x8000
mov ah,2
mov cx,5
mov dx,0
mov al,5
int 0x13
jc nomal
mov bx,0x8000
jmp inschleiferein
wiederholeen:
add bx,24
inschleiferein:
cmp WORD[bx],0
je FehlerPlus3A
cmp WORD[bx+2],0
jne weitermachen
Fehler:
ax,0xB800
mov ds,ax
mov BYTE [0x10], '-'
jmp Fehler
weitermachen:
cmp WORD[bx],'Tr'
jne wiederholeen
ax,0xB800
mov ds,ax
mov BYTE [0x10], '-'
Jetzt wird ein Plus gezeigt, wenn es erfolgreich war, ansonsten ein Minus.
Dann wird der Bootloader zusammen mit folgender Datei getan: times 2048-($-$$) db 0
dw 'Tr'
dw 0,0
times 2048-($-$$) db 0
Gruss
Noooooooooooos
-
Du verwendest den BIOS interrupt 0x13
Der interrupt verwendet meines wissens nach das CHS format.
Im CHS format werden die Sectoren mit 1 beginnend gezählt.
(im Gegensaz zu LBA)
d.h. der erste Sector beginnt bei Offset 0x000
,der 5. bei 0x800
und der 6. bei 0xA00
-
Jops......ich meinte, ich hätte das einmal gelesen....jana
Vielen Dank an alle
Noooooooooooooos