MegaCraZy6
@MegaCraZy6
Юзерь

Ассемблер что не так с кодом?

Хочу залить весь экран один цветом, видео память же лежит по адресу А0000.
Может кто кинуть пофикшеный мойже код чтоб я смог разобрать что не так?

use16
org 0x7c00
start:
  mov ax,4F02h
  mov bx,100h
  int 10h
  in  al, 0x92
  or  al, 2
  out 0x92, al
  lgdt  [gdtr]
  cli                                 
  in  al, 0x70
  or  al, 0x80
  out 0x70, al
  mov  eax, cr0
  or   al, 1
  mov  cr0, eax
  jmp 00001000b:pm_entry
 

use32
pm_entry:
cld         
xor edi,edi 
mov esi,edi 
mov ax,16
mov gs,ax
p0:            
mov al,1Fh
mov [gs:edi],al
inc edi    
cmp edi,307200
jz $    
jmp p0              

gdt:
  db  0x00, 0x00, 0x00, 0x00, 0x00,      0x00,      0x00, 0x00
  db  0xFF, 0xFF, 0x00, 0x00, 0x00, 10011010b, 11001111b, 0x00  
  db  0FFh, 0FFh, 0x00, 0x00, 0x0A, 92h,40h,0     
gdt_size  equ $ - gdt

gdtr:
  dw  gdt_size - 1
  dd  gdt
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
что не так?

В видеорежиме 100h нет гарантии, что вся видеопамять доступна одним непрерывным куском. И если вызвать функцию 0x4f01 прерывания 0x10, то она вернёт структуру, в которой указан размер окна. Мне она возвращает 64К (0x40), что существенно меньше 640 * 400 = 256000:
0x7c00:      mov    $0x4f01,%ax
   0x7c03:      mov    $0x100,%cx
   0x7c06:      mov    $0x7c77,%di
   0x7c09:      int    $0x10
(gdb) x/6hx $di
0x7c77: 0x00bb  0x0007  0x0040  0x0040  0xa000  0x0000

Чтобы обратиться к остальной видеопамяти, нужно либо переключать банки видеопамяти функцией 0x4f05, либо как-то включать линейный доступ к видеопамяти.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы