質問編集履歴
3
コードの変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
下のアセンブリプログラム(x86)を
|
1
|
+
下のアセンブリプログラム(x86)をで入力した数字の約数を求めたいです。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
下のコードですと、エラーが出てしまいます。
|
6
6
|
|
7
7
|
|
8
8
|
|
9
9
|
segment .data
|
10
10
|
|
11
|
-
Message
|
11
|
+
Message db "Find primes up to: ", 0
|
12
12
|
|
13
13
|
|
14
14
|
|
@@ -16,137 +16,81 @@
|
|
16
16
|
|
17
17
|
segment .bss
|
18
18
|
|
19
|
-
Limit
|
19
|
+
Limit resd 1 ; find primes up to this limit
|
20
20
|
|
21
|
-
Guess
|
21
|
+
Guess resd 1 ; the current guess for prime
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
22
|
|
27
23
|
|
28
24
|
|
29
25
|
segment .text
|
30
26
|
|
31
|
-
|
27
|
+
global asm_main
|
32
28
|
|
33
29
|
asm_main:
|
34
30
|
|
35
|
-
|
31
|
+
enter 0,0 ; setup routine
|
36
32
|
|
37
|
-
|
33
|
+
pusha
|
38
34
|
|
39
35
|
|
40
36
|
|
41
|
-
|
37
|
+
mov eax, Message
|
42
38
|
|
43
|
-
|
39
|
+
call print_string
|
44
40
|
|
45
|
-
|
41
|
+
|
46
42
|
|
47
|
-
|
43
|
+
call read_int ; scanf("%u", & limit );
|
48
44
|
|
49
|
-
|
45
|
+
mov [Limit], eax
|
50
46
|
|
51
47
|
|
52
48
|
|
53
|
-
|
49
|
+
mov eax, 2 ; printf("2\n");
|
54
50
|
|
55
|
-
|
51
|
+
call print_int
|
56
52
|
|
57
|
-
|
53
|
+
call print_nl
|
58
54
|
|
59
|
-
|
55
|
+
mov eax, 3 ; printf("3\n");
|
60
56
|
|
61
|
-
|
57
|
+
call print_int
|
62
58
|
|
63
|
-
|
59
|
+
call print_nl
|
64
60
|
|
65
61
|
|
66
62
|
|
67
|
-
|
63
|
+
mov dword [Guess], 5 ; Guess = 5;
|
68
64
|
|
69
65
|
|
70
66
|
|
71
|
-
|
67
|
+
loop_start:
|
72
68
|
|
73
|
-
|
69
|
+
mov eax,[Limit]
|
74
70
|
|
75
|
-
|
71
|
+
mov ecx,eax
|
76
72
|
|
73
|
+
add eax,ecx
|
74
|
+
|
75
|
+
je eax,0
|
76
|
+
|
77
|
-
|
77
|
+
movabs ecx,eax
|
78
|
+
|
79
|
+
call print_int
|
80
|
+
|
81
|
+
call print_nl
|
82
|
+
|
83
|
+
loop loop_start
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
leave
|
88
|
+
|
89
|
+
ret
|
78
90
|
|
79
91
|
|
80
92
|
|
81
|
-
mov ebx, 3 ; ebx is factor = 3;
|
82
93
|
|
83
|
-
while_factor:
|
84
|
-
|
85
|
-
mov eax,ebx
|
86
|
-
|
87
|
-
mul eax ; edx:eax = eax*eax
|
88
|
-
|
89
|
-
jo end_while_factor ; if answer won't fit in eax alone
|
90
|
-
|
91
|
-
cmp eax, [Guess]
|
92
|
-
|
93
|
-
jnb end_while_factor ; if !(factor*factor < guess)
|
94
|
-
|
95
|
-
mov eax,[Guess]
|
96
|
-
|
97
|
-
mov edx,0
|
98
|
-
|
99
|
-
div ebx ; edx = edx:eax % ebx
|
100
|
-
|
101
|
-
cmp edx, 0
|
102
|
-
|
103
|
-
je end_while_factor ; if !(guess % factor != 0)
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
add ebx,2 ; factor += 2;
|
108
|
-
|
109
|
-
jmp while_factor
|
110
|
-
|
111
|
-
end_while_factor:
|
112
|
-
|
113
|
-
je end_if ; if !(guess % factor != 0)
|
114
|
-
|
115
|
-
mov eax,[Guess] ; printf("%u\n")
|
116
|
-
|
117
|
-
call print_int
|
118
|
-
|
119
|
-
call print_nl
|
120
|
-
|
121
|
-
end_if:
|
122
|
-
|
123
|
-
mov eax,[Guess]
|
124
|
-
|
125
|
-
add eax, 2
|
126
|
-
|
127
|
-
mov [Guess], eax ; guess += 2
|
128
|
-
|
129
|
-
jmp while_limit
|
130
|
-
|
131
|
-
end_while_limit:
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
popa
|
136
|
-
|
137
|
-
mov eax, 0 ; return back to C
|
138
|
-
|
139
|
-
leave
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
ret
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
上のコードは、素数を見つけるプログラムですが、これを約数に見つけるコードにしたいです。
|
150
94
|
|
151
95
|
|
152
96
|
|
@@ -160,18 +104,4 @@
|
|
160
104
|
|
161
105
|
printf("\n%d", i);
|
162
106
|
|
163
|
-
|
164
|
-
|
165
|
-
で
|
107
|
+
だとは思うのです。
|
166
|
-
|
167
|
-
loop loop start
|
168
|
-
|
169
|
-
mov eax
|
170
|
-
|
171
|
-
call print_string
|
172
|
-
|
173
|
-
call print_nl
|
174
|
-
|
175
|
-
jmp end_if
|
176
|
-
|
177
|
-
だとは思うのですが、iとlimitの部分をアセンブリでループの中で定義すればいいのかわかりません
|
2
さらに詳しく
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
下のアセンブリプログラムを一部変更して入力した数字の約数を求めたいです。
|
1
|
+
下のアセンブリプログラム(x86)を一部変更して入力した数字の**約数**を求めたいです。
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -166,7 +166,7 @@
|
|
166
166
|
|
167
167
|
loop loop start
|
168
168
|
|
169
|
-
mov
|
169
|
+
mov eax
|
170
170
|
|
171
171
|
call print_string
|
172
172
|
|
1
アセンブリの分からない部分を詳しくした
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
下の
|
1
|
+
下のアセンブリプログラムを一部変更して入力した数字の約数を求めたいです。
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -146,7 +146,7 @@
|
|
146
146
|
|
147
147
|
|
148
148
|
|
149
|
-
|
149
|
+
上のコードは、素数を見つけるプログラムですが、これを約数に見つけるコードにしたいです。
|
150
150
|
|
151
151
|
|
152
152
|
|
@@ -160,4 +160,18 @@
|
|
160
160
|
|
161
161
|
printf("\n%d", i);
|
162
162
|
|
163
|
+
|
164
|
+
|
165
|
+
で、アセンブリでは
|
166
|
+
|
167
|
+
loop loop start
|
168
|
+
|
169
|
+
mov
|
170
|
+
|
171
|
+
call print_string
|
172
|
+
|
173
|
+
call print_nl
|
174
|
+
|
175
|
+
jmp end_if
|
176
|
+
|
163
|
-
だとは思うのですが、
|
177
|
+
だとは思うのですが、iとlimitの部分をアセンブリでループの中で定義すればいいのかわかりません
|