0

現在、オペレーティング システム用の 32 ビット カーネルを作成していますが、問題に遭遇しました。

hereのメソッドを使用して画面をクリアしようとすると、bochs がクラッシュし、次のメッセージが表示されます。

[CPU ]プリフェッチ: 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

ここで何が問題なのですか?

編集:タイプミス、getHostByAddr ではなく getHostMemAddr です

* EDIT2: エラーは次の場所で発生します *

担当者

これを削除すると、コードは正常に実行されます (ただし、もちろん画面のクリアはありません)

4

1 に答える 1

-1

ウェルプ、bochs には CX レジスタが存在しないため、bochs の開発者は (またはおそらく私が) 少し愚かであるようです。
デバッグ中にレジスタ情報を画面にダンプしたときにわかりました。CXレジスタはそこには存在しません。

私の解決策は?32 ビット モードで、32 ビット レジスタにアクセスできるので、CX レジスタを ECX に置き換えるだけで、正常に機能し、画面が完全にクリアされました。

于 2013-08-08T16:26:20.620 に答える