Autor Thema: Dummerfehler in RM-Code  (Gelesen 2832 mal)

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« 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

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 17. September 2006, 19:40 »
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

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. September 2006, 19:48 »
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

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 17. September 2006, 21:39 »
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
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 18. September 2006, 15:55 »
Jops......ich meinte, ich hätte das einmal gelesen....jana

Vielen Dank an alle
Noooooooooooooos

 

Einloggen