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

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

09.01.2010, 22:16. Показов 34552. Ответов 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, 20:07
Студворк — интернет-сервис помощи студентам
Ну и зачем вам этот код ? Просто чтение нескольких секторов есть и в моем коде.
Строки 36 - 44 в посте #19 грузят "ядро" со следующих секторов в память.
Цитата Сообщение от Evg Посмотреть сообщение
Хотя даже не чистый эмулятор машины, а машины с bios'ом (хотя у VMware это дело вроде бы есть)
Впринципе тут подойдет любая виртуальная машина, но не эмулятор ОС. Но например в Bocsh есть встроенный отладчик, который при некотором навыке может помочь.
А вот как в DOSBox'e запустить загрузочную дискету...
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 20:40  [ТС]
Evg, Я его запустил из под чистого доса, он даже что-то читал (лампочка мигала), но на экране ничего не появилось.

Добавлено через 5 минут
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Ну и зачем вам этот код ? Просто чтение нескольких секторов есть и в моем коде.
Строки 36 - 44 в посте #19 грузят "ядро" со следующих секторов в память.
Ну я начинаю с простого. Мне нужно сделать Проводник самі простой. Допустим я ввожу имя диска или директории жму ентер и программа выводит список влженных файлов и поддиректорий. Я хочу использовать тот огромный код который я выложил, но я же не експерт в асме, чтобы быстренько его переделать, поэтому я начал с малого.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
10.01.2010, 22:49
Цитата Сообщение от galileopro Посмотреть сообщение
Evg, Я его запустил из под чистого доса, он даже что-то читал (лампочка мигала), но на экране ничего не появилось
Насколько я понял, такие вещи надо НЕ из под доса запускать, а из нераскрученной машины (т.е. напрямую из биоса)
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
10.01.2010, 22:52  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Насколько я понял, такие вещи надо НЕ из под доса запускать, а из нераскрученной машины (т.е. напрямую из биоса)
Вот-вот. Я это понимаю. Но я не могу слепить вместе 2 проги. Там и одна и вторая по отдельности работают (ну загрузочный сектор и то, что я только что выложил) но как их слепить?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
10.01.2010, 22:52
Вобщем вот образ дискеты. В загрузочной записи у нее этот код. Единственное, что я изменил - это поменял имя загружаемого файла с "BOOTOR" на "KERNEL", а то звучит как-то страшно
С самом ядре - код, выводящий список файлов на дискете. Немного корявый правда, но показывает.
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
.model tiny 
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 0 ; 
.286
Start:
 jmp EndData
 AbsSectNum dw ?
 AbsHeadNum dw ?
 gnTrackSect dw 18 ; Число секторов на дорожку
 buf db 512*26 DUP (?)
            
EndData:
    call ReadRootDir
 
    mov ax,1301h
    mov bx,07h
    xor dx,dx
    
    push cs
    pop es
    mov bp,offset buf
    
re:
    mov cx,11
    mov ax,1301h
    cmp byte ptr[bp],0
    jz ex
    
    int 10h
    inc dh
    mov dl,0
    add bp,32
    jmp re
ex:
    
  jmp $
ReadRootDir proc 
    ;Чтение корневого каталога в оперативную память 
    pusha 
    mov dx,19 ;Начальный сектор ROOT'a 
    mov di,offset buf 
Cont_Read_Root:
    push dx 
    push di 
    push es 
    Call ReadSect ;Чтение сектора 
    pop es 
    pop di 
    pop dx 
    add di,512 
    inc dx 
    cmp dx,33 
    jne Cont_Read_Root 
    popa 
    ret 
ReadRootDir endp
ReadSect proc 
    push di 
    push es 
    ; Начало расчета сектора/дорожки/головки 
    push cs 
    pop ds 
    mov cx,[gnTrackSect]
    mov si,dx 
    ; tmp=(Sector/TrackSectors); 
    mov ax,si 
    xor dx,dx 
    div cx 
    mov di,ax 
    ; Sec=Sector-(tmp*TrackSectors)+1; 
    mov ax,di 
    imul cx 
    mov dx,si 
    sub dx,ax 
    inc dx 
    mov [AbsSectNum],dx 
    ; Head=tmp & 1; 
    mov ax,di 
    and ax,1 
    mov [AbsHeadNum],ax 
    ; Trk=(Sector-(Head*TrackSectors)-(Sec-1))/(TrackSectors*2); 
    imul cx 
    push ax 
    mov ax,si 
    pop dx 
    sub ax,dx 
    mov dx,[AbsSectNum] 
    dec dx 
    sub ax,dx 
    mov dx,cx 
    shl dx,1 
    push ax 
    push dx 
    xor dx,dx 
    pop bx 
    pop ax 
    div bx ; AX = AbsTrackNum 
    ; Конец расчетов 
    mov cx,ax 
    mov al,cl 
    shr cx,2 
    and cl,0C0h 
    mov ch,al 
    and cx,0FFC0h 
    mov ax,[AbsSectNum] 
    or cl,al 
    pop es 
    pop bx ; ES:BX = Куда считывать 
    mov dx,[AbsHeadNum] 
    mov dh,dl ; Номер головки 
    mov dl,0 ; Номер диска 0 = A 
    mov al,1 ; Количество считываемых секторов 
    mov ah,2 ; Номер функции 
    int 13h 
    ret 
ReadSect endp
 
CSEG ends 
end Start
Вложения
Тип файла: rar boot.rar (2.6 Кб, 53 просмотров)
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
11.01.2010, 02:43  [ТС]
Спасибо. Только форматнуть винт надо в ФАТ32 и все.

Добавлено через 2 часа 4 минуты
Форматнул винт в ФАТ32. Все равно не совсем оно все файлы показало. Вообще-то тут же файловая система винта не влияет, да? влияет только система дискеты?

Добавлено через 3 минуты
А на дискете там вообще ФАТ12. То есть чтобы прочесть что-то с жесткого диска надо еще переделывать это все под НТФС или хотя бы ФАТ32, так я понимаю?
Щас почти никто уже даже ФАТ32 не юзает. Почти все NTFS.

Добавлено через 12 минут
NTFS более надежный. Поэтому вообще если эту ОС будут испытывать на компютерах с виндой (ну не раритетных), то никто не захочет форматировать все в ФАТ32 только чтобы посмотреть как эта мелочь работает. Так что все еще только начинается. Я думаю все таки обратить внимание на Колибри и Менуэт. Они (первая точно) умеют видеть НТФС. Можно взять куски кода из их исходников. И еще большая проблема вот таких мелких ОС - они грузятся только с дискеты, а дискеты - вещь ненадежная. Но тут я выхода не вижу, так как делать возможность загрузки с флешки или СД - очень сложно. + не все материнки поддерживают загрузку с флешки. И с жесткого диска тоже - грузить её с НТФС - легче сразу застрелиться
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
11.01.2010, 02:44
Однако, даже прочесть NTFS очень не просто. И за 2 недели вряд ли получится написать такой модуль...
Да фат12, фат16 и фат32 отличаются и, хотя логика похожа, код нужно переделывать отдельно для каждой из ФС. Чтение с жесткого диска также несколько сложнее, чем с дискеты...

При загрузке с CD, последний подставляется биосом, как диск А, поэтому загрузка вроде как должна быть такой же, правда я сам не пробовал...
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
11.01.2010, 02:59  [ТС]
Меня вообще поразила Kolibri OS. Она видит нормально харды, под ней быстро клепаются проги на С и на Паскале, на асме. И вообще она много чего умеет. Красивый рабочий стол) Много библиотек своих.

Добавлено через 8 минут
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Однако, даже прочесть NTFS очень не просто. И за 2 недели вряд ли получится написать такой модуль...
Да фат12, фат16 и фат32 отличаются и, хотя логика похожа, код нужно переделывать отдельно для каждой из ФС. Чтение с жесткого диска также несколько сложнее, чем с дискеты...
Ну я надеюсь, что у нас будет несколько лаб (от простого к сложному). На каждую по 1-2 недели на сдачу. Там несколько месяцев можно её писать.
Цитата Сообщение от Goodwin98 Посмотреть сообщение
При загрузке с CD, последний подставляется биосом, как диск А, поэтому загрузка вроде как должна быть такой же, правда я сам не пробовал...
Да. Я попробовал. Есть прога WinImage в ней можно написать boot сектор хоть на хард, хоть на флешку, хоть на дискету. Он точно так же по секторам записывает. Либо можно смонтировать образ на флешку, а потом burning studio написать на диск. Грузится оно также)) Это радует. То есть можно попытаться сделать к этой ОС инталятор не с дискеты, а с диска.
Вот еще: Колибри прекрасно ставится на хард и с него грузится как полноценная ОС, только если там ФАТ32. Я пробовал в НТФС - не загрузилась. В чем тут дело? В чем основная сложность загрузки с НТФС?
1
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
11.01.2010, 03:03
Ей вообще-то и годков уже не так мало. да и сама она выросла из MenuetOS. Но сейчас это скорее игрушка для разработчиков, т.к. для пользования ей там очень много чего не хватает, а для исследования уже слишком сложна.

Добавлено через 2 минуты
Цитата Сообщение от galileopro Посмотреть сообщение
от еще: Колибри прекрасно ставится на хард и с него грузится как полноценная ОС, только если там ФАТ32. Я пробовал в НТФС - не загрузилась. В чем тут дело? В чем основная сложность загрузки с НТФС?
Колибри как раз-таки и не грузится полноценно. С харда в электронный диск загружается образ дискеты, и работает как с дискетой.
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
11.01.2010, 03:31  [ТС]
Ух ты как все сложно на ровном месте. Почему нельзя было написать большую часть на асме, а потом, как и делают обычные люди взять С и писать на нем модули и библиотеки. С асмовскими вставками.

Добавлено через 15 минут
Вот интересный факт: Драйвер NTFSDOS Марка Руссиновича (Mark Russinovich) — поддержка чтения, а в версии Professional и записи на NTFS-разделы (с июля 2006 права на утилиты Марка Руссиновича принадлежат Microsoft, на сайте компании информации об этом продукте нет, но его без труда можно найти в Сети). Ведь ДОС грузится тоже с биоса. Можно по этим исходникам своё склепать.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
11.01.2010, 03:35
Я бы на вашем месте, все же на ntfs особо не заглядывался. Для начала стоит сделать модуль для фат32, а там, если время останется попробовать сделать чтение с нтфс. В конце концов вспоминается, сколько времени убили линуксоиды, пока написали боле менее приличную его поддержку...
Файловая система NTFS извне и изнутри
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
11.01.2010, 06:14  [ТС]
Да я бы с радостью, но у нас мало компов с фатом. Хотя я так и сделаю видимо. Но мечтать же не вредно Допустим есть драйверы для чтения нтфс под ДОС (ну если сам дос старый и нтфс не читает). Можно их исходники посмотреть.

Добавлено через 2 часа 24 минуты
Выложу что есть.
1) заготовка для файлового менеджера. только грузится она из под доса.
2) программулина, считывающая нтфс разделы из под биоса.
3) исходники доса.
4) еще разные куски кода, типа драйверов для поддержки длинных имен, смена цвета, и т. п.
5) огромное желание слепить из этого всего ядро ОС.
0
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
11.01.2010, 06:33  [ТС]
Вот: Итог.rar
0
 Аватар для Удалов Дмитрий
872 / 146 / 7
Регистрация: 26.04.2009
Сообщений: 633
11.01.2010, 07:57
ребят, оффтоп конечно, но проектик может быть и не очень стебным я конечно вообще абсолютный нулина в кодинге(любом), но зато я помню шедевр в виде MenuetOS сваянный одним человеком с нуля на ассеблере Безполезная оська такая, но какая красавица
Во, посетил ее сайтик. Уже не такая и бесполезная
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.01.2010, 08:34
Где ты откопал такой чайник, что ему ось нужна?
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
11.01.2010, 17:24  [ТС]
Goodwin98, что скажете на это все что я выложил? Можно из этого слепить простейшую операционную систему?

Добавлено через 1 минуту
Удалов Дмитрий, taras atavin, Я это делаю ради примера. Уже все готово. Слепить вместе и все. Большего мне не надо.

Добавлено через 31 минуту
Вот как допустим сделать, чтобы эта заготовка грузилась из под биоса без ДОСа?

Добавлено через 1 минуту
Может написать код, который сначала загрузит дос, а потом мою ОС? Ведь код исходный ДОСа есть.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
11.01.2010, 19:08
Может тогда сразу ДОС сдавать ?
Отличная ОС, полная поддержка FAT12, FAT16 и FAT32, полная поддержка реального режима процессора. Есть менеджер памяти, обширный сервис апи, встроенный в командный интерпритатор скриптовый язык, есть встроенная поддержка таких устройств как PC-speaker, VGA, CGA, PCj, клавиатур AT и XT, НГМД( 360, 720, 1228, 1474), НЖМД и много другого, а при использовании специальных драйверов, сервис для которых так же присутствует, эти богатые способности можно сильно расширить...
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
11.01.2010, 20:04  [ТС]
Ну не весь Дос заюзать. А вообще в коде MyComander.ASM вроде мало дос ф-й. Вообщем надо его с биоса запустить. А тот файл с поддержкой НТФС смотрели? Можно его дизасемблировать IDA PRO и прикрутить тоже?

Добавлено через 25 минут
Что вот тут не так? Оно компилируется но не запускается.
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
.model tiny ; откуда тут small о_О
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 7c00h ; аддрес загрузки. 
;------------------------------------------------ 
Start:
 jmp EndData
mes1    DB  13,10,' Pres <F1>', 0Dh,0Ah,0
mes2    DB  13,10,'PASSS is...', 0Dh,0Ah,0     
writ    db  13,10,'Write sector', 0Dh,0Ah,0 
sect  db 1 ; sector number (1..18).
cyld  db 10 ; cylinder number (0..79).
head  db 0 ; head number (0..1).
drive db 0 ; drive number (0..3) ; A:=0, B:=1...         
 
BUFFER  DB  512 dup(0);prosto izmenili razmer do 512 
Password    db  512 dup(0)
Editor  DB  512 dup(0)                       
PassMsg     db  13,10,'Enter password:', 0Dh,0Ah,0
OkMsg       db  13,10,' -> OK', 0Dh,0Ah,0
ErrPassMsg      db  13,10,'Password incorrect', 0Dh,0Ah,0
ConvEnterSy     db  13,10,'          Convertor symbol in ASCII v1.0', 0Dh,0Ah
        db  13,10,'Enter symbol: ',0
ConResultA  db  '  Result ASCII: ',0
   
string db "     Operatsionnaea Sistema"
string_len equ $-string
menuText  DB    "F1 Save F2 Read F3 New Write F4 Close                                 "
menuText_len equ $-menuText
menu    DB  "F1 Bloknot F2 Change PAss F3 Convertor F4 ClearScreen F5 About F6 Exit"
menu_len equ $-menu
About   DB  13,10                  
        db     '    +------------------------------------------------+', 0Dh,0Ah
        db     '    |XXXXXXXXXXXXXXXX                XXXXXXXXXXXXXXXX|', 0Dh,0Ah
        db     '    +------------------------------------------------|', 0Dh,0Ah
        db     '    |                                                |', 0Dh,0Ah
        db     '    |   +----------------------------------------+   |', 0Dh,0Ah
        db     '    |   |                                        |   |', 0Dh,0Ah
        db     '    |   |      Первая ОС                         |   |', 0Dh,0Ah
        db     '    |   |                                        |   |', 0Dh,0Ah
        db     '    |   |                                        |   |', 0Dh,0Ah
        db     '    |   |                                        |   |', 0Dh,0Ah
        db     '    |   |                                        |   |', 0Dh,0Ah
        db     '    |   +----------------------------------------+   |', 0Dh,0Ah
        db     '    |                                                |', 0Dh,0Ah
        db     '    |                   +-----------+                |', 0Dh,0Ah
        db     '    |                   |####OK#####|                |', 0Dh,0Ah
        db     '    |                   +-----------+                |', 0Dh,0Ah
        db     '    +------------------------------------------------+', 0Dh,0Ah,0
About_len equ $-About 
Please  db 13,10," please eject any floppy disks "
        db 13,10," and press any key to reboot... ",0   
ENTERR   db 13,10,0                   
EndData:
            mov ax,cs
            mov es,ax
            mov ds,ax
            xor di,di
            xor si,si
            xor dx,dx
            xor bx,bx
            xor cx,cx   
            mov ss,ax
            mov sp,0FFFEh
; blinking disabled for compatibility with dos/bios,
; emulator and windows prompt never blink.
mov     ax, 1003h
mov     bx, 0      ; disable blinking.
int     10h  
        lea si, PassMsg 
            call    print_string
            call    EnterPass           
        call clear_screen
        call PresKey
Exit:
mov ah,00h
int 16h
hlt
 
PresKey PROC   
Again:
        mov ah,00h
    int 16h
    cmp al,0    
    jne Again
        
    cmp ah,3Bh  ;Pres F1?
    je F1
    cmp ah,3Ch  ;Pres F2?
    je F2   
    cmp ah,3Dh  ;Pres F3?
    je F3   
    cmp ah,3Eh  ;Pres F4?
    je F4   
    cmp ah,3Fh  ;Pres F5?
    je F5   
    cmp ah,40h  ;Pres F6?
    je F6   
    jmp Again   
F1:      
    call EditText
    jmp Again    
F2:       
        call changepass
    jmp Again    
F3:       
        call    convert
    jmp Again
F4:       
        call clear_screen
    jmp Again
F5:  
    call    clear_screen      
    lea     si, About
        call    print_string
    jmp Again
F6:
    call    reboot_command 
    hlt   
    ret
 
PresKey ENDP        
 
reboot_command:
call    clear_screen
    lea si, Please 
    call    print_string 
mov ax, 0  ; wait for any key....
int 16h
 
; store magic value at 0040h:0072h:
;   0000h - cold boot.
;   1234h - warm boot.
;mov     ax, 0040h
;mov     ds, ax
;mov     w.[0072h], 0000h ; cold boot.
;jmp        0ffffh:0000h     ; reboot!
int 19h
 
; print a null terminated string at current cursor position, 
; string address: ds:si
print_string proc near
push    ax      ; store registers...
push    si      ;
 
next_char:      
        mov     al, [si]
        cmp     al, 0
        jz      printed
        inc     si
        mov     ah, 0eh ; teletype function.
        int     10h
        jmp     next_char
printed:
 
pop     si      ; re-store registers...
pop     ax      
ret
print_string endp
EditText proc
push ax
push bx
push cx
push dx
    mov ah,13h
    xor al,al
    xor bx,bx
    xor dx,dx
    mov cx,menuText_len
    mov bl,11
    mov bp,offset menuText
    mov dl,8
    mov dh,18h
    int 10h  
    mov ah,02h 
    mov bh,0 
    mov dh,2
    mov dl,1
    int 10h
AgainTe:
        mov ah,00h
    int 16h
    cmp al,0    
    jne AgainTe
        
    cmp ah,3Ch  ;Pres F2?
    je F2t  
    cmp ah,3Dh  ;Pres F3?
    je F3t  
    cmp ah,3Eh  ;Pres F4?
    je F4t          
    jmp AgainTe 
     
F2t:          
    jmp readtext     
F3t:          
        call    clear_screen
    jmp writetext
F4t:          
        call clear_screen
    jmp the_end
    writetext:
    mov ah,13h
    xor al,al
    xor bx,bx
    xor dx,dx
    mov cx,menuText_len
    mov bl,11
    mov bp,offset menuText
    mov dl,8
    mov dh,18h
    int 10h  
    mov ah,02h 
    mov bh,0 
    mov dh,2
    mov dl,1
    int 10h
    xor bx,bx
    lp:
        mov     ah,00h
        int 16h
        cmp     ah,3Bh
        je  lC
        cmp ah,3Eh  
        je  F4t
        mov [Editor + bx], al
        mov ah, 0eh
        int 10h
        inc bx
        jmp lp
    lC:     
    mov ah, 03h
    mov al, 1 ; write 1 sector (512 bytes).
    mov cl, sect  ; sector (1..18)
    mov ch, 11  ; cylinder (0..79)
    mov dh, head  ; head  (0..1)  
    mov dl, drive ; always 0 (A:)
    mov bx, offset Editor
    int 13h
    jmp the_end
    
    readtext:
    mov ah, 02h
        mov al, 1 ; write 1 sector (512 bytes).
        mov cl, sect  ; sector (1..18)
        mov ch, 11  ; cylinder (0..79)
        mov dh, head  ; head  (0..1)  
        mov dl, drive ; always 0 (A:)
        mov bx, offset BUFFER
        int 13h
        
        mov [BUFFER+512],0
    call clear_screen
    lea si,BUFFER
    call print_string
        mov ah,13h
    xor al,al
    xor bx,bx
    xor dx,dx
    mov cx,menuText_len
    mov bl,11
    mov bp,offset menuText
    mov dl,8
    mov dh,18h
    int 10h  
    mov ah,02h 
    mov bh,0 
    mov dh,2
    mov dl,1
    int 10h
    jmp AgainTe
the_end:
pop dx
pop cx
pop bx
pop ax   
ret
EditText endp
 
changepass proc
push ax
push bx
push cx
push si
    call clear_screen
    lea si,PassMsg
    call print_string
    xor bx,bx
    lpss:
        mov     ah,00h
        int 16h
        cmp al, 13
        je  lConv1
        mov [Password + bx], al
        mov ah, 0eh
        int 10h
        inc bx
        jmp lpss
    lConv1:     
    call writesec   
    call readsec   ;scitivau dlea proverki
    lea si,BUFFER
    call   print_string
pop si
pop cx
pop bx
pop ax
ret
changepass ENDP
 
writesec proc   ;zapisivau dannie
push ax
push bx
push cx
push dx
    lea si,writ
    call print_string 
    wr: mov ah, 03h
    mov al, 1 ; write 1 sector (512 bytes).
    mov cl, sect  ; sector (1..18)
    mov ch, cyld  ; cylinder (0..79)
    mov dh, head  ; head  (0..1)  
    mov dl, drive ; always 0 (A:)
    mov bx, offset Password
    mov [Password + 6],0; prosto dobavili v konec 0 - dlea correctnogo vivoda na ekran i sravnenia parolei  
    int 13h
    jc er 
    jmp e2e     
    er: lea dx, e2
        mov ah, 9
        int 21h
        jmp e2e
        e2 db "   i/o error...",0Dh,0Ah,'$'
        e2e: 
pop dx
pop cx
pop bx
pop ax  
ret
writesec endp     
 
readsec proc   ;scitivau dannie
push ax
push bx
push cx
push dx
        mov ah, 02h
        mov al, 1 ; write 1 sector (512 bytes).
        mov cl, sect  ; sector (1..18)
        mov ch, cyld  ; cylinder (0..79)
        mov dh, head  ; head  (0..1)  
        mov dl, drive ; always 0 (A:)
        mov bx, offset BUFFER
        int 13h 
        mov [BUFFER+6],0;prosto  dobavili v konec 0 - dlea correctnogo vivoda na ekran i sravnenia parolei
pop dx
pop cx
pop bx
pop ax   
ret
  readsec endp
 
EnterPass   PROC
push ax
push bx
push cx
push si
        xor bx, bx
lPass:
        mov     ah,00h     ;vvoju paroli
        int 16h
        cmp al, 13
        je  lCompare
        mov [Password + bx], al
        mov ah, 0eh
        mov al, '*'
        int 10h
        inc bx
        jmp lPass
 
lCompare:
call readsec
        lea si, Password
        lea di, BUFFER
        cld
        mov cx, 6
        repe    cmpsb;sravnenie
        jne lErr
        jmp lNext
 
lErr:   
        lea     si, ENTERR
            call    print_string
        lea si, ErrPassMsg 
            call    print_string
        call Exit   
lNext: ;Paroli OK
        lea     si, ENTERR
            call    print_string
        lea si, OkMsg 
            call    print_string
pop si
pop cx
pop bx
pop ax
;call PresKey
        ret
EnterPass endp
 
convert PROC
push ax
push bx
push cx
push si
 
CAgain:
    call clear_screen
    lea si,ConvEnterSy
    call print_string
    xor bx,bx
        mov ah,00h
    int 16h 
    mov dl, al
    mov ah, 0eh
    int 10h
    lConv:
    lea si,ConResultA
    call print_string
    call write_decimal
    CheEnter:
    mov ah,00h
    int 16h
    cmp al, 13
    je CAgain
    cmp al, 1Bh
    je ESCB
    jmp CheEnter
ESCB:
    call clear_screen
    call PresKey
pop si
pop cx
pop bx
pop ax
ret
convert endp
 
clear_screen proc near
        push    ax      ; store registers...
        push    ds      ;
        push    bx      ;
        push    cx      ;
        push    di      ;
 
        mov     ax, 40h
        mov     ds, ax  ; for getting screen parameters.
        mov     ah, 06h ; scroll up function id.
        mov     al, 0   ; scroll all lines!
        mov     bh, 10011111b  ; attribute for new lines.
        mov     ch, 0   ; upper row.
        mov     cl, 0   ; upper col.
        mov     di, 84h ; rows on screen -1,
        mov     dh, [di] ; lower row (byte).
        mov     di, 4ah ; columns on screen,
        mov     dl, [di]
        dec     dl      ; lower col.
        int     10h
 
        ; set cursor position to top
        ; of the screen:
        mov     bh, 0   ; current page.
        mov     dl, 0   ; col.
        mov     dh, 0   ; row.
        mov     ah, 02
        int     10h
 
        pop     di      ; re-store registers...
        pop     cx      ;
        pop     bx      ;
        pop     ds      ;
        pop     ax      ;    
        
    mov ah,13h
    xor al,al
    xor bx,bx
    xor dx,dx
    mov cx,menu_len
    mov bl,11
    mov bp,offset menu
    mov dl,8
    mov dh,18h
    int 10h  
 
    mov ah,13h
    xor al,al
    xor bh,bh
    mov cx,string_len
    mov bl,19h
    mov bp,offset string
    mov dl,10
    mov dh,0
    int 10h
 
    lea     si, ENTERR
        call    print_string
 
        ret
clear_screen endp
 
write_decimal proc
  push ax
  push cx
  push dx
  push bx
  mov  ax,dx  ;(1)
  mov  bx,10d ;(2)
  xor  cx,cx  ;(3)
 non_zero:
  xor  dx,dx  ;(4)
  div  bx     ;(5)
  push dx     ;(6)
  inc  cx     ;(7)
  cmp  ax,0   ;(8)
  jne  non_zero
    
 write_digit_loop:
  pop  dx     ;(9)
  call WRITE_HEX_DIGIT ;(10)
  loop write_digit_loop
  pop bx
  pop dx
  pop cx
  pop ax
  ret
write_decimal endp 
 
WRITE_HEX_DIGIT proc
  push DX
  xor  dh, dh
  cmp  DL,0Ah       
  jae  HEX_LETTER
  add  DL,30h
  JMP  WRITE_DIGIT
 HEX_LETTER:
  add  DL,37h
 WRITE_DIGIT:  
               
  call WRITE_CHAR
  pop  DX  
  ret
WRITE_HEX_DIGIT endp
 
WRITE_CHAR proc
  push AX
  push BX
  push CX
  mov AH,9
  xor BH,BH
  mov BL,00000111b
  mov CX,1
  mov AL,DL
  int 10h
  call CURSOR_RIGHT
  pop CX
  pop BX
  pop AX
  ret
WRITE_CHAR endp
 
CURSOR_RIGHT proc
  push DX
  call CURSOR_READ
  inc DL
  call CURSOR_SET
  pop DX
  ret
CURSOR_RIGHT endp  
 
CURSOR_READ proc
  push AX
  push BX
  push CX
  mov AH,3
  xor BH,BH
  int 10h
  pop CX
  pop BX
  pop AX
  ret
CURSOR_READ endp 
 
CURSOR_SET proc
  push AX
  push BX
  push CX
  mov AH,2
  xor BH,BH
  int 10h
  pop CX
  pop BX
  pop AX
  ret
CURSOR_SET endp    
CSEG ends 
end Start
Добавлено через 13 минут
Ваш код из поста 45 не работает Он что-то грузит, но... Я может криворукий, но ничего не могу загрузить толком. Если сможете: Выложите еще разок исходники. И кстати там в образе 2 текстовика пустых. Зачем они?
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
11.01.2010, 23:18
Assembler
1
org 7c00h ; аддрес загрузки.
Это уже не загрузчик, а ядро. Оно стартует, в нашем случае, с 1000:0000.
Assembler
1
org 0
Цитата Сообщение от galileopro Посмотреть сообщение
Ваш код из поста 45 не работает Он что-то грузит, но... Я может криворукий, но ничего не могу загрузить толком. Если сможете: Выложите еще разок исходники.
непонял. Образ, что там есть работает ? Какой эмулятор используете ?

Цитата Сообщение от galileopro Посмотреть сообщение
И кстати там в образе 2 текстовика пустых. Зачем они?
Там же показывается содержимое корня. Вот чтобы было что показывать, они там и есть...

Цитата Сообщение от galileopro Посмотреть сообщение
Goodwin98, что скажете на это все что я выложил? Можно из этого слепить простейшую операционную систему?
Не с того конца вы все это лепите...
1
Пробующий
 Аватар для galileopro
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
12.01.2010, 08:25  [ТС]
Цитата Сообщение от Goodwin98 Посмотреть сообщение
непонял. Образ, что там есть работает ? Какой эмулятор используете ?
Нет. Не работает. Я без эмуляторов работаю. С дискеты. Не показывает этот код эти 2 файла.

Цитата Сообщение от Goodwin98 Посмотреть сообщение
Это уже не загрузчик, а ядро. Оно стартует, в нашем случае, с 1000:0000.
Код ASM1 org 0
Не помогло. Вот исходники. Ком файл я записал в корень дискеты и загрузился с неё. (Rawwrite программой писал). Ничего не загрузило.
bin.rar
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2010, 08:25
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Квантовые алгоритмы и обработка строк в Q#
EggHead 07.06.2025
Квантовые вычисления перевернули наше представление о том, как работать с данными, а Q# стал одним из ключевых языков для разработки квантовых алгоритмов. В традиционых системах мы оперируем битами —. . .
NUnit и C#
UnmanagedCoder 07.06.2025
В . NET существует несколько фреймворков для тестирования: MSTest (встроенный в Visual Studio), xUnit. net (более новый фреймворк) и, собственно, NUnit. Каждый имеет свои преимущества, но NUnit. . .
с++ Что нового?
russiannick 06.06.2025
Продолжаю обзор dev-cpp5. 11. Посмотрев на проекты, предоставленные нам для обучения, становится видно, что они разные по содержащимся файлам где: . dev обязательно присутствует . cpp/ . c один из них. . .
WebAssembly в Kubernetes
Mr. Docker 06.06.2025
WebAssembly изначально разрабатывался как бинарный формат инструкций для виртуальной машины, обеспечивающий высокую производительность в браузерах. Но потенциал технологии оказался гораздо шире - она. . .
Как создать первый микросервис на C# с ASP.NET Core, step by step
stackOverflow 06.06.2025
Если говорить простыми словами, микросервисная архитектура — это подход к разработке, при котором приложение строится как набор небольших, слабо связанных сервисов, каждый из которых отвечает за. . .
Рисование коллайдеров Box2D v2 на Three.js с помощью порта @box2d/core
8Observer8 06.06.2025
Используется порт Box2D v2 под названием @box2d/ core - пакет NPM. Загрузил документацию Box2D v2 на Netlify: https:/ / box2d-v2-docs. netlify. app/ Документацию Box2D v2 можно скачать с официального. . .
Как создать стек в Python
AI_Generated 05.06.2025
Как архитектор с более чем десятилетним опытом работы с Python, я неоднократно убеждался, что знание низкоуровневых механизмов работы стеков дает конкурентное преимущество при решении сложных задач. . . .
Server-Sent Events (SSE) в Node.js
run.dev 05.06.2025
Потоковая передача данных с сервера прямо в браузер стала повседневной потребностью - от биржевых графиков и спортивных трансляций до чатов и умных дашбордов. Много лет разработчики полагались на. . .
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »