汇编语言查找1000以内的素数(厄拉多塞筛法)

博客讨论了在使用厄拉多塞筛法寻找1000以内素数的汇编语言程序中,由于循环计算过程中数值相乘可能导致的溢出错误。作者发现了这一bug并提供了修正后的代码。
include Irvine32.inc
big = 1000
small = big / 2
.data
KN byte big dup(0)
jj dword 2
jay dword big dup(0)
chou dword 1
KK dword 1
.code
main proc
  mov ecx,big
L1:push ecx
  inc KK
  mov ecx,1
L2:push ecx
  mov eax,lengthof KN - 1
  mov edx,0
  div KK
  mov jj,2
  mov ecx,eax
L3:
  mov eax,KK
  mov ebx,jj
  mul ebx
  mov KN[eax],1
  inc jj
  cmp KK,small
  je L4
  loop L3
  pop ecx
  loop L2
  pop ecx
  LOOP L1
L4:
  mov edx,offset KN
  mov ebx,offset jay
  mov ecx,big - 1
L6:
  xor dword ptr [edx], 1
  jnp L5
L7:
  add edx,1
  loop L6
  jmp L8
L5:
  mov eax,big
  sub eax,1
  sub eax,ecx
  mov [ebx],eax
  add ebx,4
  jmp L7
L8:
  exit
main endp
end main
在这里插入代码片

读代码时本想提升效率,偶然发现了一个bug,是有与jj在本身2之外循环各数在总数中的倍数个数相加后与KK相乘会产生溢出将jj的值覆盖产生错误,修改后的代码如下

include Irvine32.inc
big = 1000
small = big / 2
.data
KN byte big dup(0)
jj dword 2
jay dword big dup(0)
chou dword 1
KK dword 1
.code
main proc
  mov ecx,small - 1
L1:push ecx
  inc KK
  mov ecx,1
L2:push ecx
  mov eax,lengthof KN - 1
  mov edx,0
  div KK
  mov jj,2
  mov ecx,eax
  mov chou,eax
L3:
  mov eax,KK
  mov ebx,jj  
  mul ebx
  mov KN[eax],1
  cmp ebx,chou
  je  L9
  inc jj
  loop L3
L9:
  pop ecx
  loop L2
  pop ecx
  LOOP L1
L4:
  mov edx,offset KN
  mov ebx,offset jay
  mov ecx,big - 1
L6:
  xor dword ptr [edx], 1
  jnp L5
L7:
  add edx,1
  loop L6
  jmp L8
L5:
  mov eax,big
  sub eax,1
  sub eax,ecx
  mov [ebx],eax
  add ebx,4
  jmp L7
L8:
  exit
main endp
end main
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值