x86 Видеопамять очистить экран вылет

В настоящее время я пишу 32-битное ядро ​​​​для своей операционной системы, но столкнулся с проблемой.

При попытке очистить экран с помощью метода из здесь происходит сбой bochs со следующим сообщением:

[CPU ]prefetch: getHostMemAddr наложил вето на прямое чтение, pAddr=0xa0000

Метод clear_screen32 (запущен в защищенном режиме):

;================================;
; Clears the screen (in 32 bits) ;
;================================; 
clear_screen32:

    pusha
    cld
    mov edi, vmem
    mov cx, 2000
    mov ah, c_attrib

    mov al, ' ' 
    rep stosw

    mov byte [_xpos], 0
    mov byte [_ypos], 0
    popa
    ret

Что здесь может быть не так?

Изменить: я опечатался, это getHostMemAddr, а не getHostByAddr

*EDIT2: ошибка возникает в *

репутация

если я удалю это, код будет работать нормально (но, конечно, без очистки экрана)


person themorfeus    schedule 08.08.2013    source источник
comment
Я предполагаю, что вы находитесь в защищенном режиме, когда вызываете эту подпрограмму (?). У вас есть запись для видеопамяти в вашем GDT?   -  person Michael    schedule 08.08.2013
comment
@Майкл Да, и да. Я также должен отметить, что печать текста с помощью метода с того же сайта работает отлично.   -  person themorfeus    schedule 08.08.2013
comment
Как насчет ЭС? Попробуйте заменить rep stosw на mov word [edi], ax/add edi, 2/dec ecx/jnz .loop - будет работать в DS.   -  person johnfound    schedule 08.08.2013
comment
Почему вы используете rep stosw, когда доступен rep stosd?   -  person Brian Knoblauch    schedule 08.08.2013
comment
rep stosw немного проще понять, поскольку каждый символ состоит из двух байтов (атрибуты и сам код символа).   -  person Drew McGowen    schedule 08.08.2013


Ответы (1)


Хорошо, кажется, что разработчики Bochs (или, может быть, я) немного глупы, поскольку регистр CX не существует в Bochs.
Я узнал, когда вывел информацию о регистре на экран во время отладки. Регистра CX там просто нет.

Мое решение? Находясь в 32-битном режиме и имея доступ к 32-битным регистрам, я просто заменил регистр CX на ECX, что действительно сработало, и экран полностью очистился.

person themorfeus    schedule 08.08.2013
comment
Это не может быть правдой. Этот эффект связан с тем, что в 32-битном режиме инструкция rep работает с ecx, но в старших 16-битных ecx был некоторый мусор. - person johnfound; 08.08.2013
comment
О, не знал этого. Но странно, что cx не появляется при использовании info r в режиме отладки... - person themorfeus; 08.08.2013
comment
cx — это всего лишь младшие 16 бит ecx. - person Drew McGowen; 08.08.2013
comment
Даже если вы находитесь в 16-битном реальном режиме, вы все равно можете получить доступ к 32-битным регистрам через префикс размера операнда (0x66). Ваш ассемблер, скорее всего, сделает это за вас, когда вы захотите получить доступ к регистру как таковому. - person Levente Kurusa; 16.08.2013
comment
По префиксу размера операнда или префиксу размера адреса, когда они используются в адресе (примечание: эти два параметра не исключают друг друга). - person Griwes; 19.09.2013