質問編集履歴
7
修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
gcc nasm書式のアセンブリコードを吐かせたい
|
1
|
+
gcc nasm書式のアセンブリコードを吐かせたい
|
body
CHANGED
File without changes
|
6
追記
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
gcc nasm書式のアセンブリコードを吐かせたい
|
1
|
+
gcc nasm書式のアセンブリコードを吐かせたい|インラインアセンブラが適用されていない?
|
body
CHANGED
File without changes
|
5
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -199,4 +199,12 @@
|
|
199
199
|
|
200
200
|
```
|
201
201
|
中身で_set_gate関数を呼び出していないばかりか
|
202
|
-
_set_gate関数自体ない気がするのですが・・・
|
202
|
+
_set_gate関数自体ない気がするのですが・・・
|
203
|
+
|
204
|
+
_set_gateを定義しないまま上記からコンパイルしようとしたところ
|
205
|
+
```cmd
|
206
|
+
../16_protect_mode/sample.asm:13: error: symbol `__set_gate' undefined
|
207
|
+
../16_protect_mode/sample.asm:19: error: label `_set_system_intr_gate' changed during code generation [-w+error=label-redef-late]
|
208
|
+
../16_protect_mode/sample.asm:28: error: symbol `__set_gate' undefined
|
209
|
+
```
|
210
|
+
と出たのでどこかしらに_set_gateがあるはずなのだが・・・
|
4
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -141,4 +141,62 @@
|
|
141
141
|
|
142
142
|
それで質問なのですが
|
143
143
|
上記のやり方でプログラムは正しく動くのでしょうか?
|
144
|
-
たまたまうまくいっているように見えるだけでしょうか?
|
144
|
+
たまたまうまくいっているように見えるだけでしょうか?
|
145
|
+
### 不明点1 インラインアセンブラが反映されていない?
|
146
|
+
[リンク内容](https://elixir.bootlin.com/linux/v2.6.17.8/source/arch/i386/kernel/traps.c#L1090)
|
147
|
+
|
148
|
+
LinuxカーネルのIDT登録関数を持ってきました。
|
149
|
+
```s
|
150
|
+
#define _set_gate(gate_addr,type,dpl,addr,seg) \
|
151
|
+
do { \
|
152
|
+
int __d0, __d1; \
|
153
|
+
__asm__ __volatile__ ("movw %%dx,%%ax\n\t" \
|
154
|
+
"movw %4,%%dx\n\t" \
|
155
|
+
"movl %%eax,%0\n\t" \
|
156
|
+
"movl %%edx,%1" \
|
157
|
+
:"=m" (*((long *) (gate_addr))), \
|
158
|
+
"=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \
|
159
|
+
:"i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
|
160
|
+
"3" ((char *) (addr)),"2" ((seg) << 16)); \
|
161
|
+
} while (0)
|
162
|
+
|
163
|
+
|
164
|
+
/*
|
165
|
+
* This needs to use 'idt_table' rather than 'idt', and
|
166
|
+
* thus use the _nonmapped_ version of the IDT, as the
|
167
|
+
* Pentium F0 0F bugfix can have resulted in the mapped
|
168
|
+
* IDT being write-protected.
|
169
|
+
*/
|
170
|
+
void set_intr_gate(unsigned int n, void *addr)
|
171
|
+
{
|
172
|
+
_set_gate(0,14,0,0,0);
|
173
|
+
/* 注意 値は適当です*/
|
174
|
+
}
|
175
|
+
```
|
176
|
+
```s
|
177
|
+
_set_intr_gate:; Function begin
|
178
|
+
push ebp ; 0025 _ 55
|
179
|
+
mov ebp, esp ; 0026 _ 89. E5
|
180
|
+
push ebx ; 0028 _ 53
|
181
|
+
sub esp, 16 ; 0029 _ 83. EC, 10
|
182
|
+
mov ecx, 0 ; 002C _ B9, 00000000
|
183
|
+
mov ebx, 4 ; 0031 _ BB, 00000004
|
184
|
+
mov edx, 0 ; 0036 _ BA, 00000000
|
185
|
+
mov eax, 0 ; 003B _ B8, 00000000
|
186
|
+
mov ax, dx ; 0040 _ 66: 89. D0
|
187
|
+
; Note: Length-changing prefix causes delay on Intel processors
|
188
|
+
mov dx, 36352 ; 0043 _ 66: BA, 8E00
|
189
|
+
mov dword [ecx], eax ; 0047 _ 89. 01
|
190
|
+
mov dword [ebx], edx ; 0049 _ 89. 13
|
191
|
+
mov dword [ebp-8H], eax ; 004B _ 89. 45, F8
|
192
|
+
mov dword [ebp-0CH], edx ; 004E _ 89. 55, F4
|
193
|
+
nop ; 0051 _ 90
|
194
|
+
add esp, 16 ; 0052 _ 83. C4, 10
|
195
|
+
pop ebx ; 0055 _ 5B
|
196
|
+
pop ebp ; 0056 _ 5D
|
197
|
+
ret ; 0057 _ C3
|
198
|
+
; _set_intr_gate End of function
|
199
|
+
|
200
|
+
```
|
201
|
+
中身で_set_gate関数を呼び出していないばかりか
|
202
|
+
_set_gate関数自体ない気がするのですが・・・
|
3
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -141,5 +141,4 @@
|
|
141
141
|
|
142
142
|
それで質問なのですが
|
143
143
|
上記のやり方でプログラムは正しく動くのでしょうか?
|
144
|
-
たまたまうまくいっているように見えるだけでしょうか?
|
144
|
+
たまたまうまくいっているように見えるだけでしょうか?
|
145
|
-
(ん?このアセンブリコードなんかおかしいような・・・)
|
2
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -141,4 +141,5 @@
|
|
141
141
|
|
142
142
|
それで質問なのですが
|
143
143
|
上記のやり方でプログラムは正しく動くのでしょうか?
|
144
|
-
たまたまうまくいっているように見えるだけでしょうか?
|
144
|
+
たまたまうまくいっているように見えるだけでしょうか?
|
145
|
+
(ん?このアセンブリコードなんかおかしいような・・・)
|
1
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -138,6 +138,7 @@
|
|
138
138
|
エラーなくしてコンパイルできました。
|
139
139
|
(実際にカーネル内でcall aaaをしてもエラーはでなかった。)
|
140
140
|
|
141
|
+
|
141
142
|
それで質問なのですが
|
142
143
|
上記のやり方でプログラムは正しく動くのでしょうか?
|
143
144
|
たまたまうまくいっているように見えるだけでしょうか?
|