Форум программистов, компьютерный форум, киберфорум
Наши страницы
ОС на Assembler
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Comrade2017
7 / 7 / 5
Регистрация: 30.12.2016
Сообщений: 100
1

Как создать операционную систему

13.02.2017, 09:40. Просмотров 1091. Ответов 14
Метки нет (Все метки)

есть код не работает

Загрузчик boot.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
kernel_seg  equ   1000h
org 100h
start:
      jmp begin
begin:     
      mov ax,kernel_seg
      mov es,ax
      mov bx,100h
      call Write
exit:
      call far kernel_seg:0100h
      ret
proc  write
      mov al,1h
      mov dl,0
      xor ch,ch
      mov cl,2h
      mov dh,0
      mov ah,02h
      int 13h
      ret
endp Write 
end start
Ядро kernel.asm


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
code segment para public 'code'
 assume cs:code, ds: code, ss: code ,es: code
 org 100h
main proc
 jmp EndData
string db "Obweakovaea Operatsionnaea Sistema"
string_len equ $-string
EndData:
xor ax,ax
mov bh,07h
xor cx,cx
mov dx,0184fh
mov ah,06h
int 10h
mov ah,13h
xor al,al
xor bh,bh
mov cx,string_len
mov bl,06h
mov bp,offset string
mov dl,10
mov dh,10
int 10h
mov ah,00h
int 16h
main endp
code ends 
end main
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2017, 09:40
Ответы с готовыми решениями:

Как создать операционную систему?
Всем привет!Я хочу сделать ос на ассемблере и си.Как сделать чтобы система...

Как начать писать свою операционную систему на виртуальной машине?
Как начать писать свою операционную систему на вирт.машине virtualbox?

Дописать операционную систему
Мне нужно доделать ОС.Пожалуйста, поможете.

Как написать файловую систему на ассемблере для своей ОС 16 bit?
Вот написал я загрузчик, подключил ядро(kernel в нем пока ничего нету кроме...

Можно ли создать операционную систему, используя C#?
Для вас ест вопрос. ОС Android сделон с помощи С++ !!! Можна создат...

14
ФедосеевПавел
Модератор
4153 / 2263 / 919
Регистрация: 01.02.2015
Сообщений: 7,527
13.02.2017, 10:12 2
Наверное, потому, что это что угодно, только не загрузчик и не ядро.
0
Nojabr
10 / 10 / 0
Регистрация: 13.06.2016
Сообщений: 62
Завершенные тесты: 2
13.02.2017, 21:52 3
нужны подробности.
в чем тестируется? на что записывается? глядя на код, полагаю, что он должен выводить строку. мне бы еще компилятор знать
0
Comrade2017
7 / 7 / 5
Регистрация: 30.12.2016
Сообщений: 100
15.02.2017, 05:32  [ТС] 4
fasm на компилируется

Добавлено через 2 минуты
еще одна операционная система которую не могу запустить


macro align value { db value-1 - ($ + value-1) mod (value) dup 0 }
HEADS = 1
SPT = 4 ;4 сектора по 512 байт
Begin:
file "fboot.bin",512 ; загрузчик
file "fkernel.bin" ; первый файл, типа оболочка shell
align 512
file "fwriter.bin" ; второй файл - текстовый редатор
align 512
align HEADS*SPT*512

Добавлено через 6 минут
fboot.asm
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
;===================== Загрузочный сектор. Евгений Попов, 2011===================== 
;==================================================================================
 org 7c00h  ;BIOS производит чтение 512 байт первого сектора MBR в ОЗУ по адресу 0x00007C00 
            ;(0x07C0:0x0000 в формате реального режима), затем прочитанному коду передаётся управление
start:
        cli             ;запрещаем прерывания
        xor ax,ax       ;обнуляем регистр ах
        mov ds,ax       ;настраиваем сегмент данных на нулевой адрес
        mov es,ax       ;настраиваем сегмент es на нулевой адрес
        mov ss,ax       ;настраиваем сегмент стека на нулевой адрес
        mov sp,07C00h   ;сегмент sp указывает на текущую вершину стека
        sti         ;разрешаем прерывания
            
        mov ax, 0002h   ;очищаем экран - функция 00h прерывания 10h 
        int 10h
         
        mov dx,0h
        call SetCursorPos
         
        mov bp, msg             
        mov cx, 13
        call PrintMes   ;Вывод на экран строки msg
         
        add dh,1        ;переходим на одну строку ниже
        call SetCursorPos
        mov bp, Con             ;Вывод на экран строки Con
        mov cx, 23
        call PrintMes
                 
         mov ah,10h
         int 16h
                 
Continue:
        cmp al, 0Dh     ;Если нажимаем на Enter, то переходим к загрузке ядра
        jz Kernel
        jmp Continue    ;Если нет, снова ожидаем нажатия клавиши
                 
Kernel:
        mov ax,0000h
        mov es,ax
        mov bx,500h
        mov ch,0            ;номер цилиндра - 0
        mov cl,02h          ;начальный сектор - 2
        mov dh,0            ;номер головки - 0
        mov dl,80h          ;жесткий диск - 80h
        mov al,01h          ;кол-во читаемых секторов -1
        mov ah,02h
        int 13h
        jmp 0000:0500h      ;переход на 0000:0500h, куда загружен второй сектор
 
;===================== Подпрограммы ===================================
PrintMes:                   ;в регистре  bp - строка, в регистре cx - длина этой строки
        mov bl,04h          ;в регистре  bl- атрибут
        mov ax,1301h         функция 13h прерывания 10h
        int 10h
        ret
        ;----------------------------------
SetCursorPos:        ;установка курсора : функция 02h прерывания 10h
        mov ah,2h
        xor bh,bh
        int 10h 
        ret
            
 
 
;===================== выводимые сообщения===================== 
        msg db 'OS Loading...',0     
        Con db 'Press Enter to Continue',0
  
times(512-2-($-07C00h)) db 0
db 055h,0AAh ;сигнатура, символизирующая о завершении загрузочного сектора
Добавлено через 1 минуту
fkernel.asm
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
org 500h                ;этот сектор будет загружаться по адресу 0000:0500h
message:
    mov ax, 0002h   ;очищаем экран
        int 10h
         
    mov dx,0h
    call SetCursorPos
        mov bp, msg
        mov cx, 20
        mov bl,04h                  
        xor bh,bh
        mov ax,1301h
        int 10h         ;вывод приглашения к вводу команды
         
        add dh,2            ;переводим курсор на один пункт вниз для ввода команды
        call SetCursorPos
        mov si,0
         
Command: 
    mov ah,10h
        int 16h
        cmp ah, 0Eh     ;Если нажата клавиша BackSpase - удалить символ
        jz Delete_symbol
        cmp al, 0Dh
        jz Input_Command
        mov [string+si],al
        inc si
        mov ah,09h
        mov bx,0004h
        mov cx,1
        int 10h
        add dl,1
    call SetCursorPos
    jmp Command
         
Input_Command:      ;Если нажат Enter, то переходим в третий сектор
    mov ax,cs
    mov ds,ax
    mov es,ax
    mov di,string
    push si     ;так как содержание регистра si меняется, сохраним в стеке
    mov si,write
    mov cx,5
    rep cmpsb ;сравниваем строки - если команда write, то переходим
    je wrt
    pop si
    jmp Command
         
Delete_symbol:
    cmp dl,0
    jz Command
    sub dl,1        ;сдвигаем курсор влево
    call SetCursorPos
    mov al,20h      ;вместо уже напечатанного символа выводим пробел
    mov [string + si],al ;стираем символ в строке
    mov ah,09h
    mov bx,0004h
        mov cx,1
        int 10h
        dec si          ;уменьшаем кол-во напечатанных символов
    jmp Command
         
wrt:    mov ax,0000h
        mov es,ax
        mov bx,700h         
        mov ch,0            ;номер цилиндра - 0
        mov cl,03h          ;начальный сектор - 3
        mov dh,0            ;номер головки - 0
        mov dl,80h          ;жесткий диск - 80h
        mov al,01h          ;кол-во читаемых секторов -1
        mov ah,02h
        int 13h
    jmp 0000:0700h
 
SetCursorPos:        ;установка курсора
        mov ah,2h
        xor bh,bh
        int 10h 
        ret
 
msg db 'Input the command...',0
write db 'write',0
string db 5 dup(?) ;буфер для ввода команды
Добавлено через 1 минуту
fwriter.asm
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
org 700h
start:
    mov ax,0002h    ;очищаем экран
    int 10h
        xor dx,dx
        call SetCursorPos   ;устанавливаем курсор
                                 
        mov bp, msg
        mov cx, 24
        call PrintMes   ;Вывод на экран строки msg
         
        mov dl,0
        mov dh,1
        call SetCursorPos   ;переводим курсор на одну строку вниз
        mov bp, helper
        mov cx,77
        call PrintMes       ;Вывод на экран строки helper
         
Option:                     ;Выбор - загрузить текст из четвертого сектора или начать новый
        mov ah,10h
        int 16h
        cmp ah, 3Bh         ;Если нажата клавиша F1 - загружаем текст
        jz Load_text
        cmp al, 0Dh         ;Если нажата клавиша Enter - печатаем текст
        jz Print_text
    jmp Option
         
Load_text:                  ;Загрузка текста
    mov ax,0000h
        mov es,ax
        mov bx,string         
        mov ch,0            ;номер цилиндра - 0
        mov cl,4            ;начальный сектор - 4
        mov dh,0            ;номер головки - 0
        mov dl,80h          ;жесткий диск - 80h
        mov al,01h          ;кол-во читаемых секторов -1
        mov ah,02h
        int 13h
        xor dl,dl
        mov dh,3
        call SetCursorPos
        mov bp, string
        mov cx, 256
        call PrintMes
        mov si,255
        add dl, 15          ;256-80*3=16
        add dh,3
        call SetCursorPos
        jmp Command
         
Print_text:
        xor dx,dx
        add dh,3
        call SetCursorPos   ;получаем позицию курсора
        mov si,0            ;Печать символов
Command: 
    mov ah,10h
        int 16h
        cmp al, 1Bh     ;Если нажата клавиша Esc - выход из приложения
        jz Esc
        cmp al, 0Dh     ;Если нажата клавиша Enter - переход на новую строку
        jz Caret
        cmp ah, 0Eh     ;Если нажата клавиша BackSpase - удалить символ
        jz Delete_symbol
        cmp ah, 3Ch     ;Если нажата клавиша F2- сохранить текст
        jz Save_text
        cmp si, 256
        jz Command
        mov [string + si],al
        inc si
        mov ah,09h
        mov bx,0004h
        mov cx,1
        int 10h
        add dl,1
        call SetCursorPos
    jmp Command
         
Caret:  ;переход на новую строку
    add dh,1
    xor dl,dl
        call SetCursorPos
        jmp Command
         
Save_text:  ;запись текста в 4 сектор
    mov ax,0000h
        mov es,ax
    mov ah, 03h
    mov al,1
    mov ch,0
    mov cl,4
    mov dh,0
    mov dl,80h
    mov bx, string
    int 13h
    jmp Command
         
Delete_symbol: ;удаление символа после нажатия BackSpase
    cmp dl,0
    jne Delete
    cmp dh,3
    jz Command
    sub dh,1
    mov dl,79
    jmp Cursor_Pos
Delete:     sub dl,1            ;сдвигаем курсор влево
Cursor_Pos: 
    call SetCursorPos
    mov al,20h          ;вместо уже напечатанного символа выводим пробел
    mov [string + si],al ;стираем символ в строке
    mov ah,09h
        mov bx,0004h
        mov cx,1
        int 10h
        cmp si,0
        jz Command
        dec si              ;уменьшаем кол-во напечатанных символов
    jmp Command
Esc:     
        jmp 0000:0500h      ;возвращаемся во второй сектор
         
;===================== Подпрограммы ===================================
  PrintMes:                ;в регистре  bp - строка, в регистре cx - длина этой строки
        mov bl,04h          ;в регистре  bl- атрибут
        mov ax,1301h
        int 10h
        ret
        ;----------------------------------
  SetCursorPos:                                     ;установка курсора
        mov ah,2h
        xor bh,bh
        int 10h 
        ret
             
        ;===================== выводимые сообщения===================== 
        msg db 'This is a text writer...',0 
        helper db 'To print text - press Enter, to load text - press F1, to save text - press F2',0
        string db 256 dup(?)    ;буфер для вводимого сообщения
Добавлено через 36 минут
Теперь скомпилируем три файла и создадим из них образ вот это не могу сделать
Assembler
1
2
3
4
5
6
7
8
9
10
macro align value { db value-1 - ($ + value-1) mod (value) dup 0 }
HEADS = 1
SPT = 4 ;4 сектора по 512 байт
Begin:
    file "fboot.bin",512 ; загрузчик
    file "fkernel.bin" ; первый файл, типа оболочка shell
    align 512
    file "fwriter.bin" ; второй файл - текстовый редатор
    align 512
    align HEADS*SPT*512
0
shmkv
1749 / 431 / 59
Регистрация: 21.07.2015
Сообщений: 1,127
16.02.2017, 12:38 5
Цитата Сообщение от Comrade2017 Посмотреть сообщение
еще одна операционная система которую не могу запустить
Это не ОС. Это Hello world под BIOS.
0
Comrade2017
7 / 7 / 5
Регистрация: 30.12.2016
Сообщений: 100
16.02.2017, 13:41  [ТС] 6
не это OS только как её запустить
0
shmkv
1749 / 431 / 59
Регистрация: 21.07.2015
Сообщений: 1,127
16.02.2017, 14:24 7
Цитата Сообщение от Comrade2017 Посмотреть сообщение
не это OS
Если на клетке слона прочтешь надпись: буйвол, — не верь глазам своим
Цитата Сообщение от Comrade2017 Посмотреть сообщение
как её запустить
Скомпилировать в бинарники и собрать из них образ дискеты, этот образ подсунуть виртуалке.
0
Comrade2017
7 / 7 / 5
Регистрация: 30.12.2016
Сообщений: 100
16.02.2017, 14:50  [ТС] 8
незапускаться
0
shmkv
1749 / 431 / 59
Регистрация: 21.07.2015
Сообщений: 1,127
16.02.2017, 14:53 9
Цитата Сообщение от Comrade2017 Посмотреть сообщение
незапускаться
Это так информативно.
0
Comrade2017
7 / 7 / 5
Регистрация: 30.12.2016
Сообщений: 100
16.02.2017, 14:54  [ТС] 10
я собрал *.bin файлы не запускаеться
0
shmkv
1749 / 431 / 59
Регистрация: 21.07.2015
Сообщений: 1,127
16.02.2017, 20:00 11
Цитата Сообщение от Comrade2017 Посмотреть сообщение
я собрал *.bin файлы не запускаеться
Опиши последовательно все шаги, которые делал. Это последнее предупреждение.

Не по теме:

http://tsya.ru/

0
Ethereal
5200 / 1943 / 251
Регистрация: 17.02.2013
Сообщений: 2,882
18.02.2017, 19:42 12
Цитата Сообщение от Comrade2017 Посмотреть сообщение
я собрал *.bin файлы не запускаеться
Причины могут быть только две
1.) Сделал неправильно
2.) Недопонял, как нужно сделать

Если ты что-то другое хочешь услышать, то выкладывай куда ты засовывал эти файлы для запуска.
1.) В первый сектора дискеты ?
2.) В первые сектора винчестера который не жаль ?
3.) В первые сектора флешки ?
4.) Или ты как-то подсовываешь их виртуалке ?
А то мы телепатически никак не можем уловить какой из этих вариантов имел место. Видать какая-то пробка в астрале.
0
shmkv
1749 / 431 / 59
Регистрация: 21.07.2015
Сообщений: 1,127
19.02.2017, 02:21 13
Сия поделка не содержит MBR и должна записываться только на дискету (ну или в образ дискеты). В противном случае BIOS не обязан грузить носитель без вадной MBR с активным разделом (хотя может и загрузить, как повезет).
0
ФедосеевПавел
Модератор
4153 / 2263 / 919
Регистрация: 01.02.2015
Сообщений: 7,527
19.02.2017, 08:39 14
Последний вариант ОС от топикстартера взят по ссылке https://metanit.com/assembler/articles/MiniOS.php
На том же сайте рассмотрены способы создания загрузочных дискет.

Comrade2017, расскажите подробнее, что вы делаете, как проверяете.
0
Comrade2017
7 / 7 / 5
Регистрация: 30.12.2016
Сообщений: 100
27.03.2017, 07:13  [ТС] 15
надо было собрать обрас *.iso
0
27.03.2017, 07:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2017, 07:13

Как удалить вторую операционную систему
у меня установлена 2 windows. на C-windows xp и на D-windows 7. как удалить win...

Как определить текущую операционную систему на с++?
В программе, в зависимости от операцонной системы, выбираются/подставляются...

Как удалить вторую операционную систему из Ubuntu 14.02?
На компе стоят две операционки. Решил оставить одну, Ubuntu. Но не знаю как...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru