首页 > 解决方案 > 装配检查范围内的数字是否为素数

问题描述

我正在尝试打印 2 - 100000 之间的质数。但是我的代码有问题。当它检测到一个非素数时,它应该转到下一个,但它仍然打印出来,所以不是 2、3、5、7.. 我得到的是 2 3 4 5 6 7...

%include "io64.inc"

section .text
global CMAIN
CMAIN:

    PRINT_DEC 1,2
    NEWLINE

    reset_ebx:
    mov ebx,2
    loop2:
    xor edx,edx
    mov eax,[num]
    div ebx
    inc ebx
    cmp ebx,[num+1]
    je end
    cmp edx,0
    je loop2
    cmp edx,0
    jne prime


    prime:
    PRINT_DEC 8,[num]
    NEWLINE


    end:
    mov eax,[num]
    inc eax  ; 3 - 10000
    mov [num],eax
    cmp eax,10001 
    jne reset_ebx

    xor rax, rax
    ret

    section .data
    num dq 3
    max_ebx dq 0
    const dq 2

标签: assemblyx86-64nasmsasm

解决方案


prime当不为零时您将跳转到标签,edx但是因为当它为零时标签立即跟随此代码,计算机将简单地跳过并开始执行该标签中的代码。

汇编中的标签与高级语言中的函数或代码块不同,如果您不触发跳转(显式如使用Jxx指令或隐式如使用 a call),计算机将简单地以线性方式继续执行时尚。

如果你切换jne primeje end你的代码应该是固定的。


推荐阅读