teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

7

修正

2020/03/06 01:11

投稿

kazuyakazuya
kazuyakazuya

スコア193

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

6

追記

2020/03/06 01:10

投稿

kazuyakazuya
kazuyakazuya

スコア193

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

5

追記

2020/03/05 20:31

投稿

kazuyakazuya
kazuyakazuya

スコア193

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

追記

2020/03/05 20:30

投稿

kazuyakazuya
kazuyakazuya

スコア193

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

追記

2020/03/05 20:00

投稿

kazuyakazuya
kazuyakazuya

スコア193

title CHANGED
File without changes
body CHANGED
@@ -141,5 +141,4 @@
141
141
 
142
142
  それで質問なのですが
143
143
  上記のやり方でプログラムは正しく動くのでしょうか?
144
- たまたまうまくいっているように見えるだけでしょうか?
144
+ たまたまうまくいっているように見えるだけでしょうか?
145
- (ん?このアセンブリコードなんかおかしいような・・・)

2

追記

2020/03/05 06:52

投稿

kazuyakazuya
kazuyakazuya

スコア193

title CHANGED
File without changes
body CHANGED
@@ -141,4 +141,5 @@
141
141
 
142
142
  それで質問なのですが
143
143
  上記のやり方でプログラムは正しく動くのでしょうか?
144
- たまたまうまくいっているように見えるだけでしょうか?
144
+ たまたまうまくいっているように見えるだけでしょうか?
145
+ (ん?このアセンブリコードなんかおかしいような・・・)

1

追記

2020/03/05 06:47

投稿

kazuyakazuya
kazuyakazuya

スコア193

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
  たまたまうまくいっているように見えるだけでしょうか?