Подсчитать и усреднить четные числа в массиве и проверить на простые числа - PullRequest
1 голос
/ 08 февраля 2011

Весь мой дисплей в ASCII при использовании (mov al,2; int 21h).

Я могу проверить только одно условие, но не все. Как я могу проверить все одновременно и вывести его?

Мое назначение

Рассмотрим набор предварительно сохраненных 1-байтовых положительных целочисленных элементов в массив. Сделайте следующее.

  1. Подсчитать количество элементов в вашем массиве и отобразить их;
  2. Определение и отображение всех чисел, меньших определенного порогового числа (вы можете установить этот порог по своему усмотрению). Если их нет, показать сообщение;
  3. Определите ДАЖЕ числа, подсчитайте их и вычислите их среднее. Покажите ваш результат;
  4. Определите все простые числа в вашем массиве и отобразите их;

Ответы [ 2 ]

0 голосов
/ 10 февраля 2011

Зацикливание массива байтов довольно просто (я предполагаю, что вам следует остановиться, когда вы встретите отрицательное число, но ваша ситуация может измениться):

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.Вторую часть вы уже сделали, вы этого не поняли.Вы используете код операции cmp так же, как:

cmp  al, threshold
jge  not_threshhold
; add to threshold counter
not_threshold:

Третья часть тоже довольно проста, но она потребует некоторых знаний о битых трюках.Вы должны знать, что у каждого четного числа будет очищаться младший значащий бит (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:

Пожалуйста, обратите внимание, что есть намного лучше, более эффективныйи элегантные способы проверить на первичность, чем это, но это должно сделать работу.Не зная больше информации, я не могу сказать вам, как выводить информацию, которую вы собираете.

0 голосов
/ 08 февраля 2011

Вам нужно подойти к чему-то вроде этого по частям.Учитывая то, что вам нужно сделать, первая часть, которую я, вероятно, рассмотрю, будет преобразование однобайтового целого числа в строку, представляющую это число в десятичном виде.

Для этого вы делите число на 10.остаток будет представлять наименее значимую цифру (число от 0 до 9 включительно).Преобразуйте это в цифру, добавив «0».Повторяйте этот процесс до тех пор, пока ваше число не станет равным 0. Чтобы упростить печать, вы можете начать с буфера из четырех байтов с символом $ в последнем байте.Поместите цифры в буфер, начиная с последнего байта перед '$', уменьшая указатель в буфере для каждой итерации.

Идентифицировать четные числа довольно просто: для нечетного числа всегда установлен младший значащий бити даже число не делает.

...