質問編集履歴

3

コードの変更

2021/02/27 15:41

投稿

cha-
cha-

スコア6

test CHANGED
File without changes
test CHANGED
@@ -1,14 +1,14 @@
1
- 下のアセンブリプログラム(x86)を一部変更して入力した数字の**約数**を求めたいです。
1
+ 下のアセンブリプログラム(x86)を入力した数字の約数を求めたいです。
2
2
 
3
3
 
4
4
 
5
- %include "asm_io.inc"
5
+ 下のコードですと、エラーが出てしまいます。
6
6
 
7
7
 
8
8
 
9
9
  segment .data
10
10
 
11
- Message db "Find primes up to: ", 0
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 resd 1 ; find primes up to this limit
19
+ Limit resd 1 ; find primes up to this limit
20
20
 
21
- Guess resd 1 ; the current guess for prime
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
- global asm_main
27
+ global asm_main
32
28
 
33
29
  asm_main:
34
30
 
35
- enter 0,0 ; setup routine
31
+ enter 0,0 ; setup routine
36
32
 
37
- pusha
33
+ pusha
38
34
 
39
35
 
40
36
 
41
- mov eax, Message
37
+ mov eax, Message
42
38
 
43
- call print_string
39
+ call print_string
44
40
 
45
-
41
+
46
42
 
47
- call read_int ; scanf("%u", & limit );
43
+ call read_int ; scanf("%u", & limit );
48
44
 
49
- mov [Limit], eax
45
+ mov [Limit], eax
50
46
 
51
47
 
52
48
 
53
- mov eax, 2 ; printf("2\n");
49
+ mov eax, 2 ; printf("2\n");
54
50
 
55
- call print_int
51
+ call print_int
56
52
 
57
- call print_nl
53
+ call print_nl
58
54
 
59
- mov eax, 3 ; printf("3\n");
55
+ mov eax, 3 ; printf("3\n");
60
56
 
61
- call print_int
57
+ call print_int
62
58
 
63
- call print_nl
59
+ call print_nl
64
60
 
65
61
 
66
62
 
67
- mov dword [Guess], 5 ; Guess = 5;
63
+ mov dword [Guess], 5 ; Guess = 5;
68
64
 
69
65
 
70
66
 
71
- while_limit: ; while ( Guess <= Limit )
67
+ loop_start:
72
68
 
73
- mov eax,[Guess]
69
+ mov eax,[Limit]
74
70
 
75
- cmp eax, [Limit]
71
+     mov ecx,eax
76
72
 
73
+ add eax,ecx
74
+
75
+ je eax,0
76
+
77
- jnbe end_while_limit ; use jnbe since numbers are unsigned
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

さらに詳しく

2021/02/27 15:41

投稿

cha-
cha-

スコア6

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

アセンブリの分からない部分を詳しくした

2021/02/27 03:22

投稿

cha-
cha-

スコア6

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 下のnasmのアセンブリプログラムを一部変更して入力した数字の約数を求めたいです。
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
- だとは思うのですが、これnasmアセンブリる方法がわかりません
177
+ だとは思うのですが、iとlimitの部分をアセンブリでループの中で定義ればいいのかわかりません