0

私はx86でアセンブリ言語を学んでおり、数字が素数かどうかを判断する簡単なプログラムを作成しました。

私は正しくやっていると思いますが、まだ望ましい結果が得られていません。以下はコードです

section .bss
b db
section .data
x db "Number is Prime",10,0
y db "Number is not Prime",10,0
z db "value is=%d",10,0

section .text
global main
extern printf
main:
mov eax,17
mov ebx,2
loop:
mov [b],eax
div ebx
mov eax,[b]
cmp edx,0
jz Print_not_Prime
inc ebx

 cmp ebx,17
 jnz loop
 push x
 call printf
 add esp,4
 ret

 Print_not_Prime:
 push y
 call printf
 add esp,4
 ret

上記のコードでは、番号 17 と素数ではないことを示す programe の出力をチェックしています。

誰が私がどこで間違っているのか教えてもらえますか

4

2 に答える 2

2

edx各除算の前にゼロにする必要があります。の被除数divは、 の二重レジスタ オペランドとして提供されedx:eaxます。

前回のトライアル部門の残りが残っていると、結果が台無しになります。

また、被除数をレジスタ ( ecxesiediまだ使用されていません) に格納するか、少なくともスタックに格納してから、Michael が指摘したように dword を格納するには不十分なメモリに格納することをお勧めします。

于 2013-06-26T12:58:59.300 に答える
2

これには少なくとも 2 つの問題があります。

b db
....
mov [b],eax

1 バイトのスペースのみを予約していますbが、dword (4 バイト) を格納しています。ddの代わりに使用する必要がありdbます。


div ebx 

この除算は で除算されるため、 をクリアするには、前にcdq(または)を使用する必要があります。xor edx,edxdivedxedx:eaxebx

于 2013-06-26T13:00:48.120 に答える