Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,318
Записей в блоге: 12

MBR и прочие радости жёсткого диска

30.06.2018, 16:48. Показов 8624. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Возникло несколько вопросов, но смежных (про геометрию жёстких дисков и загрузочные области), к тому же, предполагающих простые ответы, поэтому буду спрашивать в одной теме...

1. Все ли диски имеют 63 сектора на дорожке? Или бывает меньше?
2. Всегда ли между MBR и первым разделом расстояние минимум 63 сектора (т.е. 62 сектора между ними)? Или бывает меньше (в каких-то системах)?
3. Возможно ли установить винду на диск с размером сектора, не равным 512 байт (и вообще, встречаются ли такие жёсткие диски?)
4. Встречается ли между MBR и первым разделом не нулевые заполнители, а какие-либо другие (скажем, из символов 255 или в виде повторяющихся слов а-ля 0x8000)? Кроме секторов со служебными данными, естественно.
5. Можно ли установить и успешно загружать винду с USB, имеющим формат не HDD-USB, а FDD-USB, т.е. с boot-сектором в начале, а не MBR? Полагаю, что как минимум Win95/98 можно.
2
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2018, 16:48
Ответы с готовыми решениями:

Считывание MBR жесткого диска
Почитал тут одну статью http://www.realcoding.net/article/view/4241 Ради эксперимента решил написать прогу, которая считывает MBR и...

Вероятно, повредил MBR жёсткого диска
Испортился жёсткий диск MAXTOR STM3500320AS. При загрузке компьютер зависает на шаге инициализации этого диска. Если подождать минут...

HDD стал RAW и прочие неприятности жесткого диска
Добрый вечер всем) Прошу вашей помощи! Есть 2 диска - SSD 120 ГБ и жесткий диск 1 TB. На SSD Windows 7 x64 и браузер, в общем...

50
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,318
Записей в блоге: 12
05.07.2018, 08:41  [ТС]
Студворк — интернет-сервис помощи студентам
Ethereal, с чего ты взял, что я не хочу?
Как раз для этого свободный сектор и ищется, чтобы туда оригинал записать...
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
05.07.2018, 08:43
Если откатывать старый MBR назад в процессе отладки, то перед отладкой вручную сохрани старый MBR в последний сектор нулевой дорожки и для отката назад вручную его обратно копируй и все дела. Специально добавлять для этого дела чего-то в код MBR нет никакого смысла.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,318
Записей в блоге: 12
05.07.2018, 09:28  [ТС]
Ethereal,
Артур, речь вообще про отладку сейчас не идёт.

Схема такая.
Программа инсталляции ищет свободный (или свободные) сектор среди 1..62 (если считать с 0), т.е. состоящий из повторяющихся слов. В него записывает оригинальный MBR, на 0-й сектор – свой код (старый MBR не модифицируется, а перезаписывается, разве что partitoin table сохраняется, если надо). Если код длиннее 446 байт, остальной наш код записывается в остальные свободные сектора.
Загрузчик делает что ему надо и либо просто загружает оригинальный MBR, либо восстанавливает его и те самые "свободные сектора" в прежнее состояние.

Добавлено через 4 минуты
При этом инсталлятор должен не просто наивно сканировать сектора 1..62, но и проверить:
а) Режим работы прошивки: UEFI или legacy BIOS (ибо при UEFI эта затея бессмысленна). Да и вообще - содержит ли MBR какой-то код или состоит из нулей (хотя бы в начале).
б) Не является ли 0-й сектор на самом не MBR'ом, а boot-сектором (такое возможно при загрузке с флехи, отформатированной как USB-FDD).
в) Не начинается ли какой-либо из разделов раньше, чем с 63-го сектора.

Добавлено через 11 минут
Ещё навороты: если код нашей внедряемой программы очень большой (скажем, на 60 секторов), то для повышения успешности работы можно искать не только сектора с повторяющимися словами, но и сектора, в которых помимо повторяющихся слов есть ещё и несколько информационных (скажем, до 32-х или 64-х шт; алгоритм Бойера-Мура в помощь). Таким образом можно "сжать" сектор, содержащий 32 слова данных + повторяющиеся слова, по крайней мере, до 98 байт (вместо 512, т.е. "слово-заполнитель", "номер слова + само слово", "номер слова + само слово"...).
Хотя не знаю, насколько это практически целесообразно, т.к. лично у меня такой сектор только один и то на GPT.

Кстати, 7-ка и 10-ка (надо думать, что и 8-ка тоже) размечает диски таким образом, что у них первый раздел начинается аж с 2048-го сектора!
Не знаю, как в XP, можно проверить...

Добавлено через 9 минут
А вот на XP (смотрю под виртуалкой) почему-то первый раздел начинается аж с 56-го сектора! О как!
Так что, с такими делами нужно быть осторожнее:
Цитата Сообщение от Ethereal Посмотреть сообщение
сохрани старый MBR в последний сектор нулевой дорожки
(разве что действительно вручную это делать, чтобы видеть, что там не пусто)

Добавлено через 6 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
Нет никакого.
При форматировании (если не перезаписывать потом) сектора вроде как 0E6h заполняются же (источник). Так что действительно лучше рассчитывать на то, что заполнено может быть чем угодно.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
05.07.2018, 10:54
Ну так и сказал бы, что пишешь что-то наподобие загрузочного вируса
Так вот в былые времена, когда таковые размножались, не было у них алгоритма, который был бы корректен в любом случае. Заражение двумя разными вирусами одновременно могло приводить к тому, что диск переставал загружаться. Например, если оба вируса сохраняли оригинальный MBR в один и тот-же сектор, то загрузка зацикливалась. Так-что всегда закладывались на то, что алгоритмы будут работать в подавляющем большинстве случаев, но не всегда.

В твоем случае. Ну например так - сохранять предыдущий MBR в сектор 0-й дорожки, не входящий в первый раздел, и содержащий одни одинаковые байты. Если такового не найдено, то не заражать. Также не заражать, если диск заражен УЖЕ. Вот так выходит и просто в реализации и более-менее прилично.

Как ты собрался заражать USB-FDD я пока не понял. Критерий отличия MBR и бут-сектора простой и надежный не ясен. И сохранять предыдущую копию некуда. Бесхозных секторов-то уже нет.
Когда-то загрузочные вирусы, что заражали дискеты, копировали старый бут-сектор в самый последний сектор дискеты. Но если дискету заполняли файлами полностью, то этот сектор затирался и дискета становилась незагружаемой. То есть тут надежного алгоритма, работающего всегда, не было вообще. Некоторые вирусы для сохранения старого бут-сектора форматировли заграничную дорожку (41-ю или 81-ю) и сохраняли туда. Но к твоей задаче такая техника не подходит.

Короче, как заражать HDD более менее ясно, но как USB-FDD пока нет.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,318
Записей в блоге: 12
05.07.2018, 13:29  [ТС]
Собственно, наибольшую путаницу пока вносит тема с не-512-байтовыми секторами.
Не могу взять в толк, как с ними работать (тем более, что у меня нет таких примеров, а SSD показывает 512 как из-под DOS – ah=48h/int 13h, так и из-под винды: IOCTL_DISK_GET_DRIVE_GEOMETRY).

Т.е. что я получу, если запрошу сектор LBA 1 через ah=42h/int 13h (или через ah=2)?
Что я получу, если открою диск (PhysicalDrive) через CreateFile и прочту 512 байт, начиная со смещения 512?
Для диска с 4K-секторами, например.

Добавлено через 7 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
Ну так и сказал бы, что пишешь что-то наподобие загрузочного вируса
Не надо смуту вносить.
Ничего такого я не собираюсь делать (тем более, нынче это, ИМХО, не особо актуально... хотя WannaCry был недавно, но это не ко мне)!

Цитата Сообщение от Ethereal Посмотреть сообщение
Критерий отличия MBR и бут-сектора простой и надежный не ясен.
Записывать в boot-сектор я пока не планирую, ибо если человеку надо установить мою прогу, он сделает нормальный MBR-раздел (или UEFI, позже с ним разберусь, но уже в процессе).
Критерий у меня пока такой: первый байт EB или E9 (jmp short/near) + слово по смещению 0x0B = 200h (размер сектора) + partition table либо пуст, либо признак активности хотя бы одного из разделов != 0x80 (т.е. ([0x1BEh] or [0x1CEh] or [0x1DEh] or [0x1EEh]) and 0x7F != 0).
Пока не знаю, какие ещё признаки можно выделить. Есть идеи – делитесь!

Добавлено через 6 минут
Но тут, согласен, 100% гарантии тоже нет. И у MBR может быть jmp в начале (чтобы расположить свою сигнатуру, например, по смещению 2 или 3), и 200h может оказаться по смещению 0x0B, и таблица разделов пустой.
А boot-сектор можно и с call начать (хотя куда адрес возврата будет записан - х/з) или с какого-нибудь stc+jc и пр. Чисто для прикола!
1
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
06.07.2018, 00:58
Цитата Сообщение от Jin X Посмотреть сообщение
Как раз для этого свободный сектор и ищется, чтобы туда оригинал записать...
А чем для этих целей файл не угодил? Я категорически против хаков с поиском "свободных" секторов. Впрочем, как и большинство антивирусов.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
06.07.2018, 12:29
Цитата Сообщение от shmkv Посмотреть сообщение
А чем для этих целей файл не угодил?
В MBR вставить код работы с файловыми системами ?

Добавлено через 1 минуту
Цитата Сообщение от shmkv Посмотреть сообщение
Впрочем, как и большинство антивирусов.
Антивирусы что там в скрытых секторах даже не проверяют. Эти сектора не относятся ни к собственно MBR, ни к разделам диска, ни к файловым системам. Что там проверять-то, если эти сектора никому не нужны и никаким предопределенным образом не используются ? То есть они могут использоваться, да только заранее неизвестно каким образом и кем ? И антивирусу это тоже неизвестно.

Добавлено через 10 минут
Цитата Сообщение от shmkv Посмотреть сообщение
Я категорически против хаков с поиском "свободных" секторов.
Это не хаки. Код загрузчика в MBR не должен зависеть от того какие ОС загружает. Грязнейшим хаком будет как раз писать кодом MBR в файл, завязывая его на конкретную файловую систему. Тем более, что в случае наиболее распространенной и не имеющей в открытом доступе документации NTFS уже сама запись будет грязнейшей из грязных.
1
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
06.07.2018, 13:45
Цитата Сообщение от Ethereal Посмотреть сообщение
В MBR вставить код работы с файловыми системами ?
MBR должен заниматься именно тем, для чего предназначен - искать активный раздел и передавать его загрузчику управление.
Цитата Сообщение от Ethereal Посмотреть сообщение
Антивирусы что там в скрытых секторах даже не проверяют.
У меня другая информация.
Цитата Сообщение от Ethereal Посмотреть сообщение
Грязнейшим хаком будет как раз писать кодом MBR в файл, завязывая его на конкретную файловую систему.
Вообще-то тот же grub так и работает.

Добавлено через 39 секунд
Jin X, ты можешь описать задачу в целом?

Добавлено через 6 минут
Цитата Сообщение от shmkv Посмотреть сообщение
Вообще-то тот же grub так и работает.
Точнее не из MBR конечно, но работает с файлами для своих нужд.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
06.07.2018, 13:51
Цитата Сообщение от shmkv Посмотреть сообщение
MBR должен заниматься именно тем, для чего предназначен - искать активный раздел и передавать его загрузчику управление.
А выше ты порекомендовал MBR-у писать и читать какие-то файлы.
1
1378 / 522 / 72
Регистрация: 21.07.2015
Сообщений: 1,308
06.07.2018, 13:57
Цитата Сообщение от Ethereal Посмотреть сообщение
А выше ты порекомендовал MBR-у писать и читать какие-то файлы.
Я не предлагал это делать MBR'у. Я вообще не сторонник того, чтобы трогать MBR. Все зависит от задачи, если просто цель выполнить какой-то код до запуск ОС, то все может ограничиться просто настройкой штатного загрузчика ОС.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
06.07.2018, 14:14
Цитата Сообщение от shmkv Посмотреть сообщение
Вообще-то тот же grub так и работает.
А мы до этого выше нигде не замыкали задачу на спецификацию Multiboot. Говорили только про MBR, работающий сам по себе в любом случае.

Добавлено через 1 минуту
Цитата Сообщение от shmkv Посмотреть сообщение
Я не предлагал это делать MBR'у
Но мы то говорили про MBR и только про MBR. А тут вдруг бац и совет работать с файлами.

Добавлено через 2 минуты
Цитата Сообщение от shmkv Посмотреть сообщение
Я вообще не сторонник того, чтобы трогать MBR.
Но JinX собрался написать свой MBR. Насколько тут уместен совет MBR не трогать ? Ну за нитью разговора надо-же следить перед тем как советы давать.
Задачу его я не знаю. Но если ему нужен свой MBR, ну давайте говорить именно про это. Если бы была известна его задача, то тогда бы можно было подумать можно ли решить ее по другому.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,318
Записей в блоге: 12
06.07.2018, 18:17  [ТС]
Цитата Сообщение от shmkv Посмотреть сообщение
Я категорически против хаков с поиском "свободных" секторов.
Как говорят на горячих линиях: "Ваше мнение очень важно для нас, мы обязательно учтём его в дальнейшей работе"
А если серьёзно, то я тоже не очень понимаю, как ещё, помимо встраивания в MBR кода для работы с файловыми системами, можно ещё работать с файлами.
Если так делает grub, то флаг ему в руки, но это не самый простой и оптимальный путь. Но для grub'а это просто необходимо. И grub, насколько я понимаю, устанавливается на вновь размеченные диски, а не "внедряется" в уже существующую систему.

Цитата Сообщение от shmkv Посмотреть сообщение
Jin X, ты можешь описать задачу в целом?
До создания всех этих тем суть была в подмене MBR'а для запроса пароля на первичную загрузку. Некая лайтовая (то бишь от чайников) защита от несанкционированная доступа. Не будем обсуждать целесообразность сей затеи (ибо это было нужно не мне). Потом задача усложнилась, но сейчас уже актуальность в ней пропала (длинная история). Но интересные вопросы остались, хочется разобраться, докопаться и т.д. На будущее. Да и просто любопытно.
Ещё пример использования. Лет 15 назад (когда дискеты были ещё в ходу, а порядок загрузки менялся только в настройках BIOS'а, а не по нажатию клавиши после POST) я писал прогу, которая внедрялась в MBR и при удержании Ctrl (или другой клавиши) загружала систему с дискеты.

Цитата Сообщение от shmkv Посмотреть сообщение
Все зависит от задачи, если просто цель выполнить какой-то код до запуск ОС, то все может ограничиться просто настройкой штатного загрузчика ОС.
А учитывая, что различных загрузчиков море....
Ну вообще, задачи разные есть.

Но раз мы затронули эту темы, было бы интересно (т.к. я этим ещё не занимался, но интересно):
1. Как настроить загрузчик Windows (от NT до 10) так, чтобы он загружал и запускал наш код (из файла) до загрузки ядра? И будут ли ему доступны какие-либо функции, кроме BIOS'овских? И это будет а-ля DOS COM или ...что?
2. Как запустить нашу прогу (уже нормальный PE EXE с поддержкой WinAPI) после загрузки ядра Windows, но ещё до загрузки всего остального? Короче говоря, как загружается chkdsk при проверке системного раздела на ошибки.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
07.07.2018, 13:19
Лучший ответ Сообщение было отмечено Mikl___ как решение

Решение

Цитата Сообщение от shmkv Посмотреть сообщение
У меня другая информация.
Подумал, подумал и все равно не понял смысл этого действа. Предположим антивирус проверил MBR и не нашел вируса. Затем он зачем-то проверил скрытые сектора и обнаружил там ... к примеру вирус OneHalf. Что должен сделать антивирус ? Ответ только один - молчать. Ибо очевидно-же, что когда-то компьютер был заражен, а потом вылечен (сам MBR-то уже не содержит вируса), а ошметки OneHalf-а так и остались. И о чем тут кричать ? Ну а тогда вопрос - зачем проверять скрытые сектора, если что бы там ни было найдено, один хрен придется молчать ?
Цитата Сообщение от Jin X Посмотреть сообщение
До создания всех этих тем суть была в подмене MBR'а для запроса пароля на первичную загрузку.
У меня когда-то возникла потребность при загрузке одного из моих компов выбирать что грузить - Win-98 или FreeDos. Выбор был или разбираться как там ставить LILO или накидать что-то на скорую руку на ассемблере. И я накидал вот такой код MBR:
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
                MODEL   TINY
 
                .CODE
 
                ORG     100h
 
Start:          xor     ax, ax
                mov     si, 7C00h
                mov     ss, ax
                mov     sp, si
                sti
                mov     ds, ax
                mov     es, ax
                mov     di, 600h
                mov     cx, 100h
                cld
        rep     movsw
                mov     al, 3
                int     10h
                mov     si, 7C00h+(Menu-Start)
                call    Print                           ; CX not changed
                mov     ch, ds:7C00h+(Flag_98-Start)
                rol     ch, 1
                jmp     Next-7C00h+600h
 
Print:          lodsb
                test    al, al
                jz      return
                mov     ah, 0Eh
                int     10h
                jmp     short Print
 
Polos:          mov     ah, 8
                int     10h
                mov     bl, 7
                cmp     ch, dh
                je      @@1
                mov     bl, 70h
                cmp     dl, cl
                jb      @@1
                mov     bl, 30h
@@1:            push    cx
                mov     cx, 1
                mov     ah, 9
                int     10h
                pop     cx
                inc     dx
Poloska:        mov     bh, 0
                mov     ah, 2
                int     10h
                cmp     dl, 13
                jne     Polos
return:         retn
 
        ; ch = 0/1 DOS/98
        ; cl = pos
@@2:            cmp     bp, ds:46Ch
                jne     @@5
                mov     ah, 1
                int     16h
                jz      @@2
                mov     ah, 0
                int     16h
                cmp     al, 0Dh
                je      Choosen
                cmp     ah, 48h
                je      @@3
                cmp     ah, 50h
                jne     @@4
@@3:            xor     ch, 1
@@4:            mov     cl, 0
Next:           mov     dl, 0
                mov     dh, ch
                call    Poloska
                mov     dx, 100h
                xor     dh, ch
                call    Poloska
                mov     bl, 10
@@5:            mov     bp, ds:46Ch
                dec     bl
                jnz     @@2
                inc     cl
                cmp     cl, 14
                jne     Next
Choosen:        ror     ch, 1
                mov     bx, sp
                cmp     ch, ds:7C00h+(Flag_98-Start)
                je      Same
                mov     dx, 80h
                xor     ds:7C00h+(Flag_98-Start), dl
                xor     ds:7C00h+(Flag_DOS-Start), dl
                mov     cx, 1
                mov     ax, 301h
                int     13h
                jc      Error
Same:           mov     si, 7C00h+(Flag_98-Start)
                cmp     byte ptr [si], 0
                jne     @@6
                mov     si, 7C00h+(Flag_DOS-Start)
@@6:            mov     dx, [si]
                mov     cx, 2[si]
                mov     ax, 201h
                int     13h
                jc      Error
                cmp     word ptr ds:7DFEh, 0AA55h
                jne     Error
                jmp     Start-600h+7C00h
 
Error:          mov     si, 7C00h+(Text-Start)
                call    Print
                jmp     short $
 
Menu            db      'Windows 98 SE', 0Dh, 0Ah
                db      'Open DOS 7.01', 0
Text            db      ' MBR error', 0
                
                ORG     2BEh
 
Flag_98         db      80h                     ; 0/80 = not_active/active
                db      0                       ; Start: Head
                dw      8301h                   ; Start: Cylinder/Sector
                db      0Ch                     ; System
                db      254                     ; End: Head
                dw      0BFh                    ; End: Cylinder/Sector
                dd      201CC3h                 ; Beginning relative sector
                dd      930C7FEh                ; Size (total sectors)
 
                db      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
                db      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 
Flag_DOS        db      0                       ; 0/80 = not_active/active
                db      1                       ; Start: Head
                dw      1                       ; Start: Cylinder/Sector
                db      6                       ; System
                db      254                     ; End: Head
                dw      823Fh                   ; End: Cylinder/Sector
                dd      63                      ; Beginning relative sector
                dd      201C84h                 ; Size (total sectors)
 
                db      55h, 0AAh
 
                END     Start
Решение не универсальное, но мне нужно было сделать мультизагрузку на одном единственном компе и я сделал.

Добавлено через 12 минут
Посмотрел сейчас свежим взглядом этот мой старый код, а там ошибка. Если бут-сектор подчитан с адреса 7С00h, то сообщения об ошибке по адресу 7C00h+(Text-Start) уже нет, оно затерто. Надо было написать 600h+(Text-Start) и брать его из копии MBR в памяти, а не из уже затертого оригинала.

Добавлено через 1 час 7 минут
Там в коде есть такие фишки. Чтобы передавать управление от оригинала MBR к его копии и от копии к бут-сектору не обязательно использовать дальние переходы. Можно ближние. У ближнего перехода относительная адресация и jmp метка порождает в коде команды E9 jmp near смещение перехода равное (адрес_метки - адрес_следующего_байта_за_jmp). Но к этому смещению можно вручную прибавлять абсолютные значения. Так-что jmp Next-7C00h+600h прыгнет из оригинала MBR лежащего с адреса 7С00h на метку Next, но уже не в оригинале, а в его копии, лежащей с адреса 600h. Поскольку смещение перехода будет принудительно поправлено на -7600h
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,318
Записей в блоге: 12
07.07.2018, 14:55  [ТС]
fasm/NASM в этом плане удобнее.
Можно написать jmp 0x7C00 и всё

TASM/MASM такого не позволит. Хотя можно написать:
Assembler
1
2
3
4
        jmp start
        . . .
        org 7C00h
start:
Но просто бинарник (читай .COM) с org 600h всё равно не напишешь.
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
07.07.2018, 15:15
Цитата Сообщение от Jin X Посмотреть сообщение
fasm/NASM в этом плане удобнее.
А когда это писалось я еще не слышал про эти ассемблеры. Может их тогда и вовсе не было. Но вот сделал морду клином и написал на TASM-е COM-файл такой, чтобы двоично вышел один в один, что твой сектор MBR
1
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
07.07.2018, 15:19
Цитата Сообщение от Jin X Посмотреть сообщение
Но просто бинарник (читай .COM) с org 600h всё равно не напишешь.
в MASM - без проблем. Выдаст варнинг, но файл создаст.
Assembling: 1.asm

Start Stop Length Name Class
00000H 00613H 00614H _TEXT CODE
00614H 00614H 00000H _DATA DATA

Origin Group
0000:0 DGROUP

Program entry point at 0000:0600
LINK : warning L4055: start address not equal to 0x100 for /TINY
1
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
07.07.2018, 16:02
У fasm-а неудобнее в другом месте. org смещение не даст заполнения образа кода нулями от верхушки уже накомпилированного образа вплоть до этого смещения. То, что после org пристыковывается в образе кода к тому, что было до. То есть у TASM-а и FASM-а org-и имеют разный смысл. И я не нашел как в FASM-е сделать org по TASM-овски. Самое простое - как в FASM-е поместить 55 AA в конец 512-байтной области не мучаясь указанием сколько именно заполнителя потребуется перед 55 AA ? А если и указывать, то раз до этого уже были использованы org 0x7C00 и org 0x600 получится какое-то кошмарное выражение. В котором надо будет сложить сколько кода накомпилировалось после org 0x7C00, сколько после org 0x600. Так-что TASM<->FASM нос вылез, хвост увяз ...

Добавлено через 15 минут
В отличие от директивы ORG, применяемой MASM-совместимыми ассемблерами, которые позволяют перемещаться в объектном файле и переписывать уже сгенерированный код, NASM-овская ORG означает только то, что и соответствующее слово: origin (начало). Ее единственная функция — задавать смещение, которое будет прибавляться ко всем ссылкам на адреса внутри файла
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,318
Записей в блоге: 12
07.07.2018, 18:37  [ТС]
Цитата Сообщение от Ethereal Посмотреть сообщение
А когда это писалось я еще не слышал про эти ассемблеры.
Ну да, я тогда тоже писал как раз под TASM

Цитата Сообщение от Argogo Посмотреть сообщение
в MASM - без проблем. Выдаст варнинг, но файл создаст.
Ну это EXE всё-таки, наверное. А потом exe2bin.

Цитата Сообщение от Ethereal Посмотреть сообщение
У fasm-а неудобнее в другом месте. org смещение не даст заполнения образа кода нулями от верхушки уже накомпилированного образа вплоть до этого смещения.
Ну это легко решается:
Assembler
1
2
3
4
org 0x600
end600:
org 0x700
times ($-end600) db 0  ; или rb $-end600, если дальше что-то будет
Добавлено через 47 секунд
Цитата Сообщение от Ethereal Посмотреть сообщение
Самое простое - как в FASM-е поместить 55 AA в конец 512-байтной области не мучаясь указанием сколько именно заполнителя потребуется перед 55 AA ?
Обычно пишут так:
Assembler
1
2
rb 510-($-$$)  ; $$ - это адрес начала
db 0x55, 0xAA
Добавлено через 5 минут
Цитата Сообщение от Ethereal Посмотреть сообщение
А если и указывать, то раз до этого уже были использованы org 0x7C00 и org 0x600 получится какое-то кошмарное выражение.
Если мы делаем в самом начале копирование в 0x600, то смысла указывать org 0x7C00 в начале нет, пишем сразу org 0x600 и всё. Ну или как-то так:
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
format  binary
 
                org     0x600
        start:
                org     0x7C00
                xor     ax,ax
                mov     ss,ax
                mov     sp,0x7C00
                mov     ds,ax
                mov     es,ax
                mov     cx,512/2
                mov     si,sp
                mov     di,0x600
                cld
                rep movsw
                jmp     0:main
 
                org     0x600+($-$$)
        main:
 
                jmp     $
 
                rb      510-($-start)
                db      0x55,0xAA
В любом случае всё несложно делается
1
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
07.07.2018, 21:28
Цитата Сообщение от Jin X Посмотреть сообщение
Ну это EXE всё-таки, наверное. А потом exe2bin.
неа, сом как есть.
Assembler
1
2
3
4
5
6
7
8
9
.MODEL TINY
.CODE
        org     600h
Begin   PROC    NEAR
        mov     ax, offset aStr
        jmp     $
Begin   ENDP
aStr    db      'something here', 0
    END BEGIN
Батник для компиляции:
Code
1
2
ml /AT /Fl%1.LST /nologo /c /Cp /Cx %1.asm>build.txt
link /TINY /NOL /NOI %1.obj,%1.BIN,con;>>build.txt

вывод при компиляции (build.txt):
Assembling: 1.asm

Start Stop Length Name Class
00000H 00613H 00614H _TEXT CODE
00614H 00614H 00000H _DATA DATA

Origin Group
0000:0 DGROUP

Program entry point at 0000:0600
LINK : warning L4055: start address not equal to 0x100 for /TINY
архив бинарника: 1.zip
версия масм - 6.11
2
780 / 412 / 75
Регистрация: 29.03.2013
Сообщений: 854
07.07.2018, 21:32
Ах, да, листинг: 1 (2).zip
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.07.2018, 21:32

Smartsputnik и прочие прилагаемые радости
Всем привет! Удалил программу time task через безопасный режим, но что делать дальше? Лог прилагаю

Куча была повреждена и прочие радости
В каждом байте BMP изображения программа подменяет последние несколько бит на биты какого-то файла (отдельно есть алгоритм, извлекающий эту...

DOS виснет на int 13h при чтении MBR жесткого диска
читаю MBR жесткого диска, досю гружу с флешки, как доходит до инт 13 - встает. masm .model small .stack 256 .data mboot db 512...

Можно ли восстановить файлы после изменения таблицы раздела жёсткого диска с MBR в GPT?
Можно ли восстановить файлы, после изменения таблицы раздела жёсткого диска с MBR в GPT? При установки Windows 10, Windows 10...

Ремонт логической "части" жёсткого диска, перезапись MBR и восстановление Partition Table
Здравствуйте! Тема, созданная мною, не нова, и я это прекрасно понимаю. По-этому, хочу сразу объяснить цель её создания: во-первых,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru