Загрузчик FAT32.asm

Обсуждаем ReactOS по-русски

Moderators: fog, fireball

Post Reply
GLeBaTi
Posts: 4
Joined: Mon Jun 28, 2010 8:37 pm

Загрузчик FAT32.asm

Post by GLeBaTi » Fri Jul 02, 2010 5:03 pm

Здравствуйте. Просматривал исходник FAT32.asm (D:\Updoad\ос\ReactOS\ReactOS-0.3.11\boot\freeldr\bootsect\fat32.asm) и нашел интересную строку:

Code: Select all

SectorsPerTrack		dw 0
...
ReadSectorsCHSLoop:
        pushad
        xor   edx,edx								; EDX = 0
		movzx ecx,WORD [BYTE bp+SectorsPerTrack]	; ECX = кол-во секторов на дорожке (0)
		div   ecx	
Хотелось бы узнать: разве можно делить на ноль ?

evilslon
Posts: 261
Joined: Sat Apr 11, 2009 7:39 pm
Location: Russia, Ivanovo
Contact:

Re: Загрузчик FAT32.asm

Post by evilslon » Fri Jul 02, 2010 9:49 pm

Я не то чтобы очень разбираюсь в асме, но деления на ноль я не вижу, командой xor edx,edx обнуляется регистр edx, а деление идёт между ecx и аккумулятором, разве не так? :) А вот откуда вы взяли, что "ECX = кол-во секторов на дорожке (0)", я не знаю, ни на одной дорожке ФС FAT32 не может быть нуля секторов.

Demonidios
Posts: 235
Joined: Fri Sep 25, 2009 7:35 pm

Re: Загрузчик FAT32.asm

Post by Demonidios » Sat Jul 03, 2010 7:42 am

Скорее всего он забыл, что отсчет дорожек начинается с нуля. Я тоже пару раз так пролетал, когда задания по информатике делал, не учитывал что отсчет идет от нуля, а не от единицы.

GLeBaTi
Posts: 4
Joined: Mon Jun 28, 2010 8:37 pm

Re: Загрузчик FAT32.asm

Post by GLeBaTi » Sat Jul 03, 2010 9:44 am

SectorsPerTrack dw 0
...
ReadSectorsCHSLoop:
pushad
xor edx,edx ; EDX = 0
movzx ecx,WORD [BYTE bp+SectorsPerTrack] ; ECX = кол-во секторов на дорожке (0)-первая строчка. В коде она не меняется
div ecx ; EAX = EAX / ECX

evilslon
Posts: 261
Joined: Sat Apr 11, 2009 7:39 pm
Location: Russia, Ivanovo
Contact:

Re: Загрузчик FAT32.asm

Post by evilslon » Sat Jul 03, 2010 12:38 pm

GLeBaTi wrote:SectorsPerTrack dw 0
...
ReadSectorsCHSLoop:
pushad
xor edx,edx ; EDX = 0
movzx ecx,WORD [BYTE bp+SectorsPerTrack] ; ECX = кол-во секторов на дорожке (0)-первая строчка. В коде она не меняется
div ecx ; EAX = EAX / ECX
Ну хорошо, но в bp точно ненулевое значение, это ж вторичный указатель стека! Хотя вся операция какая-то странная, зачем делить номер логического сектора, который необходимо прочитать, на фактически адрес стека?

ViRUS
Posts: 17
Joined: Tue Nov 30, 2004 2:57 am
Location: Russia
Contact:

Re: Загрузчик FAT32.asm

Post by ViRUS » Fri Jul 09, 2010 2:11 am

Так-с. Буду вносить ясность, пока все окончательно не запутались.

Code: Select all

movzx ecx,WORD [BYTE bp+SectorsPerTrack]
Квадратные скобки означают, что в регистр ecx запишется не сумма bp и SectorsPerTrack, а значение по адресу bp+SectorsPerTrack.
Что же у нас в регистре bp и зачем считать адрес относительно базы? Дело в том, что загрузочный сектор загружается BIOSом по адресу 0000:7C00, поэтому все абсолютные смещения в коде должны это учитывать, что подтверждается кодом:

Code: Select all

main:
xor ax,ax               ; Setup segment registers
mov ds,ax               ; Make DS correct
mov es,ax               ; Make ES correct
mov ss,ax       ; Make SS correct
mov bp,7c00h
mov sp,7c00h            ; Setup a stack
Теперь о самом важном, почему не происходит деления на ноль, если в SectorsPerTrack ноль? Всё очень просто! Ноль в исходнике, но ведь реальный загрузочный сектор находится на диске и значение SectorsPerTrack там совсем не нулевое. Программа установки перед записью загрузочного сектора на диск формирует необходимые значения, которые отличаются для каждого диска, в чём можно убедиться, сдампив загрузочный сектор.

evilslon
Posts: 261
Joined: Sat Apr 11, 2009 7:39 pm
Location: Russia, Ivanovo
Contact:

Re: Загрузчик FAT32.asm

Post by evilslon » Fri Jul 09, 2010 8:04 am

А мы уже разобрались в IRC, но всё равно спасибо :)

GLeBaTi
Posts: 4
Joined: Mon Jun 28, 2010 8:37 pm

Re: Загрузчик FAT32.asm

Post by GLeBaTi » Fri Jul 09, 2010 10:25 am

Image

Это я дизассемблировал reactos\output-i386\bootcd\loader\fat32.bin
Но там, как видите, тоже ноль :|

GLeBaTi
Posts: 4
Joined: Mon Jun 28, 2010 8:37 pm

Re: Загрузчик FAT32.asm

Post by GLeBaTi » Mon Jul 19, 2010 5:36 pm

здесь, в 62 строке вызывается ф-ия _BootMain
http://code.google.com/p/reactos-mirror ... 386/arch.S

А вот сама ф-ия _BootMain: http://code.google.com/p/reactos-mirror ... /freeldr.c
Но ей передаются параметры командной строки. Подскажите пожалуйста, где в arch.s передается строка ф-ие BootMain ?

ViRUS
Posts: 17
Joined: Tue Nov 30, 2004 2:57 am
Location: Russia
Contact:

Re: Загрузчик FAT32.asm

Post by ViRUS » Sat Jul 24, 2010 3:24 am

GLeBaTi wrote:Но там, как видите, тоже ноль :|
Конечно ноль! Если в исходнике ноль, то и в скомпилированном из него бинарнике тоже будет ноль! Вот если этот бинарник специальной утилитой (такой как sys в DOS или средствами установщика ReactOS) записать загрузочный сектор, а потом прочитать содержимое этого сектора в файл (сдампить), то там будет уже не ноль, потому что sys адаптировала BPB (Bios Parameter Block - так называется тот самый набор констант) в бинарнике под геометрию конкретного диска.
GLeBaTi wrote:Но ей передаются параметры командной строки. Подскажите пожалуйста, где в arch.s передается строка ф-ие BootMain?

Code: Select all

	/* GO! */
	pushl	%eax
	call	_BootMain
Кладётся на стек перед вызовом.

Может всё-таки стоит разобраться как загружается компьютер и изучить ассемблер, чтобы не задавать глупые вопросы?

serrox
Posts: 131
Joined: Sun Nov 22, 2009 7:31 pm
Contact:

Re: Загрузчик FAT32.asm

Post by serrox » Thu Sep 16, 2010 6:22 am

просматривал тут содержание харда, на котором стоит React и обнаружил любопытную вещь - поле BootDrive равно FFh, хотя на сколько я знаю для основного харда оно равно 80h. почему FFh?

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest