Advertisement
Guest User

protected.asm

a guest
May 24th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.57 KB | None | 0 0
  1. [BITS 16]
  2. [ORG 0x7c00]        ;; адрес загрузки ОС из BIOS, по соглашению
  3. _start:
  4.     cli
  5.     mov ax, cs
  6.     mov ds, ax
  7.     mov ss, ax
  8.     mov sp, _start
  9.  
  10.     ;; Загрузка регистра GDTR:
  11.     lgdt [gd_reg]
  12.  
  13.     ;; Включение A20:
  14.     in al, 0x92         ; читаем из чипсета его конфигурацию
  15.     or al, 2            ; меняем один бит
  16.     out 0x92, al        ; записываем обратно
  17.  
  18.     ;; Установка бита PE регистра CR0 (включение системы защиты)
  19.     mov eax, cr0
  20.     or al, 1
  21.     mov cr0, eax
  22.  
  23.     ;; С помощью длинного прыжка мы загружаем
  24.     ;; селектор нужного сегмента в регистр CS
  25.     ;; (напрямую это сделать нельзя)
  26.     ;; 8 (1000b) - первый дескриптор в GDT, RPL=0
  27.     jmp 0x8: _protected             ; то есть jmp записывает регистр CS, 8 - смещение в таблице GDT!!!!
  28.                                     ; компилятор подставит адрес _protected
  29.  
  30.  
  31. [BITS 32]
  32. _protected:
  33.     ;; Загрузим регистры DS и SS селектором
  34.     ;; сегмента данных
  35.     mov ax, 0x10            ; дескриптор сегмента данных (смещение в таблице дескрипторов)
  36.     mov ds, ax
  37.     mov ss, ax
  38.  
  39.  
  40. ;; MEMCHECK
  41. %define MEM_START   0x100000
  42. %define MEM_END     0x2000000
  43. %define PARTICLE    0x2000000
  44.  
  45.     mov ecx, MEM_START
  46.     mov al, 0x42
  47. .writing:
  48.     mov [ecx], al ; заносим al по АДРЕСУ ecx
  49.     inc ecx
  50.  
  51.     mov edx, ecx
  52.     and edx, 0xFFFFF  ; отрезаем мегабайты
  53.     cmp edx, 0
  54.     jne .checkw
  55.  
  56.     mov bl, 00011010b
  57.     mov esi, msg_mb_write
  58.     call kputs
  59.  
  60. .checkw
  61.     cmp ecx, MEM_END
  62.     jl .writing
  63.  
  64.     mov ecx, PARTICLE
  65.     xor dl, dl
  66.     mov [ecx], dl
  67.  
  68.  
  69.     ; mov esi, msg_n
  70.     ; call kputs
  71.  
  72.  
  73.     mov ecx, MEM_START
  74.     mov al, 0x42
  75. .reading:
  76.     mov bl, [ecx]
  77.     cmp al, bl
  78.     jne .memory_bad
  79.     inc ecx
  80.  
  81.     mov edx, ecx
  82.     and edx, 0xFFFFF  ; отрезаем мегабайты
  83.  
  84.     mov bl, 00011001b
  85.     mov esi, msg_mb_read
  86.  
  87.     cmp edx, 0
  88.     jne .checkr
  89.     call kputs
  90.  
  91. .checkr:
  92.     cmp ecx, MEM_END
  93.     jl .reading
  94.  
  95.  
  96.     ; mov esi, msg_n
  97.     ; call kputs
  98.  
  99.  
  100.     mov esi, msg_good
  101.     mov bl, 00001010b
  102.     call kputs
  103.     jmp end
  104.  
  105. .memory_bad:
  106.     mov esi, msg_bad
  107.     mov bl, 00001100b
  108.     call kputs
  109.     jmp end
  110.  
  111. end:
  112.     ;; Завесим процессор
  113.     hlt
  114.     jmp short $
  115.  
  116.  
  117. cursor: dd 0
  118. %define VIDEO_RAM 0xB8000
  119.  
  120. ;; Функция выполняет прямой вывод в память видеоадаптера
  121. ;; которая находится в VGA-картах (и не только) по адресу 0xB8000
  122.  
  123. kputs:
  124.     pusha
  125. .loop:
  126.     lodsb
  127.     test al, al
  128.     jz .quit
  129.  
  130.     mov ecx, [cursor]
  131.     mov [VIDEO_RAM+ecx*2], al
  132.     mov al, bl              ; M,RGB:Я,RGB
  133.     mov [VIDEO_RAM+ecx*2+1], al
  134.     inc dword [cursor]
  135.     jmp short .loop
  136.  
  137. .quit:
  138.     popa
  139.     ret
  140.  
  141.  
  142. gdt:
  143.     dw 0, 0, 0, 0   ; Нулевой дескриптор
  144.  
  145.     db 0xFF     ; Сегмент кода с DPL=0
  146.     db 0xFF     ; Базой=0 и Лимитом=4 Гб
  147.     db 0x00
  148.     db 0x00
  149.     db 0x00
  150.     db 10011010b ; есть право на исполнение
  151.     db 0xCF
  152.     db 0x00
  153.  
  154.     db 0xFF     ; Сегмент данных с DPL=0
  155.     db 0xFF     ; Базой=0 и Лимитом=4Гб
  156.     db 0x00
  157.     db 0x00
  158.     db 0x00
  159.     db 10010010b
  160.     db 0xCF
  161.     db 0x00
  162.  
  163.  
  164.     ;; Значение, которое мы загрузим в GDTR:
  165. gd_reg:
  166.     dw 8192
  167.     dd gdt
  168.  
  169. msg_n:      db "\n", 0
  170. msg_good:   db "Memory GOOD",0
  171. msg_bad:    db "Memory BAD", 0
  172. msg_mb_write: db "w", 0
  173. msg_mb_read: db "r", 0
  174.  
  175.     times 510-($-$$) db 0
  176.     db 0xaa, 0x55
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement