【发布时间】: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 操作运行加载的值。