質問編集履歴
3
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -213,7 +213,7 @@
|
|
213
213
|
|
214
214
|
/APP
|
215
215
|
# 52 "project1.c" 1
|
216
|
-
MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス
|
216
|
+
MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス EAXの上位16BITにセグメントセレクタ
|
217
217
|
MOV %EAX,%ebx //さきほどのEAXをEBXにコピー
|
218
218
|
MOV %cx,%DX //EDX上位にlooP関数開始アドレス EDX下位に ((short)(0x8000 + (0 << 13) + (0b110 << 8)))←サイズ16bit
|
219
219
|
MOV %EDX,%ecx //先ほどのEDXをECXにコピー
|
@@ -222,10 +222,10 @@
|
|
222
222
|
/NO_APP
|
223
223
|
movl %ecx, %eax //さきほどEAXからEBXにコピーしたものをまたEAXにコピー
|
224
224
|
movl %ebx, %edx //さきほどEDXからECXにコピーしたものをまたEDXにコピー
|
225
|
-
movl %edx, -20(%ebp) //-20(EBP)に 合計32BIT [下位16BITにloop関数開始アドレス
|
225
|
+
movl %edx, -20(%ebp) //-20(EBP)に 合計32BIT [下位16BITにloop関数開始アドレス 上位16BITにセグメントセレクタ] を保存
|
226
226
|
movl %eax, -24(%ebp) //-24(EBP)に 合計32BIT [上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]を保存
|
227
227
|
movl -12(%ebp), %eax //35行目 IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)をEAXにコピー
|
228
|
-
movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス
|
228
|
+
movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス 上位16BITにセグメントセレクタ] をEDXに
|
229
229
|
movl %edx, (%eax)
|
230
230
|
movl -16(%ebp), %eax // 36行目 IDT_Address 上位 0x00000004 (つまりセグメントディスクリプタ上位32bit)をEAXにコピー
|
231
231
|
movl -24(%ebp), %edx //[上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]をEDXにコピー
|
2
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -112,8 +112,87 @@
|
|
112
112
|
|
113
113
|
|
114
114
|
|
115
|
-
アセンブリ出力結果
|
115
|
+
アセンブリ出力結果(こっちでは都合上 LOOP関数を割り込みハンドラとして登録します。)
|
116
116
|
```ここに言語を入力
|
117
|
+
void loop();
|
118
|
+
|
119
|
+
void main_kernel(){
|
120
|
+
|
121
|
+
|
122
|
+
///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
|
123
|
+
// 1
|
124
|
+
//
|
125
|
+
//
|
126
|
+
typedef struct
|
127
|
+
{
|
128
|
+
unsigned short size;
|
129
|
+
void * base;
|
130
|
+
} __attribute__ ((packed)) IDTR;
|
131
|
+
|
132
|
+
IDTR idtr;
|
133
|
+
idtr.size = 128 * 8;
|
134
|
+
idtr.base = 0x00000000;
|
135
|
+
|
136
|
+
|
137
|
+
__asm__ ("lidt %0" :: "m"(*(&idtr)));
|
138
|
+
|
139
|
+
//
|
140
|
+
//
|
141
|
+
//
|
142
|
+
///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
|
143
|
+
|
144
|
+
|
145
|
+
|
146
|
+
///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
|
147
|
+
// 2
|
148
|
+
//
|
149
|
+
//
|
150
|
+
|
151
|
+
int IDT_LOW;
|
152
|
+
int IDT_HIGH;
|
153
|
+
|
154
|
+
void (*p)() = loop;
|
155
|
+
|
156
|
+
|
157
|
+
int *GateAddress_Low = 0x00 * 8 + 0;
|
158
|
+
int *GateAddress_High = 0x00 * 8 + 4;
|
159
|
+
|
160
|
+
__asm__ __volatile__(
|
161
|
+
"MOV %%DX,%%AX\n\t"
|
162
|
+
"MOV %%EAX,%0\n\t"
|
163
|
+
"MOV %2,%%DX\n\t"
|
164
|
+
"MOV %%EDX,%1\n\t"
|
165
|
+
|
166
|
+
:"=b" (IDT_LOW),"=c" (IDT_HIGH)
|
167
|
+
:"c" ((short)(0x8000 + (0 << 13) + (0b110 << 8))),"a" ((0x08)<<16),"d" (p)
|
168
|
+
);
|
169
|
+
|
170
|
+
*GateAddress_Low = IDT_LOW;
|
171
|
+
*GateAddress_High = IDT_HIGH;
|
172
|
+
|
173
|
+
|
174
|
+
//
|
175
|
+
//
|
176
|
+
//
|
177
|
+
///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
__asm__("int $0x00\n\t");
|
182
|
+
|
183
|
+
}
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
void loop(void){
|
188
|
+
|
189
|
+
for(;;){}
|
190
|
+
|
191
|
+
}
|
192
|
+
```
|
193
|
+
|
194
|
+
|
195
|
+
```ここに言語を入力
|
117
196
|
pushl %ebx
|
118
197
|
subl $32, %esp //スタック32バイト確保
|
119
198
|
|
1
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -108,4 +108,48 @@
|
|
108
108
|
|
109
109
|
|
110
110
|
もしかしたら初歩的なミスをしているかもしれませんが・・・
|
111
|
-
どこのコードに誤りがあるのか分からないのでお願いします
|
111
|
+
どこのコードに誤りがあるのか分からないのでお願いします
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
アセンブリ出力結果
|
116
|
+
```ここに言語を入力
|
117
|
+
pushl %ebx
|
118
|
+
subl $32, %esp //スタック32バイト確保
|
119
|
+
|
120
|
+
movw $1024, -30(%ebp) //-30(ebp)に 構造体変数idtr.size = 128 * 8
|
121
|
+
movl $0, -28(%ebp) //-30(ebp)に 構造体変数idtr.base = 0
|
122
|
+
|
123
|
+
lidt -30(%ebp)
|
124
|
+
```
|
125
|
+
こちらがLIDT命令付近と思われる処理です。
|
126
|
+
```ここに言語を入力
|
127
|
+
/NO_APP
|
128
|
+
movl $_loop, -8(%ebp) //-8(ebp) LOOP関数開始アドレス
|
129
|
+
movl $0, -12(%ebp) //-12 = IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)
|
130
|
+
movl $4, -16(%ebp) // -16 = IDT_Address 上位 0x00000004 (つまりセグメントディスクリプタ上位32bit)
|
131
|
+
movl $-31232, %ecx // ECX == ((short)(0x8000 + (0 << 13) + (0b110 << 8))) たぶん16BIT
|
132
|
+
movl $524288, %eax // EAX == (0x08)<<16
|
133
|
+
movl -8(%ebp), %edx //EDX == LOOP関数開始アドレス
|
134
|
+
|
135
|
+
/APP
|
136
|
+
# 52 "project1.c" 1
|
137
|
+
MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス下位16BIT EAXの上位16BITにセグメントセレクタ
|
138
|
+
MOV %EAX,%ebx //さきほどのEAXをEBXにコピー
|
139
|
+
MOV %cx,%DX //EDX上位にlooP関数開始アドレス EDX下位に ((short)(0x8000 + (0 << 13) + (0b110 << 8)))←サイズ16bit
|
140
|
+
MOV %EDX,%ecx //先ほどのEDXをECXにコピー
|
141
|
+
|
142
|
+
# 0 "" 2
|
143
|
+
/NO_APP
|
144
|
+
movl %ecx, %eax //さきほどEAXからEBXにコピーしたものをまたEAXにコピー
|
145
|
+
movl %ebx, %edx //さきほどEDXからECXにコピーしたものをまたEDXにコピー
|
146
|
+
movl %edx, -20(%ebp) //-20(EBP)に 合計32BIT [下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] を保存
|
147
|
+
movl %eax, -24(%ebp) //-24(EBP)に 合計32BIT [上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]を保存
|
148
|
+
movl -12(%ebp), %eax //35行目 IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)をEAXにコピー
|
149
|
+
movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] をEDXに
|
150
|
+
movl %edx, (%eax)
|
151
|
+
movl -16(%ebp), %eax // 36行目 IDT_Address 上位 0x00000004 (つまりセグメントディスクリプタ上位32bit)をEAXにコピー
|
152
|
+
movl -24(%ebp), %edx //[上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]をEDXにコピー
|
153
|
+
movl %edx, (%eax)
|
154
|
+
```
|
155
|
+
こちらがゲート設置処理です。
|