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
博客讨论了在使用厄拉多塞筛法寻找1000以内素数的汇编语言程序中,由于循环计算过程中数值相乘可能导致的溢出错误。作者发现了这一bug并提供了修正后的代码。
3070

被折叠的 条评论
为什么被折叠?



