回答編集履歴

3

回答に追記

2020/01/21 11:37

投稿

y_waiwai
y_waiwai

スコア87784

test CHANGED
@@ -126,7 +126,7 @@
126
126
 
127
127
  [戻りアドレス]
128
128
 
129
- [引数アドレス]→(siに引数アドレス)
129
+ [引数アドレス]→(siに引数アドレス) BP+4
130
130
 
131
131
 
132
132
 

2

回答に追記

2020/01/21 11:37

投稿

y_waiwai
y_waiwai

スコア87784

test CHANGED
@@ -37,3 +37,97 @@
37
37
  まずは、関数呼び出し時点のスタックの構成を考えてみよう
38
38
 
39
39
  #呼び出し側がどういう命令列で呼び出してるのかを読む必要あり
40
+
41
+
42
+
43
+ ---
44
+
45
+ スタックの状態を図示します
46
+
47
+ ※1行2バイトね
48
+
49
+
50
+
51
+ ・関数のcall時
52
+
53
+ [引数アドレス]→SP
54
+
55
+
56
+
57
+ ・関数の入り口
58
+
59
+ [戻りアドレス]→SP
60
+
61
+ [引数アドレス]
62
+
63
+
64
+
65
+ ・push BP
66
+
67
+ [push BP]→SP
68
+
69
+ [戻りアドレス]
70
+
71
+ [引数アドレス]
72
+
73
+
74
+
75
+ ・mov bp,sp
76
+
77
+ [push BP]→SP=BP
78
+
79
+ [戻りアドレス]
80
+
81
+ [引数アドレス]
82
+
83
+
84
+
85
+ ・そのあとなんやかやで、、
86
+
87
+ [push si]→SP
88
+
89
+ [push es]
90
+
91
+ [push dx]
92
+
93
+ [push cx]
94
+
95
+ [push bx]
96
+
97
+ [push 0]
98
+
99
+ [push 3]
100
+
101
+ [push BP]→BP
102
+
103
+ [戻りアドレス]
104
+
105
+ [引数アドレス]
106
+
107
+
108
+
109
+ ・mov si,[bp+4]
110
+
111
+ [push si]→SP
112
+
113
+ [push es]
114
+
115
+ [push dx]
116
+
117
+ [push cx]
118
+
119
+ [push bx]
120
+
121
+ [push 0]
122
+
123
+ [push 3]
124
+
125
+ [push BP]→BP
126
+
127
+ [戻りアドレス]
128
+
129
+ [引数アドレス]→(siに引数アドレス)
130
+
131
+
132
+
133
+ というふーになります。

1

回答に追記

2020/01/21 11:35

投稿

y_waiwai
y_waiwai

スコア87784

test CHANGED
@@ -15,3 +15,25 @@
15
15
  mov cl,[si + drive.cyln + 1]
16
16
 
17
17
  で、シリンダ上位バイトをclに格納しているってことですな
18
+
19
+
20
+
21
+ push bp
22
+
23
+ mov bp,sp
24
+
25
+ まず、bpをpush(たんにbpの値を退避してるだけ)
26
+
27
+ で、その時のspの値をbpにいれてます
28
+
29
+
30
+
31
+ mov si,[bp + 4]
32
+
33
+ その関数の引数のアドレスを求めてます
34
+
35
+
36
+
37
+ まずは、関数呼び出し時点のスタックの構成を考えてみよう
38
+
39
+ #呼び出し側がどういう命令列で呼び出してるのかを読む必要あり