質問編集履歴

7

修正

2020/03/06 01:11

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
@@ -1 +1 @@
1
- gcc nasm書式のアセンブリコードを吐かせたい|インラインアセンブラが適用されていない?
1
+ gcc nasm書式のアセンブリコードを吐かせたい
test CHANGED
File without changes

6

追記

2020/03/06 01:10

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
@@ -1 +1 @@
1
- gcc nasm書式のアセンブリコードを吐かせたい
1
+ gcc nasm書式のアセンブリコードを吐かせたい|インラインアセンブラが適用されていない?
test CHANGED
File without changes

5

追記

2020/03/05 20:31

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -401,3 +401,19 @@
401
401
  中身で_set_gate関数を呼び出していないばかりか
402
402
 
403
403
  _set_gate関数自体ない気がするのですが・・・
404
+
405
+
406
+
407
+ _set_gateを定義しないまま上記からコンパイルしようとしたところ
408
+
409
+ ```cmd
410
+
411
+ ../16_protect_mode/sample.asm:13: error: symbol `__set_gate' undefined
412
+
413
+ ../16_protect_mode/sample.asm:19: error: label `_set_system_intr_gate' changed during code generation [-w+error=label-redef-late]
414
+
415
+ ../16_protect_mode/sample.asm:28: error: symbol `__set_gate' undefined
416
+
417
+ ```
418
+
419
+ と出たのでどこかしらに_set_gateがあるはずなのだが・・・

4

追記

2020/03/05 20:30

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -285,3 +285,119 @@
285
285
  上記のやり方でプログラムは正しく動くのでしょうか?
286
286
 
287
287
  たまたまうまくいっているように見えるだけでしょうか?
288
+
289
+ ### 不明点1 インラインアセンブラが反映されていない?
290
+
291
+ [リンク内容](https://elixir.bootlin.com/linux/v2.6.17.8/source/arch/i386/kernel/traps.c#L1090)
292
+
293
+
294
+
295
+ LinuxカーネルのIDT登録関数を持ってきました。
296
+
297
+ ```s
298
+
299
+ #define _set_gate(gate_addr,type,dpl,addr,seg) \
300
+
301
+ do { \
302
+
303
+ int __d0, __d1; \
304
+
305
+ __asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
306
+
307
+ "movw %4,%%dx\n\t" \
308
+
309
+ "movl %%eax,%0\n\t" \
310
+
311
+ "movl %%edx,%1" \
312
+
313
+ :"=m" (*((long *) (gate_addr))), \
314
+
315
+ "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \
316
+
317
+ :"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
318
+
319
+ "3" ((char *) (addr)),"2" ((seg) << 16)); \
320
+
321
+ } while (0)
322
+
323
+
324
+
325
+
326
+
327
+ /*
328
+
329
+ * This needs to use 'idt_table' rather than 'idt', and
330
+
331
+ * thus use the _nonmapped_ version of the IDT, as the
332
+
333
+ * Pentium F0 0F bugfix can have resulted in the mapped
334
+
335
+ * IDT being write-protected.
336
+
337
+ */
338
+
339
+ void set_intr_gate(unsigned int n, void *addr)
340
+
341
+ {
342
+
343
+ _set_gate(0,14,0,0,0);
344
+
345
+ /* 注意 値は適当です*/
346
+
347
+ }
348
+
349
+ ```
350
+
351
+ ```s
352
+
353
+ _set_intr_gate:; Function begin
354
+
355
+ push ebp ; 0025 _ 55
356
+
357
+ mov ebp, esp ; 0026 _ 89. E5
358
+
359
+ push ebx ; 0028 _ 53
360
+
361
+ sub esp, 16 ; 0029 _ 83. EC, 10
362
+
363
+ mov ecx, 0 ; 002C _ B9, 00000000
364
+
365
+ mov ebx, 4 ; 0031 _ BB, 00000004
366
+
367
+ mov edx, 0 ; 0036 _ BA, 00000000
368
+
369
+ mov eax, 0 ; 003B _ B8, 00000000
370
+
371
+ mov ax, dx ; 0040 _ 66: 89. D0
372
+
373
+ ; Note: Length-changing prefix causes delay on Intel processors
374
+
375
+ mov dx, 36352 ; 0043 _ 66: BA, 8E00
376
+
377
+ mov dword [ecx], eax ; 0047 _ 89. 01
378
+
379
+ mov dword [ebx], edx ; 0049 _ 89. 13
380
+
381
+ mov dword [ebp-8H], eax ; 004B _ 89. 45, F8
382
+
383
+ mov dword [ebp-0CH], edx ; 004E _ 89. 55, F4
384
+
385
+ nop ; 0051 _ 90
386
+
387
+ add esp, 16 ; 0052 _ 83. C4, 10
388
+
389
+ pop ebx ; 0055 _ 5B
390
+
391
+ pop ebp ; 0056 _ 5D
392
+
393
+ ret ; 0057 _ C3
394
+
395
+ ; _set_intr_gate End of function
396
+
397
+
398
+
399
+ ```
400
+
401
+ 中身で_set_gate関数を呼び出していないばかりか
402
+
403
+ _set_gate関数自体ない気がするのですが・・・

3

追記

2020/03/05 20:00

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -285,5 +285,3 @@
285
285
  上記のやり方でプログラムは正しく動くのでしょうか?
286
286
 
287
287
  たまたまうまくいっているように見えるだけでしょうか?
288
-
289
- (ん?このアセンブリコードなんかおかしいような・・・)

2

追記

2020/03/05 06:52

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -285,3 +285,5 @@
285
285
  上記のやり方でプログラムは正しく動くのでしょうか?
286
286
 
287
287
  たまたまうまくいっているように見えるだけでしょうか?
288
+
289
+ (ん?このアセンブリコードなんかおかしいような・・・)

1

追記

2020/03/05 06:47

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -278,6 +278,8 @@
278
278
 
279
279
 
280
280
 
281
+
282
+
281
283
  それで質問なのですが
282
284
 
283
285
  上記のやり方でプログラムは正しく動くのでしょうか?