私はアセンブリの初心者ですが、Erathothenesの篩を実装しようとしていますが、コードはありますが、それは1と600の間でしか動作しません。何故ならn = 1000を置くと、完全なコード、任意のヘルプが行います。Eratosthenes x86アセンブリのふるい
Include Irvine32.inc
n=1000
.data
prime DWORD n DUP(?)
.code
main PROC
mov ecx,n ;initialize ecx to 1000
mov esi, OFFSET prime
;--------------------------------------------------------
; Initialize Array with 1's
;--------------------------------------------------------
FillArray: mov eax,1
mov [esi],eax
mov eax,[esi]
add esi,TYPE DWORD ;4 to jump to the next index
loop FillArray
mov ebx,8
mov edx,0
mov ecx,n
mov ebp,2
mov esi,0
;----------------------------------------------------------------
; Sieve
;----------------------------------------------------------------
SIEVE: mov eax,prime[ebx]
mov edx,ebx
mov edi,ebx
add edx,edi ;j=i+i
mov esi,ebp
mov ecx,n
sub ecx,ebp
add ecx,2
add ebx,TYPE DWORD
cmp eax,1
je FLIP
inc ebp
loop SIEVE
jmp K
FLIP: mov eax,0
mov prime[edx],eax
add edx,edi
cmp esi,n
jg SIEVE
add esi,ebp
loop FLIP
K:
mov esi, OFFSET prime
mov ecx,n
sub ecx,2
mov ebx,1
mov edx,8 ;Start checking from index of second element
PRINT: mov eax,prime[edx] ;
add edx,TYPE DWORD
inc ebx
cmp eax,1
jne H
mov eax,ebx
call WriteDec
call Crlf
loop PRINT
jmp D
H: loop PRINT
D:
exit
main ENDP
END main
を使用すると、DWORDの配列のインデックスに4で 'edx'を拡大縮小しますどこ?私はそれが起こっているとは思わない。 (もちろん、シーブのパフォーマンスはしばしばデータのキャッシュミスによって制限されるため、バイト配列やビットマップにする方がはるかに優れています。キャッシュフットプリントを4倍に減らすことは大きな勝利です) –
@PeterCordes 'edx'は' edi'を追加することでスケーリングされます。これは 'ebx'であり、これは予め乗算されたオフセットです。 (少なくとも、私はそう思う、このコードのロジックは非常に無駄で複雑なので、それを頭で追うのは簡単ではない)。 – Ped7g
さて、私はそれを理解しようとしましたが、それは完全な地雷であり、頭の中で "走らせる"ことは不可能であり、多くの不明瞭な無駄な複雑さが私の頭が期待している短い実装とは大きく異なります。 – Ped7g