1

ある数値を入力して、その数値までのすべての素数を計算しなければならない課題があります。たとえば、プログラムに 9 を入力すると、3、5、および 7 が出力されます。

ある数値が素数かどうかを判断する私の計画は、それを 2 で割り、余りが 0 かどうかを確認することです。余りが 0 の場合、プログラムは被除数から 1 を引き、一番上に戻って再度割り算します。剰余が != 0 の場合、それを画面に出力し、被除数を再び減分します。これは、被除数が 0 になるまで発生します。これだけが起こっているわけではありません。何らかの理由で、DIV命令を使用するたびに常に浮動小数点例外が発生し、その理由や解決方法がわかりません。これを修正する方法について誰かアイデアがありますか?

    コード: %INCLUDE "csci224.inc"

    セグメント .data
    prompt: DD "数字を入力してください: ",0 ; プロンプト文字列
    メッセージ: DD "素数です。", 0 ; n が素数の場合に表示
    無効: DD "無効なエントリ。", 0
    私: DD 2                               

    セグメント.bss
    入力: RESD 100 ; 本当に必要ないので無視してください

    セグメント .text
    主要:

    移動 edx、プロンプト
    WriteString を呼び出す

    ReadInt を呼び出す

    ムーブesi、eax; eax を esi に移動して、ループのインデックスとして使用します

    マイループ:

    xor edx、edx ; クリアレジスタ
    xor ecx、ecx
    xor eax, eax

    mov eax, dword 2 ; 2をeaxに移動
    div ecx ; ecx/eax | n/2

    decesi ; ループカウンターを減らす
    12月ecx; デクリメント分子

    cmp edx、dword 0 ; 残りはゼロですか?
    je myloop ; はい - プライムではない - トップに戻る

    eax、edxを移動します。いいえ - eax に移動して印刷します
    WriteInt を呼び出す
    Crlfを呼び出す

    cmp esi、0 ; カウンターゼロですか?
    jz 終了しました。はい - ループを終了します

    jmpマイループ; いいえ - もう一度ループします

終了した:
    戻る
4

1 に答える 1

7

コードのこの部分では:

xor     ecx, ecx                ; Clears ecx (set to 0)
xor     eax, eax                ; Clears eax (set to 0)

mov     eax, dword 2            ; Sets eax to 2
                                ; NOTE: you had just set it to 0 in the prior step)

; PROBLEM; the following code computes eax/ecx, which is 2/0 - the comment is wrong

div     ecx                     ; ecx/eax | n/2
于 2013-10-17T15:05:32.210 に答える