質問編集履歴

5

追記

2015/08/07 03:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,146 @@
2
2
 
3
3
 
4
4
 
5
+ ***追記*******
6
+
7
+ **A20以上有効とプロテクトモード有効をBIOSサービス割り込みのシステムサービスでやっても、重大エラーが起きたので、もしかしたらGDTの内容が間違っている部分があるかもしれません。よろしければGDTの解説もお願いします。**
8
+
9
+
10
+
11
+ **【変更したソースの一部】**
12
+
13
+ **前**
14
+
15
+ ```Assembly
16
+
17
+ CALL Enable_A20;A20以上有効
18
+
19
+
20
+
21
+ MOV EAX, CR0; CR0レジスタの値を読み出します
22
+
23
+ OR EAX, 1; PEビットをOR命令でONします
24
+
25
+ MOV CR0, EAX; そのままCR0に書き込みます
26
+
27
+ JMP CODE_DESC:OS32
28
+
29
+ -------------------------------------------------------------------------------------------------
30
+
31
+ Enable_A20:
32
+
33
+ CLI; 割り込み禁止
34
+
35
+
36
+
37
+ CALL A20wait; ウェイト処理
38
+
39
+ MOV AL, 0xAD; キーボード無効化
40
+
41
+ OUT 0x64, AL
42
+
43
+
44
+
45
+ CALL A20wait; ウェイト処理
46
+
47
+ MOV AL, 0xD0; リードアウトプットポートコマンド送信
48
+
49
+ OUT 0x64, AL
50
+
51
+
52
+
53
+ CALL A20wait2; アウトプットポートの値が書き込まれるまでウェイト
54
+
55
+ IN AL, 0x60; リードバッファレジスタ読み込み
56
+
57
+ PUSH EAX; 読み込んだデータをスタックに保存
58
+
59
+
60
+
61
+ CALL A20wait; ウェイト処理
62
+
63
+ MOV AL, 0xD1; ライトアウトプットポートコマンド送信
64
+
65
+ OUT 0x64, AL
66
+
67
+
68
+
69
+ CALL A20wait; ウェイト処理
70
+
71
+ POP EAX; 読み込んだアウトプットポートの値を元に戻す
72
+
73
+ OR AL, 0x2; A20有効ビットを1にする
74
+
75
+ OUT 0x60, AL; A20有効にする出力データを送信
76
+
77
+
78
+
79
+ CALL A20wait; ウェイト処理
80
+
81
+ MOV AL, 0xAE; キーボード有効
82
+
83
+ OUT 0x64, AL
84
+
85
+
86
+
87
+ CALL A20wait; ウェイト処理
88
+
89
+
90
+
91
+ STI; 割り込み有効
92
+
93
+ RET
94
+
95
+ A20wait:; ウェイト処理関数
96
+
97
+ IN AL, 0x64; ステータスレジスタ読み込み
98
+
99
+ TEST AL, 0x2; 送信したコマンド処理が完了をチェック
100
+
101
+ JNZ A20wait; 完了していない場合はループ
102
+
103
+ RET
104
+
105
+ A20wait2:; アウトプットポートの値が書き込まれるまでウェイト処理関数
106
+
107
+ IN AL, 0x64; ステータスレジスタ読み込み
108
+
109
+ TEST AL, 0x1; 値が書き込まれたかインプットバッファフルをチェック
110
+
111
+ JZ A20wait2; 書き込まれていない場合はループ
112
+
113
+ RET
114
+
115
+
116
+
117
+ ```
118
+
119
+ **今**
120
+
121
+ ```Assembly
122
+
123
+ MOV AX, 0x2401;A20以上有効
124
+
125
+ INT 0x15
126
+
127
+
128
+
129
+ MOV AH, 0x89;プロテクトモード有効
130
+
131
+ PUSH CODE_DESC
132
+
133
+ POP ES
134
+
135
+ MOV SI, OS32
136
+
137
+ INT 0x15
138
+
139
+ ```
140
+
141
+
142
+
143
+
144
+
5
145
  【仮想OSソフトウェア】
6
146
 
7
147
  Oracle VM VirtualBox

4

特になし

2015/08/07 03:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
File without changes

3

仮想OSソフトウェアの内容追記

2015/08/07 00:23

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
 
4
4
 
5
+ 【仮想OSソフトウェア】
6
+
7
+ Oracle VM VirtualBox
8
+
9
+ VMware
10
+
11
+
12
+
5
13
  【コンパイラ】
6
14
 
7
15
  nasm

2

現状と一部ソースの訂正

2015/08/06 12:30

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -24,6 +24,20 @@
24
24
 
25
25
  CR0でプロテクトモード有効・・・重大エラー発生
26
26
 
27
+ ↓を追記して、コンパイルし、仮想OS起動すると重大エラーが起きました
28
+
29
+ ```Assembly
30
+
31
+ MOV EAX, CR0; CR0レジスタの値を読み出します
32
+
33
+ OR EAX, 1; PEビットをOR命令でONします
34
+
35
+ MOV CR0, EAX; そのままCR0に書き込みます
36
+
37
+ JMP CODE_DESC:OS32
38
+
39
+ ```
40
+
27
41
 
28
42
 
29
43
  【一部ソース】
@@ -298,40 +312,10 @@
298
312
 
299
313
 
300
314
 
301
- MOV EAX, 0x0000A000
302
-
303
- MOV ES, EAX
304
-
305
- MOV DI, 0
306
-
307
- XOR EAX, EAX
308
-
309
- MOV EAX, 15
310
-
311
- .looper:
315
+ fin32:
312
-
313
- MOV DWORD [ES:DI], EAX
314
-
315
- INC DI
316
-
317
-
318
-
319
- CMP DI, 0xFFFF
320
-
321
- JNE .looper
322
-
323
- INC EAX
324
316
 
325
317
  HLT
326
318
 
327
- JMP .looper
328
-
329
-
330
-
331
- fin32:
332
-
333
- HLT
334
-
335
319
  JMP fin32
336
320
 
337
321
  ```

1

タイトル訂正

2015/08/06 05:39

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- プロテクトモードへの移行
1
+ 【アセンブリ言語】プロテクトモードへの移行
test CHANGED
File without changes