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