【问题标题】:Assembly check if number in range is prime装配检查范围内的数字是否为素数
【发布时间】:2020-05-15 15:32:47
【问题描述】:

我正在尝试打印 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

【问题讨论】:

  • related:Checking if a number is prime in NASM Win64 Assembly 解释了如何编写一个尽可能少的试除循环。当你运行它时,不清楚你在说什么;更清楚地描述你的minimal reproducible example
  • 我的意思是当它检测到一个非质数时,它应该增加并检查下一个。它会(2 / 检查是否为素数 / 如果是则打印) 3... 等等... 它会打印每个数字而不是仅素数
  • 好的,这更清楚了,很好的编辑。 cmp ebx,[num+1] 将地址偏移一个字节,而不是值。所以大概这总是错误的。一条指令仅限于硬件可以执行的操作,寻址模式仅计算地址,而不是在将加载的值与该行的指令助记符一起使用之前通过 ALU 操作运行加载的值。

标签: assembly x86-64 nasm sasm


【解决方案1】:

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

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

如果您将jne prime 切换为je end,您的代码应该被修复。

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2014-12-05
    • 1970-01-01
    • 2014-03-04
    • 2021-04-01
    相关资源
    最近更新 更多