Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
1

Создание mbr загрузчика

19.08.2013, 21:18. Показов 6886. Ответов 35
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, читал/нашел много статей по этой теме, но есть пара вопросов.
Мне нужно вывести информацию о каждом разделе. Могу ли я переходить просто в начало каждого раздела и прибавляя могу ли посмотреть информацию о разделе?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2013, 21:18
Ответы с готовыми решениями:

Создание загрузчика на ассемблере.
В общем, есть у меня такая задача: разработать загрузчик, позволяющий загружать 2 ОС: UNIX и...

Отладка загрузчика
Всем привет!Я пишу свой загрузчик для Windows и хотел бы иметь возможность отлаживать каждый шаг...

Загрузка вторичного загрузчика
Здравствуйте! Пытаюсь написать собственную ОС, останавливая негативную критику, это исключительно...

Нужен пример загрузчика ОС
Вообщем пишу маленькую ос.Решил попробовать загрузчик. Всякую хрень он мне выдает: org 0x7C00 ...

35
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
21.08.2013, 19:20 21
Author24 — интернет-сервис помощи студентам
Catstail, Дело вкуса\понимания\привычки. Пожалуй, на этом разойдемся
Mikl___, Я так понимаю Вы любите искать изощренные способы решения простых задач?
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
22.08.2013, 05:30 22
Цитата Сообщение от Мотороллер Посмотреть сообщение
Я так понимаю Вы любите искать изощренные способы решения простых задач?
В точку, смотри здесь и здесь. Это неизбежно, так как количество способов которыми в ассемблере можно решить одну и туже проблему велико.
Цитата Сообщение от Catstail Посмотреть сообщение
потому, что в команде jmp операнд должен быть адресом...
Не обязательно, операнд джампа может быть и непосредственным значением, как адресом, так и разницей адресов между точкой назначения и текущей командой, так и содержимым регистра или памяти, а обсуждать достоинства/недостатки ассемблерных диалектов не продуктивно, и тот и другой диалект имеют как своих фанатов так и противников
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36592 / 20322 / 4218
Регистрация: 12.02.2012
Сообщений: 33,625
Записей в блоге: 13
22.08.2013, 09:34 23
Цитата Сообщение от Mikl___ Посмотреть сообщение
а обсуждать достоинства/недостатки ассемблерных диалектов не продуктивно, и тот и другой диалект имеют как своих фанатов так и противников
- согласен
0
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
29.08.2013, 12:25  [ТС] 24
Может все таки подскажите как мне добраться до 1 секции и вывести информацию, я попробую по аналогии с другими секторами. Ибо как мне кажется вот это не правильно.(да и не работает)
Assembler
1
2
3
4
5
6
7
8
9
10
11
mov ax, 1BEh
load_boot:
    mov ah,2    
    mov al,1    
    mov bx, 0x7C00
    ;mov ch,0
    ;mov cl,1   
    mov cx, [si+2]
    mov dh,[si+1]   
    mov dl,0x80 ; 
    int 0x13
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
29.08.2013, 14:37 25
Этот код затирает код, считанный из MBR BIOSом при старте компа.
Вам надо записать в МБР свой код с org 7c00h.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36592 / 20322 / 4218
Регистрация: 12.02.2012
Сообщений: 33,625
Записей в блоге: 13
29.08.2013, 14:53 26
Цитата Сообщение от AFP Посмотреть сообщение
Вам надо записать в МБР свой код с org 7c00h.
- с осторожностью... Испортишь MBR - диск (и все его его партиции) станут недоступны
0
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
29.08.2013, 14:53  [ТС] 27
Здесь имелась в виду часть(!) кода которая доходит до первой секции и считывает данные.
0
6769 / 2738 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
31.08.2013, 14:17 28
Цитата Сообщение от Корд Посмотреть сообщение
Скажите как мне добраться до 1 раздела? И посмотреть всю информацию?
Так в MBR-же есть таблица. Где для первого сектора каждого раздела указаны его цилиндр/головка/сектор. Т.е. именно а таком виде, что нужны для заполнения регистров перед вызовом INT 13h для чтения.

Добавлено через 6 минут
Цитата Сообщение от Корд Посмотреть сообщение
Здесь имелась в виду часть(!) кода которая доходит до первой секции и считывает данные.
Ответь на вопрос - по каким адресам лежит твой исполняющийся код. И на вопрос - по каким адресам ты пытаешься навалить в ОЗУ содержимое сектора при чтении через INT 13h. И не сыплешь ли ты содержимое сектора прямо на голову своему исполняющемуся коду ?
0
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
03.09.2013, 10:39  [ТС] 29
Цитата Сообщение от Ethereal Посмотреть сообщение
Ответь на вопрос - по каким адресам лежит твой исполняющийся код. И на вопрос - по каким адресам ты пытаешься навалить в ОЗУ содержимое сектора при чтении через INT 13h. И не сыплешь ли ты содержимое сектора прямо на голову своему исполняющемуся коду ?
По адресу 7c00h
Цитата Сообщение от Ethereal Посмотреть сообщение
Так в MBR-же есть таблица. Где для первого сектора каждого раздела указаны его цилиндр/головка/сектор. Т.е. именно а таком виде, что нужны для заполнения регистров перед вызовом INT 13h для чтения.
Вот я и пытаюсь попасть в эту таблицу и считать. Но плохо представляю как это сделать. По какому адресу "шагнуть".
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
03.09.2013, 14:03 30
Корд, вот как происходит загрузка ПК с винта:
BIOS считывает первый сектор (MBR) с винта в память по адресу 7c00h.
Затем, начиная с этого адреса, выполняет код MBR.
В MBR расположен код начального загрузчика и таблица логических дисков.

Вам надо заменить код начального загрузчика первого сектора, не трогая таблицу, на свой код.
Этот код должен считать другие сектор(а) винчестера, где предварительно вами записана программа чтения таблицы, в другую область памяти (4000h например) и передать на этот адрес управление (начать выполнять команды с адреса 4000h).

На этом форуме уже было обсуждение похожей темы.
0
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
03.09.2013, 17:13  [ТС] 31
Прошу вас читать внимательнее. Я знаю кто, зачем, как и куда загружается. Мне интересен сам код считывания таблицы, т.е как в нее попасть(по какому адресу расположена) и считать данные.
0
650 / 337 / 37
Регистрация: 04.04.2012
Сообщений: 886
03.09.2013, 18:19 32
В поисковике: Структура MBR
0
6769 / 2738 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
04.09.2013, 00:26 33
Цитата Сообщение от Корд Посмотреть сообщение
Прошу вас читать внимательнее. Я знаю кто, зачем, как и куда загружается. Мне интересен сам код считывания таблицы, т.е как в нее попасть(по какому адресу расположена) и считать данные.
Под таблицей ты имеешь ввиду таблицу разделов ?
Эта таблица загрузилась в память вместе с MBR, поскольку она находится с MBR в одном секторе диска, а BIOS читает целыми секторами. BIOS этот сектор 0:0:1 жесткого диска прочитал начиная с адреса 0:7C00 всего 0x200 байт и передал управление на адрес 0:7C00. А значит когда ты исполняешь код MBR таблица разделов уже в памяти лежит и начинается она с адреса 0:7C00+1BE = 0:7DBE.
0
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
04.09.2013, 15:08  [ТС] 34
Т.е если я перейду по адресу 0:7DBE я окажусь в таблице разделов?
0
6769 / 2738 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
04.09.2013, 22:26 35
У тебя в голове винегрет какой-то.

Да, ты окажешься. Но ты будешь исполнять таблицу разделов как код, а какой смысл исполнять данные, как код с непредсказуемыми последствиями ? Помести в память свое имя/отчество и перейди на него. Процессор будет что-то исполнять, твое имя как код будет исполнять. Но какой в этом смысл ? Данные как код, как правило, просто бессмысленная последовательность команд. Тебе надо работать с данными, а не исполнять их как код. Читать эти данные, оперировать ими. А для чтения данных есть команда mov , к примеру.

xor ax,ax
mov ds,ax
mov al,ds:7DBEh
и вот у тебя в регистре AL первый байт таблицы разделов.

Добавлено через 23 минуты
Да, если ты записываешь что-то свое в физический сектор 0:0:1 винчестера, то это свое должно быть файлом длиной 512 байт. В этом файле должен быть твой код, начиная с начала файла, и таблица разделом в конце файла. Таблицу разделов нужно взять из оригинального физ.сектора 0:0:1 (MBR) винчестера. Если ты запишешь в физ.сектор 0:0:1 что-то свое без таблицы разделов, то искать ее уже бессмысленно - на компьютере ее больше нет, причем нигде. Это я объясняю, чтобы ты на еще одни грабли не наступил.

Блин, у меня на винте MFM старом есть исходники моих загрузочных вирусов. Вот из них все бы было ясно - что и как. Да только на чем этот винт MFM, стандарта ST506, теперь прочитать ?
1
41 / 37 / 15
Регистрация: 22.03.2013
Сообщений: 293
08.10.2013, 17:09  [ТС] 36
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
part1_offset = 0x7DBE
 
base_stage0 = 0x7C00
base_stage1 = 0x0600
 
 
use16
org base_stage0
 
    mov ax, 0B800h
        mov es, ax
        mov ax, 3
        int 10h
        mov si, hello
        xor di, di
 
    mov si,hello
 
print_loop:
    lodsb
    
    cmp al,0
    je change
 
    mov ah,0x0E
    int 0x10
    jmp print_loop
 
change:
    cld
    mov si,base_stage0
    ;mov di,base_stage1
    mov cx,446
    rep movsb
 
    jmp stage1
    
org base_stage1 + ($-$$)
stage1: 
    mov ax, part1_offset
    jmp prov
    
prov:
    mov si, ax
    cmp byte [si], 0x80
    je load_boot
    add ax, 0x10
    cmp ax, 0x7DFE
    je exit
    jmp prov
 
load_boot:
    mov ah,2    ; чтение секторов
    mov al,1    ; количество секторов
    mov bx, base_stage0 ; адрес буфера
    mov ch,0    ; младшие 8 бит номера цилиндра, начиная с 0
    ;mov cl,1   ; 6 бит номера сектора, начиная с 1, (в младших битах) и старшие 2 бита номера цилиндра
    mov cx, [si+2]
    mov dh,[si+1]   ; номер головки
    mov dl,0x80 ; номер диска, нумерация начинается с 0x80
    int 0x13
 
    jmp 0x7c00
exit:   
    hlt
hello db "Hello, World!",0x0D,0x0A,0
times 444-($-base_stage1) db 0
db 0x55,0xAA
Проверьте)

Добавлено через 1 час 14 минут
Точнее вот этот проверьте, не выводит таблицу разделов=(
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
part1_offset = 0x7DBE
 
base_stage0 = 0x7C00
base_stage1 = 0x0600
 
 
use16
org base_stage0
 
    mov si,hello
 
print_loop:
    lodsb
    
    cmp al,0
    je change
 
    mov ah,0x0E
    int 0x10
    jmp print_loop
 
change:
    cld
    mov si,base_stage0
    mov di,base_stage1
    mov cx,446
    rep movsb
 
    jmp stage1
    
org base_stage1 + ($-$$)
stage1: 
    mov ax, part1_offset
    jmp prov
    
prov:
    mov si, ax
    cmp byte [si], 0x80
    je load_boot
    add ax, 0x10
    cmp ax, 0x7DFE
    je exit
    jmp prov
 
load_boot:
    mov ah,2    ; чтение секторов
    mov al,1    ; количество секторов
    mov bx, base_stage0 ; адрес буфера
    ;mov ch,0   ; младшие 8 бит номера цилиндра, начиная с 0
    ;mov cl,1   ; 6 бит номера сектора, начиная с 1, (в младших битах) и старшие 2 бита номера цилиндра
    mov cx, [si+2]
    mov dh,[si+1]   ; номер головки
    mov dl,0x80 ; номер диска, нумерация начинается с 0x80
    int 0x13
 
    jmp 0x7c00
exit:   
    hlt
hello db "Hello, World!",0x0D,0x0A,0
times 444-($-base_stage1) db 0
db 0x55,0xAA
0
08.10.2013, 17:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2013, 17:09
Помогаю со студенческими работами здесь

Свой mbr
Всем привет, знаю что есть куча тем по этому вопросу и тд, но я задам. Как таки записать свой...

Как писать mbr код?
Хочу написать значит прогу которая будет дропить мой .bin файл с mbr кодом в систему, планирую...

Документация по формату ELF для написания загрузчика
Я пишу загрузчик ELF(правда на СИ). И есть ли у кого документация ELF на русском. У меня есть...

Не получается передать управление программе из MBR
Доброго времени суток! Прошу вас помочь мне с проблемой в моем загрузочном секторе. Сам по себе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru