質問編集履歴
7
修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
gcc nasm書式のアセンブリコードを吐かせたい
|
1
|
+
gcc nasm書式のアセンブリコードを吐かせたい
|
test
CHANGED
File without changes
|
6
追記
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
gcc nasm書式のアセンブリコードを吐かせたい
|
1
|
+
gcc nasm書式のアセンブリコードを吐かせたい|インラインアセンブラが適用されていない?
|
test
CHANGED
File without changes
|
5
追記
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
追記
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
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -285,5 +285,3 @@
|
|
285
285
|
上記のやり方でプログラムは正しく動くのでしょうか?
|
286
286
|
|
287
287
|
たまたまうまくいっているように見えるだけでしょうか?
|
288
|
-
|
289
|
-
(ん?このアセンブリコードなんかおかしいような・・・)
|
2
追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -285,3 +285,5 @@
|
|
285
285
|
上記のやり方でプログラムは正しく動くのでしょうか?
|
286
286
|
|
287
287
|
たまたまうまくいっているように見えるだけでしょうか?
|
288
|
+
|
289
|
+
(ん?このアセンブリコードなんかおかしいような・・・)
|
1
追記
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
|
上記のやり方でプログラムは正しく動くのでしょうか?
|