バイト配列のループは非常に簡単です (負の数に遭遇したら停止する必要があると想定していますが、状況は異なる場合があります)。
mov esi, pointerToByteArray
loop_start:
mov al, [esi]
cmp al, 80h
jge loop_end
; Do your byte-checking code here
inc esi
jmp loop_start
loop_end:
ループが終了すると、要素の総数は になりますesi-pointerToByteArray
。パート 2 はすでに完了していますが、気づいていません。次のように cmp オペコードを使用します。
cmp al, threshold
jge not_threshhold
; add to threshold counter
not_threshold:
パート 3 も非常に簡単ですが、少しいじる知識が必要です。すべての偶数には最下位ビットがクリアされていることを知っておく必要があります (1 の場所)。したがって、上位 7 ビットを削除すると、1 (奇数の場合) または 0 (偶数の場合) のいずれかになります。
mov bl, al
and bl, 1
jnz not_even
; add to even counter
not_even:
パート 4 を実行する最も簡単な方法は、127 (正のバイトの最大値) 以下の各素数をテストすることです。
cmp al, 2
je is_prime
cmp al, 3
je is_prime
cmp al, 5
je is_prime
cmp al, 7
je is_prime
; all the primes up to 127
jmp not_prime
is_prime:
; add to prime counter
not_prime:
それよりもはるかに優れた、より効率的でエレガントな素数をチェックする方法があることに注意してください。しかし、それは仕事を成し遂げるはずです。より多くの情報を知らなければ、収集した情報を出力する方法を説明できません。