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

回答編集履歴

3

回答に追記

2020/01/21 11:37

投稿

y_waiwai
y_waiwai

スコア88173

answer CHANGED
@@ -62,6 +62,6 @@
62
62
  [push 3]
63
63
  [push BP]→BP
64
64
  [戻りアドレス]
65
- [引数アドレス]→(siに引数アドレス)
65
+ [引数アドレス]→(siに引数アドレス) BP+4
66
66
 
67
67
  というふーになります。

2

回答に追記

2020/01/21 11:37

投稿

y_waiwai
y_waiwai

スコア88173

answer CHANGED
@@ -17,4 +17,51 @@
17
17
  その関数の引数のアドレスを求めてます
18
18
 
19
19
  まずは、関数呼び出し時点のスタックの構成を考えてみよう
20
- #呼び出し側がどういう命令列で呼び出してるのかを読む必要あり
20
+ #呼び出し側がどういう命令列で呼び出してるのかを読む必要あり
21
+
22
+ ---
23
+ スタックの状態を図示します
24
+ ※1行2バイトね
25
+
26
+ ・関数のcall時
27
+ [引数アドレス]→SP
28
+
29
+ ・関数の入り口
30
+ [戻りアドレス]→SP
31
+ [引数アドレス]
32
+
33
+ ・push BP
34
+ [push BP]→SP
35
+ [戻りアドレス]
36
+ [引数アドレス]
37
+
38
+ ・mov bp,sp
39
+ [push BP]→SP=BP
40
+ [戻りアドレス]
41
+ [引数アドレス]
42
+
43
+ ・そのあとなんやかやで、、
44
+ [push si]→SP
45
+ [push es]
46
+ [push dx]
47
+ [push cx]
48
+ [push bx]
49
+ [push 0]
50
+ [push 3]
51
+ [push BP]→BP
52
+ [戻りアドレス]
53
+ [引数アドレス]
54
+
55
+ ・mov si,[bp+4]
56
+ [push si]→SP
57
+ [push es]
58
+ [push dx]
59
+ [push cx]
60
+ [push bx]
61
+ [push 0]
62
+ [push 3]
63
+ [push BP]→BP
64
+ [戻りアドレス]
65
+ [引数アドレス]→(siに引数アドレス)
66
+
67
+ というふーになります。

1

回答に追記

2020/01/21 11:35

投稿

y_waiwai
y_waiwai

スコア88173

answer CHANGED
@@ -6,4 +6,15 @@
6
6
  mov ch,[si + drive.cyln + 0]
7
7
  で、シリンダ下位バイトをchに、
8
8
  mov cl,[si + drive.cyln + 1]
9
- で、シリンダ上位バイトをclに格納しているってことですな
9
+ で、シリンダ上位バイトをclに格納しているってことですな
10
+
11
+ push bp
12
+ mov bp,sp
13
+ まず、bpをpush(たんにbpの値を退避してるだけ)
14
+ で、その時のspの値をbpにいれてます
15
+
16
+ mov si,[bp + 4]
17
+ その関数の引数のアドレスを求めてます
18
+
19
+ まずは、関数呼び出し時点のスタックの構成を考えてみよう
20
+ #呼び出し側がどういう命令列で呼び出してるのかを読む必要あり