Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/163: Рейтинг темы: голосов - 163, средняя оценка - 4.90
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101

Своя ОС для чайника

09.01.2010, 22:16. Показов 35590. Ответов 81

Студворк — интернет-сервис помощи студентам
Хочу написать свою ОС на асме. Самую простую. Единственное, что она должна уметь: загружаться с неё, открывать файлы (проводник) пускай консольный или еще какой. Но нужно, чтобы скажем если установлены некоторые программы, то с этой ОС можно было бы найти екзешник и его запустить. Если и это сложно, то хотя бы чтобы по нажатию клавиши открывалась любая заведомо установленная программа. Нашел-написал это MyOS.rar Я не претендую написать полноценную ОС. Просто пример.

Там в архиве готовая ОС. Но я не могу разобраться как её скомпилировать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.01.2010, 22:16
Ответы с готовыми решениями:

Использование модификатора ref для ссылок на объекты (для чайника)
Всем привет! Изучаю c# по учебнику Шилдта, также разбираю примеры из него. Из примера ниже мне непонятно. Зачем здесь использовать...

ДК для чайника
Мой друг попросил меня помочь ему подобрать ДК 5.1, но не по отдельности, а как говориться в "одной коробке". Его интересует...

QT для чайника
Хочу выучить QT, можете дать примеры программ (на уровень чайник в QT)

81
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 00:35
Цитата Сообщение от galileopro Посмотреть сообщение
если установлены некоторые программы, то с этой ОС можно было бы найти екзешник и его запустить.
Вот для этого нужно будет изучать устройство файловой системы FAT12, разбираться как там хранятся файлы, к тому же если запускать какую-то программу, то придется писать свои аналоги для системных вызовов int 21h и прочее, неговоря уже о том, чтобы разбираться с самим форматом exe...
Иными словами, я так полагаю можно ограничится программами-процедурами, которые встроить прямо в ядро, а если потребуется что-то записывать на диск, то некоторое подобие файловой системы.

Компилироваться, по идее, код должен как обычная com программа, правда в начале кода, который в архиве, стоит .model small... Кроме того, т.к. загрузчик биоса поместит код по аддресу 0000:7c00, то должна быть директива org 7c00h в начале кода.
2
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 00:43  [ТС]
А сделать просто возможность открытия экзешника по его пути? Это тоже надо с форматом разбираться, да? И еще выделение памяти и еще файловая система? Ну вот в том архиве должна быть рабочая ОС. Как мне её на дискету записать? И что она умеет? (Я читал тот текстовик долго, но насчет работы её с файловой системой ничго не понял)
Скажем открыть сапера (winmine.exe) - это очень сложно?
0
 Аватар для Андрей Борисови
714 / 402 / 33
Регистрация: 04.10.2009
Сообщений: 1,686
10.01.2010, 00:46
Возмите за основу:
http://ru.wikipedia.org/wiki/KolibriOS
http://www.kolibrios.org/

она тоже на ассемлере (говорят)
1
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 00:51
Цитата Сообщение от galileopro Посмотреть сообщение
А сделать просто возможность открытия экзешника по его пути? Это тоже надо с форматом разбираться, да? И еще выделение памяти и еще файловая система?
Да. Это нужно не так и мало сидеть, если писать и разбираться самому. А про
Цитата Сообщение от galileopro Посмотреть сообщение
Скажем открыть сапера (winmine.exe)
можно даже и не мечтать ибо он еще и вин апи использует.

Цитата Сообщение от galileopro Посмотреть сообщение
Как мне её на дискету записать?
Для начала скомпилировать, потом получившийся код записать на дискету, причем не кинуть в проводнике, а либо спец программами(как-то забыл названия ), либо просто редактором типа WinHex'a.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 00:51  [ТС]
Это сложно. И я же не претендую написать хорошую ОС. Нужно как-бы пример. Ну вот самое простое, что можно сделать за 2-3 недели. Если с файловой системой работа на асме сложная может как-то чистый С использовать?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 00:51
Цитата Сообщение от Андрей Борисови Посмотреть сообщение
Возмите за основу:
Однако за основу брать ее это будет шибко круто
Есть такой сборник AsmWorld. В нем в числе прочих статей есть и несколько самопальнх ОС.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 00:56  [ТС]
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Однако за основу брать ее это будет шибко круто
Да. Я не против посидеть с этим, но времени нету. Да и смысл. Потратить пару лет на свою ОС. Зачем?
Ну вот а экзешник досовский сложно запустить?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 01:01
Вам придется разбираться с его MZ заголовком... Но это еще ничего. Хуже всего, что придется делать свои аналоги для функций доса (хотя бы даже int 21h), которые эта программа вызывает, а их очень даже не мало может быть. Единственное, что реально, это попробовать запускать com программу, вами же и написанную, у которой заранее известно, что используется.
Либо, делать программы специально для вашей ОС, что вроде как правильнее

Да. Я не против посидеть с этим, но времени нету. Да и смысл. Потратить пару лет на свою ОС. Зачем?
Собственно эта ОС уже гораздо больше 2 лет развивается....
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 01:18  [ТС]
Хорошо. Остановимся на варианте использовать чьё-то. Допустим тот файл асмовский из архива не компилируется. Говорит D:\5.asm(1) : error A2088: END directive required at end of file
Причем если я добавляю в конце END ничего не меняется.(
Как вариант можно попробовать заюзать C# http://www.sharpos.org/doku.php Но пока достаточно того исходника.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 01:27
Впринципе, у меня скомпилировалось масмом, после того, как я поправил все вызовы вроде
Assembler
1
2
3
PresKey PROC   
...
PresKey ENDP
и еще несколько мелких ошибок.
Но запускать не буду...
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 01:36  [ТС]
А можете кинуть исходник и екзешник? Я попробую на дискету записать и попробовать.

Добавлено через 27 секунд
Я вроде все поисправлял, но оно не видит конец файла.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 01:44
вот.
Вложения
Тип файла: rar com.rar (5.6 Кб, 182 просмотров)
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 02:03  [ТС]
Спасибо. Нужно перебирать код. Не загрузилось ничего. Кстати там можно не .com а ехе использовать?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 02:08
Цитата Сообщение от galileopro Посмотреть сообщение
Кстати там можно не .com а ехе использовать?
Зачем ? Вам нужен чистый код без всяких заголовков и прочего. Самый простой способ получить его на масме - это com программа.
Наверно еще стоит сказать, что биос грузит в память только 1 сектор т.е. 512 байт. Остальное нужно догружать в вашем коде с помощью int 13h.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 02:38  [ТС]
Спасибо за помощь. Итак САМОЕ простое. Загрузиться из нашей ОС и вывести на экран буковку А:
загрузочный сектор
Assembler
1
2
3
4
5
6
7
8
9
entry start
    start:
        mov ax,#0xb800
        mov es,ax
        seg es
        mov [0],#0x41
     seg es
        mov [1],#0x1f
    loop1: jmp loop1
Копирование в первый сектор дискеты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <sys/types.h> /* unistd.h needs this */
    #include <unistd.h>    /* contains read/write */
    #include <fcntl.h>
 
 int main()
    {
        char boot_buf[512];
        int floppy_desc, file_desc;
 
       file_desc = open("./boot", O_RDONLY);
       read(file_desc, boot_buf, 510);
       close(file_desc);
 
       boot_buf[510] = 0x55;
       boot_buf[511] = 0xaa;
 
       floppy_desc = open("/dev/fd0", O_RDWR);
       lseek(floppy_desc, 0, SEEK_CUR);
       write(floppy_desc, boot_buf, 512);
       close(floppy_desc);
    }
Должно вывести буковку А. Но не выводит(
Для создания исполняемых файлов вам нужно выполнить следующие команды:
as86 boot.s -o boot.o
ld86 -d boot.o -o boot
cc write.c -o write
Добавлено через 22 минуты
Он вообще ни масмом ни тасмом это не компилирует.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 03:35
Цитата Сообщение от galileopro Посмотреть сообщение
Он вообще ни масмом ни тасмом это не компилирует.
Что именно ?
Тот код, что в посте #16, вообще-то для линукса...
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 11:51  [ТС]
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Что именно ?
Тот код, что в посте #16, вообще-то для линукса...
Вот-вот. То, что на С компилирует, а на асме нет. Ну тот код на сях не нужен. Можно воспользоваться утилитой RawWrite, а вот асм...
Выдрал у Пирогова кусок кода (http://lib.mexmat.ru/books/15302 стр. 246) Не знаю почему, но он ничего не читает. Просто грузится винда.
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
.data
buff DB 512 DUP(?)
.stack
STT DW 40 DUP(?)
.code
BEGIN:
mov ax,data
mov ds,ax
mov es, ax
mov ax, stt
mov ss,ax
lea bx,ds:buff
mov ax,0201H
mov DX,080H
mov cx,0001H
int13h
movdh, DS:buff[1BFH]
mov cx,word ptr ds:buff[1COH]
int 13h
mov byte ptr DS:buff[3+8],'$'
mov dx,bx
add dx,3
mov ah,9
int 21h
KON:
mov ah, 4ch
int 21h
code ends
.end BEGIN
Вообщем задача написать ОС свелась к задаче написать свой загрузочный сектор. С дискеты загрузится и вывести "Здравствуй мир".
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 12:08
Это вообще к чему ?? Какой-то екзешник...
Цитата Сообщение от galileopro Посмотреть сообщение
что на С компилирует, а на асме нет.
На линуксе свой ассемблер...

Есть вот такая заготовка...
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
.model tiny
.code
.686p
org 7c00h ; Место, куда нас загрузят
start:
    jmp init
 
;===========================
;        Данные
;===========================
szBoot              db "Booting GoodwinOS"
szInvalidCommand    db  "Invalid command or programm.",0dh,0ah
; Позиция курсора
cursor   dw 0
buff_len    db 0
buff    db 256 DUP(?)
 
;===========================
;        Код
;===========================
init:
    ; очистка экрана
    mov  ax,3
    int  10h
 
    ; иинициализация RM-сегментов и стека
    mov  ax, cs
    mov  ds, ax
    mov  es, ax
    mov  ss, ax
    lea  sp, start
 
    ; сие безобразие никак не умещается в пределы одного сектора (512 байт)...
    ; поэтому подгрузим остальные сектора в память
    mov  ah, 2  ; AH = Function                          : Read sectors
    mov  al, 10 ; AL = Number of sectors to read (1-128) : 10 ( с запасом ;-) )
    xor  ch, ch ; CH = Cylinder number (0-1023)          : 0
    mov  cl, 2  ; CL = Sector number (1-17)              : 2
    xor  dx, dx ; DH = Head number (0-15)                : 0
                ; DL = Drive number (0-A:, 1-B:)         : 0 (A:)
    lea  bx, start + 512
    int  13h
    jnc  continue_loading
 
    ; ошибка чтения. покажем сообщение и грохнем процессор
    jmp display_read_error
read_error db 'R',7, 'e',7, 'a',7, 'd',7, ' ',7, 'e',7, 'r',7, 'r',7, 'o',7, 'r',7
read_err_l dw $-read_error
display_read_error:
    mov  ax, 0B800h
    mov  es, ax
    xor  di, di
    lea  si, read_error
    mov  cx, word ptr[read_err_l]
    rep  movsb
    jmp  $
 
 
endsec:
db 510-(endsec-start)DUP(?)
db 055h, 0aah
 
    ; чтение успешно, продолжаем иницилизацию
continue_loading:
    xor dx,dx
    mov ah,01h
    mov ch,20h ; Убираем курсор
    int 10h
    
    mov bp, offset szBoot
    mov bx,7
    mov cx, sizeof szBoot
    mov ax,1301h
    int 10h
    mov ah,0ah
 
    mov al,'.'
    xor cx,cx
    
@@newdot:
    int 10h
    
    call pause
    
    inc cx
    cmp cx,20
    jnz @@newdot
    
    mov ah,01h
    mov cx,1e1fh ; делаем курсор обратно
    int 10h
    
    call cls
    
; тут начинается работа с ком строкой
input:  ; вывод приглашения
    mov ax,0e3EH
    int 10h
    xor cx,cx
    inc cx
inkey:  ; прием следующей клавищи
    xor ah,ah
    int 16h
    test al,al  ; обычный или расширеный?
    jnz literal ; расширеные пока не принимаем
    
    jmp inkey
literal:    ; обычный
    cmp al,0dh  ; то был ентер ?
    jz  command
    
    cmp al,08h
    jnz @f
    ; backspace
    cmp [buff_len],0 ; а что-нибудь есть вообще?
    jz inkey
    
    mov ah,0eh
    mov bh,0
    int 10h
    mov ah,0ah
    mov al,' '
    int 10h
    
    dec [buff_len]
    dec [cursor]
    jmp inkey
    
@@:
 
    mov si,offset buff
    movzx bx,[buff_len]
    mov [si+bx],al  ; сохраняем введенный символ в буфер
    inc [buff_len]
    inc [cursor]
    jc command
    mov ah,0eh
    int 10h     ; выводим введеный символ
    
    jmp inkey
 
command:
    mov ax,0e0dh
    int 10h
    mov al,0ah
    int 10h
    movzx cx,[buff_len]
    test cx,cx
    jz input
    call ErrorCom
    xor eax,eax
    mov word ptr [cursor],ax
    jmp input
 
pause proc
 
    pusha
    xor ax,ax
    int 1ah
    
    mov bh,dl
@@:
    int 1ah
    cmp bh,dl
    jz @b
    mov bh,dl
@@:
    int 1ah
    cmp bh,dl
    jz @b
    popa
    ret
pause endp
 
cls proc
    pusha
    push es
    push 0b800h
    pop es
    mov ax,0720h
    mov cx,160
    xor di,di
    rep stosw
    
    mov ah,2
    xor dx,dx
    xor bx,bx
    mov word ptr[cursor],bx
    int 10h
    pop es
    popa
    ret
 
cls endp
 
ErrorCom proc
    
    pusha
    mov ah,3
    int 10h
    mov bp,offset szInvalidCommand
    mov cx,sizeof szInvalidCommand
    mov bx,7
    mov ax,1301h
    int 10h
    popa
    ret
 
ErrorCom endp
end start
Добавлено через 3 минуты
Цитата Сообщение от galileopro Посмотреть сообщение
Просто грузится винда.
А после этого, сразу захотелось напомнить про существование виртуальных машин...
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2010, 12:15
galileopro, чисто для информации. Операционную систему писать можно и на Си, просто те участки, которые нельзя выразить языком, будут написаны на ассемблерных вставках или в виде чистого ассемблерного файла. Ну и может быть советы:

1. Прежде, чем пытаться запускать какие-либо приложения (управляющий терминал - это тоже приложение), нужно сначала ось оживить - чтобы она научилась делать хоть какие-то действия (печатать на экран как минимум)
2. Начни с простого - загрузиться в твою ОС и напечатать hello world. Этот пункт у тебя по сути дела заработал. Т.е. ты научился хоть как-то стартовать сою ось и хоть что-то с ней сделать
3. Далее предположи, что твоя ось занимает несколько килобайт. А потому тебе нужно в загрузочном секторе сформировать код, который прочтёт ядро твоей оси с диска, скопирует его в память и передаст на него управление
4. Сформируй внутри своего ядра некую точку входа или процедуру, которая бы работала аналогично printf'у в минимально необходимом объёме и с максимально простым интерфейсом. Добейся того, чтобы у тебя "экран" работал как нормальный терминал: т.е. в нём нормально работали переносы строк, прокрутка текста вверх по достижении нижнего края экрана. Без этой функции ты скорее всего не сможешь ничего отладить, т.к. никакие отладчики не будут доступны

Это самые минимально необходимые шаги. Если ты их не выполнишь, то двигаться дальше смысла нет
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2010, 12:15
Помогаю со студенческими работами здесь

Литература для чайника для понимания VCL
Добрый день. Заинтересовался, как Delphi &quot;рисует&quot; компоненты VCL. То есть есть желание чуток модифицировать ComboBox Чтоб...

Atoi для чайника
Условие задания под спойлером. Данные берутся из input.txt, записываются в output.txt Дана необходимая сумма M, стартовая сумма M0...

Assembler для чайника
Добрый день ребята. Начал изучение Ассемблера и столкнулся с проблемой непониманий ни синтаксиса ни самой структуры языка... Прошу вашей...

ООП для чайника
Только начинаю изучать ООП в среде Lazarus, и есть у меня задача Создать 6 разных часов, движущихся по форме, реализовать в ООП ...

Интеграл для чайника
Найти неопределённый интеграл. Не пойму, как тут сократить, и что к чему прибавить.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru