Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278

Размер программы в защищенном режиме

05.10.2013, 04:53. Показов 3619. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
и снова возникли проблемы.

Дело в том,что при достижении определенного размера программы,она перестает работать,а порою работает с сбоями


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
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
Use16  ;Генерировать 16-битный код
Org 7c00h  ;Загрузочная область
 
;ПЕРВИЧНЫЙ ЗАГРУЗЧИК
start:
  mov ax, cs
  mov ds, ax
 
 
 
Mov cx,12
Mov     ax,0B800h     ; Сегментный адрес видеопамяти
        Mov     es,ax
        Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
        Mov     si,startboot1     ; Данные для вывода
 
       Cld
       print:
       Sub cx,1
       Test cx,cx
       Jz pmode
 
       Movsb
       Mov  al, 04h ;Цвет
       Stosb
       Jmp print
 
 
 pmode:
 
Cli ; Запрещаем прерывания
 
 lgdt  [gdtr]   ;Таблица дескрипторов
 
;Открыть линию A20
  In  al, 0x92
  Or  al, 2
  Out 0x92, al
; Запретить немаскируемое прерывание
  In  al, 0x70
  Or  al, 0x80
  Out 0x70, al
; Перейти в защищенный режим
  Mov  eax, cr0
  Or   al, 1
  Mov  cr0, eax           ; с этого момента мы в защищенном режиме
 
  Jmp _protected
 
 
times 2046-($-$$) db 0   ;Заполнить нулями до 2046 байта
db 0x55, 0xaa     ;Загрузочная сигнатура
 
 
Use32
_protected:
; Вывод текста на экран
 
; Защищенный режим
 
 Mov     edi,0B8000h  ;Начало видеопамяти
 Xor     edi,edi         ; DI = 0, адрес начала видеопамяти в ES:DI
 Mov     esi,pmode_message  ; Данные для вывода
 
 
Mov  ecx,15
 
       Cld
       print1:
       Sub ecx,1
       Test ecx,ecx
       Jz keyboard_000002
 
       Movsb
       Mov  al, 07h ;Цвет
       stosb
       Jmp print1
 
 
 
 
 
 
 
;Консоль
keyboard_000002:
 
 
Xor al,al ; Обнуляем регистр AL
In al,60h   ; Читаем порт PS/2 клавиатуры
 
 
;=====================================================
;W
Cmp al, 17  ; Сравниваем значение регистра AL со скан-кодом
Je step_17 ; Если клавиша с номером (скан-код) нажата
;E
Cmp al, 18  ; Сравниваем значение регистра AL со скан-кодом
Je step_18 ; Если клавиша с номером (скан-код) нажата
;R
Cmp al, 19  ; Сравниваем значение регистра AL со скан-кодом
Je step_19 ; Если клавиша с номером (скан-код) нажата
;T
Cmp al, 20  ; Сравниваем значение регистра AL со скан-кодом
Je step_20 ; Если клавиша с номером (скан-код) нажата
;Y
Cmp al, 21  ; Сравниваем значение регистра AL со скан-кодом
Je step_21 ; Если клавиша с номером (скан-код) нажата
;U
Cmp al, 22  ; Сравниваем значение регистра AL со скан-кодом
Je step_22 ; Если клавиша с номером (скан-код) нажата
;I
Cmp al, 23  ; Сравниваем значение регистра AL со скан-кодом
Je step_23 ; Если клавиша с номером (скан-код) нажата
;O
Cmp al, 24  ; Сравниваем значение регистра AL со скан-кодом
Je step_24 ; Если клавиша с номером (скан-код) нажата
;P
Cmp al, 25  ; Сравниваем значение регистра AL со скан-кодом
Je step_25 ; Если клавиша с номером (скан-код) нажата
;A
Cmp al, 30  ; Сравниваем значение регистра AL со скан-кодом
Je step_30 ; Если клавиша с номером (скан-код) нажата
;S
Cmp al, 31  ; Сравниваем значение регистра AL со скан-кодом
Je step_31 ; Если клавиша с номером (скан-код) нажата
;D
Cmp al, 32  ; Сравниваем значение регистра AL со скан-кодом
Je step_32 ; Если клавиша с номером (скан-код) нажата
;F
Cmp al, 33  ; Сравниваем значение регистра AL со скан-кодом
Je step_33 ; Если клавиша с номером (скан-код) нажата
;G
Cmp al, 34  ; Сравниваем значение регистра AL со скан-кодом
Je step_34 ; Если клавиша с номером (скан-код) нажата
;H
Cmp al, 35  ; Сравниваем значение регистра AL со скан-кодом
Je step_35 ; Если клавиша с номером (скан-код) нажата
;J
Cmp al, 36  ; Сравниваем значение регистра AL со скан-кодом
Je step_36 ; Если клавиша с номером (скан-код) нажата
;K
Cmp al, 37  ; Сравниваем значение регистра AL со скан-кодом
Je step_37 ; Если клавиша с номером (скан-код) нажата
;L
Cmp al, 38  ; Сравниваем значение регистра AL со скан-кодом
Je step_38 ; Если клавиша с номером (скан-код) нажата
;Z
Cmp al, 44  ; Сравниваем значение регистра AL со скан-кодом
Je step_44 ; Если клавиша с номером (скан-код) нажата
;X
Cmp al, 45  ; Сравниваем значение регистра AL со скан-кодом
Je step_45 ; Если клавиша с номером (скан-код) нажата
;C
Cmp al, 46  ; Сравниваем значение регистра AL со скан-кодом
Je step_46 ; Если клавиша с номером (скан-код) нажата
;V
Cmp al, 47  ; Сравниваем значение регистра AL со скан-кодом
Je step_47 ; Если клавиша с номером (скан-код) нажата
;B
Cmp al, 48  ; Сравниваем значение регистра AL со скан-кодом
Je step_48 ; Если клавиша с номером (скан-код) нажата
;N
Cmp al, 49  ; Сравниваем значение регистра AL со скан-кодом
Je step_49 ; Если клавиша с номером (скан-код) нажата
;M
Cmp al, 50  ; Сравниваем значение регистра AL со скан-кодом
Je step_50 ; Если клавиша с номером (скан-код) нажата
 
;==========================================================
Cli
Jmp  keyboard_000002
 
 
Mov ebx,0
 
 
 
 printer:
 Sub ecx,1
 Test ecx,ecx
 Jz keyboard_000002
 
 Movsb
 Mov  al, 0F0h ;Цвет
 Stosb
 Jmp printer
 
 
 
;Q
step_16:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 16 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_16 ;Цикл ожидания
 
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_q  ; Данные для вывода
Mov  ecx,2
Cld
Jmp printer
 
;W
step_17:
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 17 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_17 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_w  ; Данные для вывода
Mov  ecx,2
Cld
Jmp printer
 
;E
step_18:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 18 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_18 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_e  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
;R
step_19:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 19 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_19 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_r  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
;T
step_20:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 20 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_20 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_t  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
;Y
step_21:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 21 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_21 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_y  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;U
step_22:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 22 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_22 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_u  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;I
step_23:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 23 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_23 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_i  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;O
step_24:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 24 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_24 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_o  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;P
step_25:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 25 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_25 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_p  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
 
;A
step_30:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 30 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_30 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_a  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;S
step_31:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 31 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_31 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_s  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;D
step_32:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 32 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_32 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_d  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
 
;F
step_33:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 33 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_33 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_f  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
 
;G
step_34:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 34 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_34 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_g  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;H
step_35:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 35 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_35 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_h  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;J
step_36:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 36 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_36 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_j  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
 
;K
step_37:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 37 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_37 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_k  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;L
step_38:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 38 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_38 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_l  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
 
;Z
step_44:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 44 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_44 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_z  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
 
;X
step_45:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 45 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_45 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_x  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;C
step_46:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 46 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_46 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_c  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;V
step_47:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 47 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_47 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_v  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;B
step_48:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 48 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_48 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_b  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;N
step_49:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 49 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_49 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_n  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
;Z
step_50:
 
Xor al,al  ;Обнуляем регистр
In al,60h  ;Выводим в AL значение, получшенное с порта 60H (клавиатура PS/2)
Cmp al, 50 ;равниваем значение регистра AL со значением, полученным с порта 60H
Je step_50 ;Цикл ожидания
Add     ebx,2
Mov     edi,0x0000B8000  ;Начало видеопамяти
Xor     di,di         ; DI = 0, адрес начала видеопамяти в ES:DI
Sub     edi,222
Add     edi,ebx
Mov     esi,_sumbl_n  ; Данные для вывода
 
Mov  ecx,2
Cld
Jmp printer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
step_r:
In al,60h   ; Читаем порт PS/2 клавиатуры
Cmp al, 3  ; Сравниваем значение регистра AL со скан-кодом
Je step_r ; Если клавиша с номером (скан-код) нажата, т
 
 Add ebx,2
 Mov     edi,0B8000h  ;Начало видеопамяти
 Xor     edi,edi         ; DI = 0, адрес начала видеопамяти в ES:DI
 Add     edi,ebx
 Mov     esi,pytp ; Данные для вывода
 Mov  ecx,7
 Jmp print1
 
pytp db 'Moding',0
 
jmp  keyboard_000002
 
step_yy:
In al,60h   ; Читаем порт PS/2 клавиатуры
Cmp al, 4  ; Сравниваем значение регистра AL со скан-кодом
Je step_yy ; Если клавиша с номером (скан-код) нажата, т
 Add ebx,2
 Mov     edi,0B8000h  ;Начало видеопамяти
 Xor     edi,edi         ; DI = 0, адрес начала видеопамяти в ES:DI
 Add     edi,ebx
 Mov     esi,rytper ; Данные для вывода
Mov  ecx,7
 Jmp print1
 
rytper db 'petuxi',0
 
jmp  keyboard_000002
 
 
 
 
 
;Символы
_sumbl_q db 'q',000000000000000
_sumbl_w db 'w',000000000000000
_sumbl_e db 'e',000000000000000
_sumbl_r db 'r',000000000000000
_sumbl_t db 't',000000000000000
_sumbl_y db 'y',000000000000000
_sumbl_u db 'u',000000000000000
_sumbl_i db 'i',000000000000000
_sumbl_o db 'o',000000000000000
_sumbl_p db 'p',000000000000000
_sumbl_a db 'a',000000000000000
_sumbl_s db 's',000000000000000
_sumbl_d db 'd',000000000000000
_sumbl_f db 'f',000000000000000
_sumbl_g db 'g',000000000000000
_sumbl_h db 'h',000000000000000
_sumbl_j db 'j',000000000000000
_sumbl_k db 'k',000000000000000
_sumbl_l db 'l',000000000000000
_sumbl_z db 'z',000000000000000
_sumbl_x db 'x',000000000000000
_sumbl_c db 'c',000000000000000
_sumbl_v db 'v',000000000000000
_sumbl_b db 'b',000000000000000
_sumbl_n db 'n',000000000000000
_sumbl_m db 'm',000000000000000
 
 
 
 
;Числа
_sumbl0 db '0',0
_sumbl1 db '1',0
_sumbl2 db '2',0
_sumbl3 db '3',0
_sumbl4 db '4',0
_sumbl5 db '5',0
_sumbl6 db '6',0
_sumbl7 db '7',0
_sumbl8 db '8',0
_sumbl9 db '9',0
 
;--------------------------------
;Основные сообщения
 
;Сообщение первичного загрузчика
startboot1 db 'Boot system',0,0
 
;Сообщение включения защищенного режима
pmode_message db 'Protected mode',0,0
 
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
 
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
                                                                                             
;--------------------------------
; Таблица дескрипторов
 
 
  align   4
 
gdt:
gdt_null:
  dd 0
  dd 0
 
gdt_code:
  dw 0FFFFh
  dw 0
  db 0
  db 0x9a
  db 0xcf
  db 0
 
gdt_data:
  dw 0FFFFh
  dw 0
  db 0
  db 0x92
  db 0xcf
  db 0
         
gdtr:
    dw gdtr-gdt_null-1
    dd gdt
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.10.2013, 04:53
Ответы с готовыми решениями:

Текстовый курсор в защищенном режиме
Собственно,как проводить операции с курсором не используя прерывания DOS и BIOS? Например,изменить его позицию?

Работа с файлами в защищенном режиме
Здравствуйте, я взялся писать ОС, уже готов загрузчик переводящий в защищенный режим процессор, IDT GDT разумеется тоже. Хотелось бы...

Не обрабатываются прерывания в защищенном режиме
Здравствуйте! Помогите, пожалуйста, найти и исправить ошибку. Программа должна переводить процессор в защищенный режим и обрабатывать...

23
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
17.10.2013, 00:21  [ТС]
Студворк — интернет-сервис помощи студентам
ну это нечто вроде консоли.Команды вводятся и даже выполняются.Проблема возникает при повторном использовании однообразных команд.даже из-за nop в злоупотреблении все накрывается.В реальном режиме этовсе отлично работает
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
17.10.2013, 00:24
забейте. удалите это все. начните с хелло ворлда. затем обработка прерываний. затем будет Вам консоль, только более менее похожая а человеческую
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
17.10.2013, 00:31  [ТС]
Сегодняшний хелоуворлд наступил на те же грабли.И дело,видимо,в битности
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
18.10.2013, 00:07
нет, не в битах дело. завтра приведу пример нормального хелло ворлда

Добавлено через 23 часа 19 минут
признаюсь - содрал с хабра. но это то самое, что нужно.
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
;16-битная адресация, пока мы находимся в реальном режиме
use16
org 0x7c00
start:
  jmp 0x0000:entry              ;теперь CS=0, IP=0x7c00
entry:
  mov ax, cs
  mov ds, ax
 
;очистить экран
  mov ax, 0x0003
  int 0x10
 
;открыть A20
  in  al, 0x92
  or  al, 2
  out 0x92, al
 
;Загрузить адрес и размер GDT в GDTR
  lgdt  [gdtr]
;Запретить прерывания
  cli
;Запретить немаскируемые прерывания
  in  al, 0x70
  or  al, 0x80
  out 0x70, al
 
;Переключиться в защищенный режим
  mov  eax, cr0
  or   al, 1
  mov  cr0, eax
 
;Загрузить в CS:EIP точку входа в защищенный режим
  O32 jmp 00001000b:pm_entry
 
;32-битная адресация
use32
;Точка входа в защищенный режим
pm_entry:
;Загрузить сегментные регистры (кроме SS)
  mov  ax, cs
  mov  ds, ax
  mov  es, ax
 
  mov  edi, 0xB8000             ;начало видеопамяти в видеорежиме 0x3
  mov  esi, msg                 ;выводимое сообщение
  cld
.loop                           ;цикл вывода сообщения
  lodsb                         ;считываем очередной символ строки
  test al, al                   ;если встретили 0
  jz   .exit                    ;прекращаем вывод
  stosb                         ;иначе выводим очередной символ
  mov  al, 7                    ;и его атрибут в видеопамять
  stosb
  jmp  .loop
.exit
 
  jmp  $                        ;зависаем
 
msg:
  db  'Hello World!', 0
 
;Глобальная таблица дескрипторов.
;Нулевой дескриптор использовать нельзя!
gdt:
  db  0x00, 0x00, 0x00, 0x00, 0x00,      0x00,      0x00, 0x00 
  db  0xFF, 0xFF, 0x00, 0x00, 0x00, 10011010b, 11001111b, 0x00
gdt_size  equ $ - gdt
 
;данные, загружаемые в регистр GDTR
gdtr:
  dw  gdt_size - 1
  dd  gdt
 
finish:
times 2048-finish+start db 0
db   0x55, 0xAA ; сигнатура загрузочного сектора
Добавлено через 3 минуты
качаете книгу Руслана Аблязова, читаете сей исходник, обращаете внимание на комментарии, ничего не понимаете (мб и понимаете, в зависимости от Ваших познаний), читаете книгу, несколько раз перечитываете соответствующую главу, когда придет понимание опять читаете исходник, все понимаете, изменяете\добавляете\убираете пару строк, радуетесь, что работает. затем опять к книге - читаете про обработку прерываний. как-то так ну и обращаетесь сюда если что-то совсем не понятно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.10.2013, 00:07

Вывод символов в защищенном режиме. VirtualBox
Самое странное,что код,который работает на реальной машине,в VirtualBox не работает: print_: ;Функция вывода сообщений (консоль) ...

Способы переключения видео режимов на современных видеокартах в защищенном режиме
Давайте обсуждать способы переключения видео режимов на современных видеокартах в защищенном режиме. Кто может, выкладывайте маны или...

LTR зависает (приложение по переключению задач в защищённом режиме)
Всем привет , пишу приложение по переключению задач в защищённом режиме. Всё вроде бы нормально, как только не натыкаемся на команду LTR,...

Память в защищенном режиме
Всем доброго дня! Я, наконец, сдал основные экзамены и теперь снова могу заняться столь интересным для меня делом!)) Я многое забыл и...

Прерывания в защищенном режиме
Помогите пожалуйста разобраться с прерываниями в защищенном режиме.Какие обращения к памяти есть. Какие ошибки могут быть, есть ли...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru