Advertisement
Ladies_Man

#NUP Intel LAB_1(5) (ScanBios)

Jul 2nd, 2014
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .586
  2. _TEXT   segment byte public 'CODE' use16
  3. assume cs:_TEXT, ds:nothing
  4.  
  5. org     100h   
  6.            
  7. start:
  8.         cli             ;Clear Interrupt Flag
  9.         lss     SP, dword ptr STKPTR
  10.         sti             ;Set Interrupt Flag
  11.  
  12.     call    init
  13.     call    stop
  14.  
  15. STKPTR  dw  0FFFEh, 09000h
  16.  
  17. init:  
  18.     mov  dx, 0C000h         ;начинаем с видеокарты
  19. cycle:  mov  DS, dx            
  20.     mov  ax, 80h            ;в адр пространстве модуль занимает диапазон, кратный 2 кб
  21.     cmp  word ptr DS:[0], 0AA55h    ;проверка нначала модуля
  22.     jnz  nxt           
  23.  
  24.     call scanbios
  25.  
  26.     ;xor ax, ax
  27.     movzx  ax, byte ptr DS:[2]  ;размер модуля (3й байт DS) -> ax
  28.  
  29. ;округление вверх
  30.     add  al, 3h         ;число блоков по 512 должно быть кратно 2048/512 (если в конце числа 00 - кратно 4)
  31.     and  al, 0FCh           ;накладываем маску (11111100)
  32.  
  33. ;переход физ -> лог адр
  34.     shl  ax, 5              ;N_блоков * 512 / 16 эквивалентно сдвигу на 5
  35.                     ;512 = 2^9 - размер блока
  36.                     ;0x10 = 2^4 - размер параграфа
  37.  
  38. nxt:    add  dx, ax         ;+2кб
  39.     cmp  dx, 0F000h         ;проверка границы области модулей
  40.     jb  cycle          
  41.     ret
  42.  
  43. scanbios proc near
  44.     cld             ;clear direction flag
  45.     xor     si, si
  46.     xor     cx, cx
  47.     mov     ch, DS:[2]     
  48.     xor     bl, bl
  49.  
  50. chcksm: lodsw               ;переписывает слово, чей адрес в памяти определяется парой регистров DS: (E)SI, в регистр ax
  51.         add     al, ah         
  52.         add     bl, al         
  53.         dec     cx
  54.         jnz     short chcksm
  55.  
  56.         or      bl, bl          ;сумма по модулю 256 всех байт от xxxxx+0 до xxxxx+size*512 должна быть равна 0
  57.         jnz     short skip     
  58.  
  59.         pusha
  60.         push    ds
  61.         push    es
  62.         push    fs
  63.         push    gs
  64.  
  65.         push    CS
  66.         push    offset __ret
  67.         push    DS
  68.         push    3h
  69.         retf
  70. __ret:
  71.         pop     gs
  72.         pop     fs
  73.         pop     es
  74.         pop     ds
  75.         popa
  76. skip:   ret     0
  77. scanbios endp
  78.  
  79. stop    proc    near
  80.     cli
  81.     hlt
  82.     jmp short stop
  83. stop    endp
  84.  
  85. org 0FFF0h
  86.     db  0EAh        ; JMP FAR
  87.     dw  offset start    ; offset
  88.     dw  0F000h      ; segment
  89.  
  90.  
  91. org 0FFFEh
  92.     dw  99FCh       ; PC
  93.  
  94. _TEXT   ends
  95. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement