質問編集履歴

3

追記

2020/11/14 09:45

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -428,7 +428,7 @@
428
428
 
429
429
  # 52 "project1.c" 1
430
430
 
431
- MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス下位16BIT EAXの上位16BITにセグメントセレクタ
431
+ MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス EAXの上位16BITにセグメントセレクタ
432
432
 
433
433
  MOV %EAX,%ebx //さきほどのEAXをEBXにコピー
434
434
 
@@ -446,13 +446,13 @@
446
446
 
447
447
  movl %ebx, %edx     //さきほどEDXからECXにコピーしたものをまたEDXにコピー
448
448
 
449
- movl %edx, -20(%ebp) //-20(EBP)に  合計32BIT [下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] を保存
449
+ movl %edx, -20(%ebp) //-20(EBP)に  合計32BIT [下位16BITにloop関数開始アドレス 上位16BITにセグメントセレクタ] を保存
450
450
 
451
451
  movl %eax, -24(%ebp) //-24(EBP)に  合計32BIT [上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]を保存
452
452
 
453
453
  movl -12(%ebp), %eax //35行目 IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)をEAXにコピー
454
454
 
455
- movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] をEDXに
455
+ movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス 上位16BITにセグメントセレクタ] をEDXに
456
456
 
457
457
  movl %edx, (%eax)    
458
458
 

2

追記

2020/11/14 09:45

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -226,10 +226,168 @@
226
226
 
227
227
 
228
228
 
229
- アセンブリ出力結果
229
+ アセンブリ出力結果(こっちでは都合上 LOOP関数を割り込みハンドラとして登録します。)
230
230
 
231
231
  ```ここに言語を入力
232
232
 
233
+ void loop();
234
+
235
+
236
+
237
+ void main_kernel(){
238
+
239
+
240
+
241
+
242
+
243
+ ///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
244
+
245
+ //          1
246
+
247
+ //
248
+
249
+ //
250
+
251
+ typedef struct
252
+
253
+ {
254
+
255
+ unsigned short size;
256
+
257
+ void * base;
258
+
259
+ } __attribute__ ((packed)) IDTR;
260
+
261
+
262
+
263
+ IDTR idtr;
264
+
265
+ idtr.size = 128 * 8;
266
+
267
+ idtr.base = 0x00000000;
268
+
269
+
270
+
271
+
272
+
273
+ __asm__ ("lidt %0" :: "m"(*(&idtr)));
274
+
275
+
276
+
277
+ //
278
+
279
+ //
280
+
281
+ //
282
+
283
+ ///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+ ///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
292
+
293
+ //          2
294
+
295
+ //
296
+
297
+ //
298
+
299
+
300
+
301
+ int IDT_LOW;
302
+
303
+ int IDT_HIGH;
304
+
305
+
306
+
307
+ void (*p)() = loop;
308
+
309
+
310
+
311
+
312
+
313
+ int *GateAddress_Low = 0x00 * 8 + 0;
314
+
315
+ int *GateAddress_High = 0x00 * 8 + 4;
316
+
317
+
318
+
319
+ __asm__ __volatile__(
320
+
321
+ "MOV %%DX,%%AX\n\t"
322
+
323
+ "MOV %%EAX,%0\n\t"
324
+
325
+ "MOV %2,%%DX\n\t"
326
+
327
+ "MOV %%EDX,%1\n\t"
328
+
329
+
330
+
331
+ :"=b" (IDT_LOW),"=c" (IDT_HIGH)
332
+
333
+ :"c" ((short)(0x8000 + (0 << 13) + (0b110 << 8))),"a" ((0x08)<<16),"d" (p)
334
+
335
+ );
336
+
337
+
338
+
339
+ *GateAddress_Low = IDT_LOW;
340
+
341
+ *GateAddress_High = IDT_HIGH;
342
+
343
+
344
+
345
+
346
+
347
+ //
348
+
349
+ //
350
+
351
+ //
352
+
353
+ ///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+ __asm__("int $0x00\n\t");
362
+
363
+
364
+
365
+ }
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+ void loop(void){
374
+
375
+
376
+
377
+ for(;;){}
378
+
379
+
380
+
381
+ }
382
+
383
+ ```
384
+
385
+
386
+
387
+
388
+
389
+ ```ここに言語を入力
390
+
233
391
  pushl %ebx
234
392
 
235
393
  subl $32, %esp //スタック32バイト確保

1

追記

2020/11/14 02:59

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -219,3 +219,91 @@
219
219
  もしかしたら初歩的なミスをしているかもしれませんが・・・
220
220
 
221
221
  どこのコードに誤りがあるのか分からないのでお願いします
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+ アセンブリ出力結果
230
+
231
+ ```ここに言語を入力
232
+
233
+ pushl %ebx
234
+
235
+ subl $32, %esp //スタック32バイト確保
236
+
237
+
238
+
239
+ movw $1024, -30(%ebp) //-30(ebp)に 構造体変数idtr.size = 128 * 8
240
+
241
+ movl $0, -28(%ebp) //-30(ebp)に 構造体変数idtr.base = 0
242
+
243
+
244
+
245
+ lidt -30(%ebp)
246
+
247
+ ```
248
+
249
+ こちらがLIDT命令付近と思われる処理です。
250
+
251
+ ```ここに言語を入力
252
+
253
+ /NO_APP
254
+
255
+ movl $_loop, -8(%ebp) //-8(ebp) LOOP関数開始アドレス
256
+
257
+ movl $0, -12(%ebp) //-12 = IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)
258
+
259
+ movl $4, -16(%ebp) // -16 = IDT_Address 上位 0x00000004 (つまりセグメントディスクリプタ上位32bit)
260
+
261
+ movl $-31232, %ecx // ECX == ((short)(0x8000 + (0 << 13) + (0b110 << 8))) たぶん16BIT
262
+
263
+ movl $524288, %eax // EAX == (0x08)<<16
264
+
265
+ movl -8(%ebp), %edx //EDX == LOOP関数開始アドレス
266
+
267
+
268
+
269
+ /APP
270
+
271
+ # 52 "project1.c" 1
272
+
273
+ MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス下位16BIT EAXの上位16BITにセグメントセレクタ
274
+
275
+ MOV %EAX,%ebx //さきほどのEAXをEBXにコピー
276
+
277
+ MOV %cx,%DX //EDX上位にlooP関数開始アドレス EDX下位に ((short)(0x8000 + (0 << 13) + (0b110 << 8)))←サイズ16bit
278
+
279
+ MOV %EDX,%ecx //先ほどのEDXをECXにコピー
280
+
281
+
282
+
283
+ # 0 "" 2
284
+
285
+ /NO_APP
286
+
287
+ movl %ecx, %eax     //さきほどEAXからEBXにコピーしたものをまたEAXにコピー
288
+
289
+ movl %ebx, %edx     //さきほどEDXからECXにコピーしたものをまたEDXにコピー
290
+
291
+ movl %edx, -20(%ebp) //-20(EBP)に  合計32BIT [下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] を保存
292
+
293
+ movl %eax, -24(%ebp) //-24(EBP)に  合計32BIT [上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]を保存
294
+
295
+ movl -12(%ebp), %eax //35行目 IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)をEAXにコピー
296
+
297
+ movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] をEDXに
298
+
299
+ movl %edx, (%eax)    
300
+
301
+ movl -16(%ebp), %eax // 36行目 IDT_Address 上位 0x00000004 (つまりセグメントディスクリプタ上位32bit)をEAXにコピー
302
+
303
+ movl -24(%ebp), %edx //[上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]をEDXにコピー
304
+
305
+ movl %edx, (%eax)
306
+
307
+ ```
308
+
309
+ こちらがゲート設置処理です。