Maly problem z asemblerem

0

Nie wiem dlaczego ale moj maly bootloader niechce wyczyscic ekranu po wlaczeniu. Mozliwe ze gdzies mi wkradl sie blad :(

Znacie jakas dobra www opisujaca zwiezle pisanie po pamieci? Bo czytanie z pamieci do rejestrow to latwo ale w druga strone trudniej. Chodzi mi o wszystkie sposoby jakie sa :)

O to kod:

[SECTION .text]

[ORG 0x7C00]

[BITS 16]



						;Ustawiamy rejestry segmentowe

bts_start:				xor ax, ax

						mov cs, ax

						mov ds, ax

						mov es, ax

						

						;Czyscimy ekran

						mov ax, bts_v_offset

						call scr_clear

						

						;Wyswietlamy napis

						

						jmp $

I moja funkcja:

						%define scr_d_height 25
						%define scr_d_width 40
						%define scr_d_segment 0xB800
						%define scr_d_offset 0x0000


;------------------------------------------------------------------


						;Czyscimy ekran i zerujemy przesuniecie karetki
						;Wejscie: AX - adres przesuniecia karetki
scr_clear:				pushf
						pusha
						
						;Czyscimy ekran
						push ax
						push es
						mov ax, scr_d_segment
						mov es, ax
						mov di, scr_d_offset
						xor ax, ax
						cld
						mov cx, (scr_d_height * scr_d_width * 2)
						rep stosw
						pop es
						pop bx
						
						;Zerujemy przesuniecie karetki
						xor ax, ax
						mov [bx], ax
						
						popa
						popf
						ret
0

Zastanów się czy ten boot loader w ogóle się wykonuje. Na moje oko nie masz bloku parametrów nośnika na początku kodu, ale reszta wydaje się być dobrze napisana.

0

Tzn jakich kodow? Podaj przyklad :)

To tylko wycinek kodu jest, tzn pierwsze linijki :) ale jak zrobie wyswietlenie znaku przez przerywanie to wyswietla go :/

Znalazlem winowajce :)

Bo zapisywalem do cs zero bo to jest segment zerowy chyba ze bios wpisuje tam na starcie 7c00 :P moj blad :)

0

No racja, nie zauważyłem tej instrukcji. Takia zmiana rejestru cs powoduje wyjątek procesora to w tym przypadku powinno się zakończyć raczej resetem.

Blok parametrów nośnika jest niezbędny aby dysk był rozpoznawany poprawnie podczas odczytu. Wystarczy poczytać trochę o FAT12 i o podstawowej strukturze boot loadera dystkietki.

Oto przykład:

[BITS 16]
[ORG 0x7C00]
Jmp	START
	OEMName			db	'        '
	BytesPerSector		dw	200h
	SectorsPerCluster		db	1
	ReservedSectors		dw	1
	FATNumber			db	2
	MaxRootEntries		dw	0E0h
	TotalSectorNumber		dw	0B40h
	IdByte			db	0F0h
	FATSectorsNumber		dw	9
	SectorsPerCylinder	dw	12h
	HeadNumber			db	2
	HiddenSectors		dd	0
	TotalSectors		dd	0
	DriveNumber			db	0
	Flags				db	0
	Signature			db	29h
	VolumeId			dd	-1
	VolumeLabel			db	'           '
	SystemId			db	'FAT12   '
START:
	mov	ax,	0
	mov	ds,	ax
	mov	es,	ax
	mov	ss,	ax
	mov	sp,	0x6000
	...
0

Ja tam nie uzywam fat12 na mojej dyskietce :)

A nie wystarczy slowo: 55AA na koncu bootsectora? Bo niby to to jest sygnatura bootowalnego nosnika :)

0

Tak.
Właściwie to masz rację. Te dwa bajty wystarczają.

Ja jednak używam bloku parametrów z pewnego względu. Zawsze wgrywam pierwszy sektor na dyskietkę za pomocą programu Debug w Windows'ie. Ten program jednak zwraca mi błąd ochrony przy zapisie jeżeli poprzednio wgrałem boot loadera bez bloku parametrów.
Teoretycznie Debug nie używa struktury FAT bo wykonuje tylko operację wpisania do konkretnego sektora, ale jednak po zniszczeniu bloku parametrów nie jest w stanie wykonać już żadnej operacji na dyskietce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1