manipulate:'A' key is speed up.(toggle)
環境構築:
アセンブリ:
-- 自動挿入 --
P184
test2
test3
push bp mov bp, sp push ds mov ds, [ bp + 6 ] ; xor ebx, ebx mov ecx, [ bp + 8 ] l1: mov byte ptr [ ebx ], 1 inc ebx cmp ebx, ecx jbe l1 mov ecx, [ bp + 8 ] mov edx, ecx shr edx, 1 mov ebx, 2 l2: cmp byte ptr [ ebx ], 1 jne s1 mov eax, ebx l3: lea eax, [ ebx + eax ] cmp eax, ecx ja s1 mov byte ptr [ eax ], 0 jmp l3 s1: inc ebx cmp ebx, edx jbe l2 pop ds pop bp db 66h ret
;32ビット命令を活用するアセンブリ言語プログラム sieve (P184) ;レジスタの内容を退避し、レジスタを新しい用途で使用したい。 ;第1引数 tblsel を ds にセットすることで以降のデータ参照を素数判別配列参照とする。 ;for1( ebx = 0; ebx < ecx; ebx++ ) 素数判別配列の要素をすべて 1 で初期化したい。 ;for1 カウンタ変数 ebx の初期化 ;for1 継続条件の上限値 ecx として、第2引数、num を 代入 ;素数判別配列の ebx 番目を 1 にする ;for1 カウンタ変数 ebx の更新 ;for1 継続条件チェック ;for2( ebx = 2; ebx < edx; ebx++ ) 2 ~ num の半分まで、処理を行いたい。 ;for2 継続条件の上限値 edx として、num / 2 を 代入 ;for2 カウンタ変数 ebx 初期化 ;もし、素数判別配列[ ebx ] が 1 ではないなら continue (s1へ) ;for3( eax = ebx; eax <= ecx; eax += ebx ) ebx の倍数はすべて 0 にしたい。 ;for3 カウンタ変数 eax の初期化 ;for3 カウンタ変数 eax の更新(ebx の倍数) ;for3 継続条件チェック ;素数判別配列の eax 番目を 0 にする ;for3 next ;for2 カウンタ変数 ebx の更新 ;for2 継続条件チェック ;レジスタの内容を復帰する。 ;これは 32bit において、16bit 用 ret 命令を実行する ;結果を右上に表示します。素数は 1、素数ではないものは 0 gotoMemory 0x0000 11