1

我有一个任务,我必须输入一个数字,并找出所有质数,但不超过该数字。例如,如果我在程序中输入 9,它应该打印 3、5 和 7。

我确定一个数字是否为素数的计划是将其除以 2 并检查余数是否为 0。如果余数为 0,则程序从被除数中减去 1,然后循环回到顶部以再次除法。如果余数 != 0 则将其打印到屏幕上,并再次减少股息。这种情况会一直发生,直到被除数为 0。只是这不是正在发生的事情,无论出于何种原因,每当我使用该DIV指令时,我总是会遇到浮点异常,我似乎无法弄清楚为什么或如何解决它。有人对我如何解决这个问题有任何想法吗?

    代码:%INCLUDE "csci224.inc"

    段.数据
    提示:DD "请输入一个数字:",0 ; 提示字符串
    message: DD "是素数。", 0 ; 当 n 为素数时显示
    无效:DD "无效条目。", 0
    我: DD 2                               

    段.bss
    输入:RESD 100;没必要,忽略这个

    段 .text
    主要的:

    mov edx,提示
    调用 WriteString

    调用 ReadInt

    移动 esi, eax ; 将 eax 移入 esi 以用作循环的索引

    循环:

    异或 edx, edx ; 清除寄存器
    异或 ecx, ecx
    xor eax, eax

    移动 eax, dword 2 ; mov 2 到 eax
    div ecx ; ecx/eax | n/2

    决定;递减循环计数器
    dec ecx ; 递减分子

    cmp edx, 双字 0 ; 余数为零?
    我的循环;是 - 不是素数 - 跳回顶部

    移动 eax, edx ; 否 - 移动到 eax 并打印
    调用 WriteInt
    呼叫 Crlf

    cmp esi, 0 ; 计数器为零?
    jz完成;是 - 结束循环

    jmp myloop ; NO - 再次循环

完成的:
    ret
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 回答