1

( ) を使用すると、ディスプレイはすべて ASCII になりますmov al,2; int 21h

すべてではなく、1 つの条件のみを確認できます。まとめてチェックして出力するにはどうしたらいいですか?

私の課題は

配列内に事前に格納された 1 バイトの正の整数要素のセットを考えてみましょう。以下をせよ。

  1. 配列内の要素の数を数えて表示します。
  2. 特定のしきい値未満のすべての数値を識別して表示します (このしきい値は必要に応じて設定できます)。何もない場合は、メッセージを表示します。
  3. 偶数を特定し、それらを数えて、それらの平均を計算します。結果を表示します。
  4. 配列内のすべての素数を識別して表示します。
4

2 に答える 2

0

バイト配列のループは非常に簡単です (負の数に遭遇したら停止する必要があると想定していますが、状況は異なる場合があります)。

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:

それよりもはるかに優れた、より効率的でエレガントな素数をチェックする方法があることに注意してください。しかし、それは仕事を成し遂げるはずです。より多くの情報を知らなければ、収集した情報を出力する方法を説明できません。

于 2011-02-10T15:55:13.023 に答える
0

このようなものにバラバラにアプローチする必要があります。あなたが何をする必要があるかを考えると、おそらく私が取り組む最初の部分は、1 バイトの整数をその数値を 10 進数で表す文字列に変換することでしょう。

これを行うには、数値を 10 で割ります。剰余は最下位桁 (0 から 9 までの数値) を表します。「0」を追加して数字に変換します。数値が 0 になるまで、このプロセスを繰り返します。簡単に印刷できるように、最後のバイトに「$」を含む 4 バイトのバッファーから開始することをお勧めします。「$」の前の最後のバイトから始まるバッファに数字を入れ、反復ごとにポインタをバッファにデクリメントします。

偶数の識別は非常に簡単です。奇数には常に最下位ビットが設定されていますが、偶数には設定されていません。

于 2011-02-08T03:59:55.207 に答える