回答編集履歴

3

ちょっと補足を追記

2016/08/27 03:49

投稿

flied_onion
flied_onion

スコア2604

test CHANGED
@@ -9,3 +9,53 @@
9
9
  JMPでstartラベルにJumpしますが、startの位置は計算によって(先頭が00でそこは far jump で`EA0500C007`で5byte 0000 ~ 0004 になるからその次)0005です。
10
10
 
11
11
  なのでjmp先は0005になっています。
12
+
13
+
14
+
15
+ ---
16
+
17
+
18
+
19
+ **追記**
20
+
21
+
22
+
23
+ コメントより
24
+
25
+
26
+
27
+ > 0005とはオフセットのことですね!
28
+
29
+ このプログラムはメモリ上の0x07c0からスタートしますので、
30
+
31
+ startラベルは0x07c0 + 0005 のアドレスということですね。
32
+
33
+
34
+
35
+
36
+
37
+ うーんと、0x07c0じゃなくて0x7c00なのを除けば結果的にそうですけど、解釈は・・・あってるのかな?ちょっと補足しておきます。
38
+
39
+ 私も記憶があいまいなので違ってたらごめんなさい。
40
+
41
+
42
+
43
+ この逆アセ結果は0x0000にプログラムが配置された場合(org 疑似命令で0指定しているので)なので、startラベルは0x0005です。少なくともそうだとアセンブラは解釈しています。
44
+
45
+ 仮に、本当にこれ(プログラムの先頭アドレスは0x0000==プログラムは0x0000に配置される)が起きたとき、最初のJMPで0x7c05 (0x7c0はセグメントなので メモリアドレスは4bitシフトする…はず。そのセグメントの開始から0005なので0x7c05)に飛びますが、そこにはこのプログラムはありません。「`0x7c05`にたまたまいた命令」が実行されることになります。
46
+
47
+
48
+
49
+ で、現実に何が起こるか考えます。
50
+
51
+ BIOSによってMBRの512byte(だっけ)は`0x7c00`に配置されます。
52
+
53
+ この時点では内容は関係ありません。`EA 05 00 C0 07 8C C8 8E D8....`というバイト列が0x7c00に単純配置されます(理屈の上では、この時点でORG疑似命令で指定した0と矛盾します)。
54
+
55
+ ここでバイトコードは変わりませんので、最初の命令「`jmp word 0x7c0:0x5`」は変わることなく「セグメント0x7c + オフセット0005」、つまり`0x7c << 4 + 0005 = 0x7c05` にJumpします。さて今、「`0x7c05`たまたまにいた命令」はなんでしょう。なんと偶然にもこのプログラムが0x7c00にロードされたため、このプログラムの6byte目、すなわち `8C C8 : MOV AX,CS` です。
56
+
57
+ で、CSにもDSにも0x7c0が入ってセグメントレジスタが0x07c0になりました。という事だと思います。
58
+
59
+
60
+
61
+ これとはちょっと違いますけど、マスターブートレコードはサイズ小さいので、自身をデカいエリアにコピーしてそこで続きやるとかいうコードもあって途中から突然全然違うアドレスが前提になっていることもありますので読むときはそういうとこにも注意ですね。

2

5byteでしたごめんなさい。

2016/08/27 03:49

投稿

flied_onion
flied_onion

スコア2604

test CHANGED
@@ -6,6 +6,6 @@
6
6
 
7
7
  orgが 0になっているので、このプログラムが0x00hに配置されるものとして逆アセンブルされているからと思います。
8
8
 
9
- JMPでstartラベルにJumpしますが、startの位置は計算によって(先頭が00でそこは far jump で`EA0500C007`で4byte 0000 ~ 0004 になるからその次)0005です。
9
+ JMPでstartラベルにJumpしますが、startの位置は計算によって(先頭が00でそこは far jump で`EA0500C007`で5byte 0000 ~ 0004 になるからその次)0005です。
10
10
 
11
11
  なのでjmp先は0005になっています。

1

記述の微修正

2016/08/25 16:51

投稿

flied_onion
flied_onion

スコア2604

test CHANGED
@@ -6,6 +6,6 @@
6
6
 
7
7
  orgが 0になっているので、このプログラムが0x00hに配置されるものとして逆アセンブルされているからと思います。
8
8
 
9
- JMPでstartラベルにJumpしますが、startの位置は計算(先頭が00でそこは far jump で`EA0500C007`で4byte 0000 ~ 0004 になるから)によって0005です。
9
+ JMPでstartラベルにJumpしますが、startの位置は計算によって(先頭が00でそこは far jump で`EA0500C007`で4byte 0000 ~ 0004 になるからその次)0005です。
10
10
 
11
11
  なのでjmp先は0005になっています。