计算并计算数组中的偶数,并检查素数

时间:2011-02-08 03:07:00

标签: assembly x86 x86-16

使用时我的所有显示都是ASCII(mov al,2; int 21h)。

我只能检查一个条件,但不是全部。如何同时检查并输出?

我的任务是

  

考虑一组预先存储的1字节正整数元素   阵列。执行以下操作。

     
      
  1. 计算数组中元素的数量并显示它们;
  2.   
  3. 识别并显示小于特定阈值数的所有数字(您可以根据需要设置此阈值)。如果没有,   显示消息;
  4.   
  5. 识别偶数,计算它们并计算它们的平均值。显示结果;
  6.   
  7. 识别阵列中的所有素数并显示它们;
  8.   

2 个答案:

答案 0 :(得分:0)

你需要接近这样的东西。考虑到你需要做什么,我可能要解决的第一部分是将一个字节的整数转换为一个表示十进制数字的字符串。

为此,您将数字除以10.余数将代表最低有效数字(0到9之间的数字)。通过添加“0”将其转换为数字。重复该过程,直到您的数字为0.为了使打印变得容易,您可能希望从最后一个字节中带有'$'的四字节缓冲区开始。将数字放入缓冲区,从'$'之前的最后一个字节开始,每次迭代都将指针递减到缓冲区。

识别偶数非常简单:奇数始终具有最低有效位,偶数则不然。

答案 1 :(得分: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。你已经完成的第二部分,你没有意识到。您使用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:

请注意,有更好,更有效,更优雅的方法来检查优质度,但它应该完成工作。在不知道更多信息的情况下,我无法告诉您如何输出您收集的信息。