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

質問編集履歴

3

追記

2020/11/14 09:45

投稿

kazuyakazuya
kazuyakazuya

スコア193

title CHANGED
File without changes
body CHANGED
@@ -213,7 +213,7 @@
213
213
 
214
214
  /APP
215
215
  # 52 "project1.c" 1
216
- MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス下位16BIT EAXの上位16BITにセグメントセレクタ
216
+ MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス EAXの上位16BITにセグメントセレクタ
217
217
  MOV %EAX,%ebx //さきほどのEAXをEBXにコピー
218
218
  MOV %cx,%DX //EDX上位にlooP関数開始アドレス EDX下位に ((short)(0x8000 + (0 << 13) + (0b110 << 8)))←サイズ16bit
219
219
  MOV %EDX,%ecx //先ほどのEDXをECXにコピー
@@ -222,10 +222,10 @@
222
222
  /NO_APP
223
223
  movl %ecx, %eax     //さきほどEAXからEBXにコピーしたものをまたEAXにコピー
224
224
  movl %ebx, %edx     //さきほどEDXからECXにコピーしたものをまたEDXにコピー
225
- movl %edx, -20(%ebp) //-20(EBP)に  合計32BIT [下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] を保存
225
+ movl %edx, -20(%ebp) //-20(EBP)に  合計32BIT [下位16BITにloop関数開始アドレス 上位16BITにセグメントセレクタ] を保存
226
226
  movl %eax, -24(%ebp) //-24(EBP)に  合計32BIT [上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]を保存
227
227
  movl -12(%ebp), %eax //35行目 IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)をEAXにコピー
228
- movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] をEDXに
228
+ movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス 上位16BITにセグメントセレクタ] をEDXに
229
229
  movl %edx, (%eax)    
230
230
  movl -16(%ebp), %eax // 36行目 IDT_Address 上位 0x00000004 (つまりセグメントディスクリプタ上位32bit)をEAXにコピー
231
231
  movl -24(%ebp), %edx //[上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]をEDXにコピー

2

追記

2020/11/14 09:45

投稿

kazuyakazuya
kazuyakazuya

スコア193

title CHANGED
File without changes
body CHANGED
@@ -112,8 +112,87 @@
112
112
 
113
113
 
114
114
 
115
- アセンブリ出力結果
115
+ アセンブリ出力結果(こっちでは都合上 LOOP関数を割り込みハンドラとして登録します。)
116
116
  ```ここに言語を入力
117
+ void loop();
118
+
119
+ void main_kernel(){
120
+
121
+
122
+ ///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
123
+ //          1
124
+ //
125
+ //
126
+ typedef struct
127
+ {
128
+ unsigned short size;
129
+ void * base;
130
+ } __attribute__ ((packed)) IDTR;
131
+
132
+ IDTR idtr;
133
+ idtr.size = 128 * 8;
134
+ idtr.base = 0x00000000;
135
+
136
+
137
+ __asm__ ("lidt %0" :: "m"(*(&idtr)));
138
+
139
+ //
140
+ //
141
+ //
142
+ ///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
143
+
144
+
145
+
146
+ ///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
147
+ //          2
148
+ //
149
+ //
150
+
151
+ int IDT_LOW;
152
+ int IDT_HIGH;
153
+
154
+ void (*p)() = loop;
155
+
156
+
157
+ int *GateAddress_Low = 0x00 * 8 + 0;
158
+ int *GateAddress_High = 0x00 * 8 + 4;
159
+
160
+ __asm__ __volatile__(
161
+ "MOV %%DX,%%AX\n\t"
162
+ "MOV %%EAX,%0\n\t"
163
+ "MOV %2,%%DX\n\t"
164
+ "MOV %%EDX,%1\n\t"
165
+
166
+ :"=b" (IDT_LOW),"=c" (IDT_HIGH)
167
+ :"c" ((short)(0x8000 + (0 << 13) + (0b110 << 8))),"a" ((0x08)<<16),"d" (p)
168
+ );
169
+
170
+ *GateAddress_Low = IDT_LOW;
171
+ *GateAddress_High = IDT_HIGH;
172
+
173
+
174
+ //
175
+ //
176
+ //
177
+ ///_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
178
+
179
+
180
+
181
+ __asm__("int $0x00\n\t");
182
+
183
+ }
184
+
185
+
186
+
187
+ void loop(void){
188
+
189
+ for(;;){}
190
+
191
+ }
192
+ ```
193
+
194
+
195
+ ```ここに言語を入力
117
196
  pushl %ebx
118
197
  subl $32, %esp //スタック32バイト確保
119
198
 

1

追記

2020/11/14 02:59

投稿

kazuyakazuya
kazuyakazuya

スコア193

title CHANGED
File without changes
body CHANGED
@@ -108,4 +108,48 @@
108
108
 
109
109
 
110
110
  もしかしたら初歩的なミスをしているかもしれませんが・・・
111
- どこのコードに誤りがあるのか分からないのでお願いします
111
+ どこのコードに誤りがあるのか分からないのでお願いします
112
+
113
+
114
+
115
+ アセンブリ出力結果
116
+ ```ここに言語を入力
117
+ pushl %ebx
118
+ subl $32, %esp //スタック32バイト確保
119
+
120
+ movw $1024, -30(%ebp) //-30(ebp)に 構造体変数idtr.size = 128 * 8
121
+ movl $0, -28(%ebp) //-30(ebp)に 構造体変数idtr.base = 0
122
+
123
+ lidt -30(%ebp)
124
+ ```
125
+ こちらがLIDT命令付近と思われる処理です。
126
+ ```ここに言語を入力
127
+ /NO_APP
128
+ movl $_loop, -8(%ebp) //-8(ebp) LOOP関数開始アドレス
129
+ movl $0, -12(%ebp) //-12 = IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)
130
+ movl $4, -16(%ebp) // -16 = IDT_Address 上位 0x00000004 (つまりセグメントディスクリプタ上位32bit)
131
+ movl $-31232, %ecx // ECX == ((short)(0x8000 + (0 << 13) + (0b110 << 8))) たぶん16BIT
132
+ movl $524288, %eax // EAX == (0x08)<<16
133
+ movl -8(%ebp), %edx //EDX == LOOP関数開始アドレス
134
+
135
+ /APP
136
+ # 52 "project1.c" 1
137
+ MOV %DX,%AX //EAXの下位16BITにloop関数開始アドレス下位16BIT EAXの上位16BITにセグメントセレクタ
138
+ MOV %EAX,%ebx //さきほどのEAXをEBXにコピー
139
+ MOV %cx,%DX //EDX上位にlooP関数開始アドレス EDX下位に ((short)(0x8000 + (0 << 13) + (0b110 << 8)))←サイズ16bit
140
+ MOV %EDX,%ecx //先ほどのEDXをECXにコピー
141
+
142
+ # 0 "" 2
143
+ /NO_APP
144
+ movl %ecx, %eax     //さきほどEAXからEBXにコピーしたものをまたEAXにコピー
145
+ movl %ebx, %edx     //さきほどEDXからECXにコピーしたものをまたEDXにコピー
146
+ movl %edx, -20(%ebp) //-20(EBP)に  合計32BIT [下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] を保存
147
+ movl %eax, -24(%ebp) //-24(EBP)に  合計32BIT [上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]を保存
148
+ movl -12(%ebp), %eax //35行目 IDT_Address下位 0x0000000 (つまりセグメントディスクリプタ下位32bit)をEAXにコピー
149
+ movl -20(%ebp), %edx //[下位16BITにloop関数開始アドレス下位16BIT 上位16BITにセグメントセレクタ] をEDXに
150
+ movl %edx, (%eax)    
151
+ movl -16(%ebp), %eax // 36行目 IDT_Address 上位 0x00000004 (つまりセグメントディスクリプタ上位32bit)をEAXにコピー
152
+ movl -24(%ebp), %edx //[上位にlooP関数開始アドレス 下位に((short)(0x8000 + (0 << 13) + (0b110 << 8)))]をEDXにコピー
153
+ movl %edx, (%eax)
154
+ ```
155
+ こちらがゲート設置処理です。