Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.02.2016, 19:58   #11
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Это всё зависит от компилятора, транслятора, линкера.
Вам надо собрать COM файл без включения сторонних библиотек. Читаете, думаете, пробовать.
Далее делаете простой загрузчик COM или EXE-MZ и запуск как описано у Абеля в главе 22.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 29.02.2016, 20:03   #12
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Вот к примеру туторил близкий к вашей задаче:
https://habrahabr.ru/post/173705/
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 29.02.2016, 20:07   #13
timcryt
Форумчанин
 
Регистрация: 25.01.2016
Сообщений: 105
По умолчанию

Хорошо, тогда буду писать и ядро на ассемблере
timcryt вне форума Ответить с цитированием
Старый 02.03.2016, 22:27   #14
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

timcryt, советую писать сразу нормальный загрузчик, чтоб он нёс в себе хоть-какую-то информацию, типа что происходит на данный момент. Но это уже на-усмотрение...
Чтоб иметь чёткую картинку, сначала разберёмся с адресами:

Цитата:
Код:
 
 Бут-сектор флопа: дорожка(0), строна(0), сектор(1) =======
 ==========================================================
 +----------+--------------+------------------------+
 | Смещение |    Длина     |      Комментарии       |
 +----------+--------------+------------------------+
 |  0000h   ¦  3           |  JMP на код загрузчика |
 +----------+--------------+------------------------+
 |  0003h   ¦  3Ah (58)    |  параметры дискеты     |
 +----------+--------------+------------------------+
 |  003Eh   ¦  1C0h (448)  |  код загрузчика        |
 +----------+--------------+------------------------+
 |  01FEh   ¦  2           |  бут-флаг  55AAh       |
 +----------+--------------+------------------------+

 Память в реальном режиме =================================
 ==========================================================
   0:0000 - 0:05FF        используется BIOS (1.536)
   0:0600 - 0:7BFF        свободно (30.208)
   0:7C00 - 0:7DFF        программа начальной загрузки (512)
   0:7E00 - 9FFF:F        свободно (623.104)
   A000:0 - FFFF:F        используется BIOS (393.216)
Формат бут-сектора как-таковой нам не нужен, ..мы перезапишем его полностью. А вот на карту памяти - нужно обратить особое внимание. После того, как биос скопировал бут дискеты в [0:7С00h], пред нами встают такие задачи:

1. Сбросить в нуль все сегментные регистры (ES/DS/SS).
2. Если код загрузчика будет юзать стек, то надо с ним определиться и указать в регистре(SP). Если стек загрузчику не нужен, то этот пункт можно пропустить.
3. Вывести мессагу, что бут-сектор на месте, и что приступаем к загрузке ОС.
4. При чтении оски с дискеты (INT-13h), нужно повторять операцию чтения пару/раз, т.к. с первого раза флоп может не считать сектор, а мы будем косить на криво/написаный код ОС.

Это типичные задачи примитивного загрузчика. Вот собственно его код на FASM'е:

Загрузчик в бут-секторе дискеты:

Код:
use16
org 7C00h
jmp  start

mess0   db  ' READ BOOT-SECTOR: OK!',13,10
        db  '  L - load OS',13,10
        db  '  R - reboot'
mess1   db  ' Loading "DEMO-OS v0.1"....'
error   db  ' ERROR!'

start:
; сегментные регистры в нуль, и устанавливаем стек
   cli
   xor   ax,ax
   mov   ds,ax
   mov   es,ax
   mov   ss,ax
   mov   sp,7C00h               ; стек нужен для CALL/RET
   sti

; ставим режим 80х25 и убираем курсор
   mov   ax,3
   int   10h
   mov   ah,1
   mov   ch,20h
   int   10h

; выводим мессагу, что мы по-адресу 0:7C00h
   mov   bp,mess0
   xor   dx,dx                   ; позиция строки в окне
   mov   cx,51                   ; её длина
   call  printStr

; ждём дальнейших указаний...
@@:
   xor   ax,ax
   int   16h
   cmp   al,'L'
   je    @loading
   cmp   al,'R'
   je    @reboot
   jmp   @b

; переходим к загрузки ОС из сектора(2) флопа..
@loading:
   mov   bp,mess1
   mov   dx,1419h
   mov   cx,27
   call  printStr

   mov   bp,3                 ; счётчик попыток чтения сектора
   mov   al,1                 ; считать 1 сектор,
   mov   bx,600h              ;    ..на адрес 0:0600h (см.карту памяти выше)
   mov   cx,2                 ; номер сектора для чтения
   xor   dx,dx                ; головка/диск = нуль
@@:                           ;
   mov   ah,2                 ; считать сектор!
   int   13h                  ;
   jnc   @ok                  ; ОК, если нет ошибки
   dec   bp                   ; иначе: уменьшаем счётчик попыток
   jz    @error               ; три попытки - ERROR!
   xor   ah,ah                ; иначе: сброс контролёра флопа
   int   13h                  ;
   jmp   @b                   ; сл.попытка..

; считали ОС! передаём ей управление!
@ok:
   jmp   600h

; мессага обработчика ошибки и ребут
@error:
   mov   bp,error
   mov   dx,1623h
   mov   cx,7
   call  printStr
   xor   ax,ax
   int   16h
@reboot:
   int   19h

;=========== функция вывода сообщений ======================
printStr:
  mov   bx,0Fh
  mov   ax,1301h
  int   10h
ret
После компиляции этого кода (F9 в FASM'e) получили бинарник. Код загрузчика готов!
Запомним, что он передаёт управление на адрес 600h. Теперь нужно записать этот загрузчик в бут дискеты...
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 02.03.2016, 22:28   #15
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Запись загрузчика на дискету

Для записи подойдёт любой HEX-редактор, который может работать с дисками.
Я использовал HxD. Открываю в нём флоп и полученый бинарник. В окне бинарника копирую весь код в буфер, и установив в окне флопа курсор в ноль, жму [Ctrl+B]. Оставшееся пространство до адреса 200h забиваю нулями и вставляю в конце сектора сигнатуру 55АА. Всё! Наш лоадер благополучно расположился на дискете! Жмём [Ctrl+S] и флоп начинает мучительно записывать изменения на диск.

Через 2-3 минуты можно протестить загрузчик в боевых условиях, загрузившись под эмулятором или из-под чистого доса (int-13 однако). У меня стоит "Microsoft Virtual PC", который прекрассно отрабатываем дисковый сервис.

Теперь сама ОС..

Я не буду ничё мудрить, а просто выведу мигающее сообщение, что ОС благополучно загружена. Это сообщение будет означать, что мы всё сделали правильно и нигде не напортачили..

Код:
use16
org 600h                     ; нас ждут по адресу 0:0600h
jmp start

mess0   db  '*********] DEMO-OS v0.1 [*********'

start:
; сегментные регистры в нуль, и устанавливаем стэк
   cli
   xor   ax,ax
   mov   ds,ax
   mov   es,ax
   mov   ss,ax
   mov   sp,600h             ; стек растёт к младшим адресам (сверху/вниз) 
   sti                       ;  ..поэтому не затерёт наше тело

; выводим по-середине экрана мигающую/красную мессагу 
   mov   si,10               ; кол-во повторов
@@:
   mov   ax,3                ; очистим экран
   int   10h
   mov   ah,1                ; уберём курсор
   mov   ch,20h
   int   10h
   call  Delay               ; задержка 1 сек
   mov   bp,mess0            ; мессага
   mov   dh,11               ; строка
   mov   dl,23               ; столбец
   mov   cx,34               ; длина строки
   mov   bx,0Ch              ; атрибуты текста
   mov   ax,1301h            ; fn 13
   int   10h
   call  Delay               ; задержка 1 сек
   dec   si                  ; повторили 10 раз?
   jz    @exit
   jmp   @b
@exit:
   xor   ax,ax               ; ребут по-клавише...
   int   16h
@reboot:
   int   19h

;нннннннннннннннннннннннннннннннннннннннннннннннннннннннннннн
; таймер. читаем секунду в цикле ===========================
Delay:
   mov   ax,0200h
   int   1Ah
   add   dh,1                 ; sleep на 1 секунду
   cmp   dh,59h
   jnbe  correct
   mov   bl,dh
   jmp   timer
correct:
   sub   dh,59h
   mov   bl,dh
timer:
   mov   ax,0200h
   int   1Ah
   cmp   dh,bl
   jge   endTimer
   jmp   timer
endTimer:
ret
Вот и оска готова! Получили ещё один бинарник, который (как и лоадер) нужно записать на флоп. Открываем их в HxD, ставим курсор по-адресу 200h в окне флопа и жмём [Ctrl+B]. Пространство до адреса 400h забиваем нулями и сохраняем изменения по [Ctrl+S].
Загружаемся с дискеты и радуемся жизни!
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 03.03.2016, 06:29   #16
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Формат бут-сектора как-таковой нам не нужен, ..мы перезапишем его полностью.
???
Он нужен БИОСу. Мягкие диски имеют такую вещь, как низкоуровневое форматирование. Поэтому БИОС считывает её логическую структуру с первого сектора. Если её выкинуть, то биос не сможет правильно читать диски.
А также обязательным является признак загрузчика 55AAh. Если его нет, то БИОС просит вставить другой диск. Вы просто несможете загрузиться.

Цитата:
Код:
; ставим режим 80х25 и убираем курсор
   mov   ax,3
   int   10h
Этот код лучше засунуть в ядро. Хотя сейчас не принципиально. Ещё до выполнения загрузки с дискеты БИОС в зависимости от установленного монитора и видео адаптера выбирает работающий видеорежим и устанавливает его. А после когда аппаратура достигла возможности объединить CGA и VGA в один адаптер - EGA/VGA конечно уже отпала необходимость делать проверку, и можно ставить любой видео режим.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 03.03.2016 в 07:14.
Pavia вне форума Ответить с цитированием
Старый 03.03.2016, 08:14   #17
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Он нужен БИОСу
..биосу он по-барабану. Он нужен файловой системе.
Бивису нужна только загрузочная сигнатура и всё. А чё там дальше - пусть разбирается ОС.
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 03.03.2016, 08:23   #18
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

После компиляции загрузчика получаем такой сектор, который можно записать на дискету и загрузиться с неё. В дампе только загрузчик, а остальное забито нулями и вставлена загрузочная сигнатура:

Код:
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  EB 55 20 52 45 41 44 20 42 4F 4F 54 2D 53 45 43  лU READ BOOT-SEC
00000010  54 4F 52 3A 20 4F 4B 21 0D 0A 20 20 4C 20 2D 20  TOR: OK!..  L - 
00000020  6C 6F 61 64 20 4F 53 0D 0A 20 20 52 20 2D 20 72  load OS..  R - r
00000030  65 62 6F 6F 74 20 4C 6F 61 64 69 6E 67 20 22 44  eboot Loading "D
00000040  45 4D 4F 2D 4F 53 20 76 30 2E 31 22 2E 2E 2E 2E  EMO-OS v0.1"....
00000050  20 45 52 52 4F 52 21 FA 31 C0 8E D8 8E C0 8E D0   ERROR!ъ1АЋШЋАЋР
00000060  BC 00 7C FB B8 03 00 CD 10 B4 01 B5 20 CD 10 BD  ј.|ыё..Н.ґ.µ Н.Ѕ
00000070  02 7C 31 D2 B9 33 00 E8 4D 00 31 C0 CD 16 3C 4C  .|1Т№3.иM.1АН.<L
00000080  74 06 3C 52 74 3D EB F2 BD 35 7C BA 19 14 B9 1B  t.<Rt=лтЅ5|є..№.
00000090  00 E8 33 00 BD 03 00 B0 01 BB 00 06 B9 02 00 31  .и3.Ѕ..°.»..№..1
000000A0  D2 B4 02 CD 13 73 09 4D 74 09 30 E4 CD 13 EB F1  Тґ.Н.s.Mt.0дН.лс
000000B0  E9 4D 89 BD 50 7C BA 23 16 B9 07 00 E8 08 00 31  йM‰ЅP|є#.№..и..1
000000C0  C0 CD 16 31 D2 CD 18 BB 0F 00 B8 01 13 CD 10 C3  АН.1ТН.»..ё..Н.Г
000000D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000000F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000100  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000110  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000120  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000130  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000140  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000150  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000160  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000170  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000180  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00000190  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
000001F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA  ..............UЄ
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Старый 03.03.2016, 10:01   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Он нужен БИОСу.
вы с UEFI не путайте.
биосу нужна лишь загрузочная метка.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.03.2016, 18:45   #20
ВТА
Новичок
Джуниор
 
Регистрация: 20.03.2016
Сообщений: 5
По умолчанию

Добрый вечер.
Нужна помощь специалиста.
Есть 2 программы с расширением .s19
Нужно немного изменить.
За деньги.
ВТА вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь в разработке! Шибанов Антон Gamedev - cоздание игр: Unity, OpenGL, DirectX 10 20.05.2015 12:11
Предложение по разработке российской ОС VAST Свободное общение 39 12.05.2010 08:41
Проблемы при разработке Ivan_32 Свободное общение 8 13.04.2010 12:45
помогите в разработке shkipper Общие вопросы по Java, Java SE, Kotlin 5 08.04.2009 02:32