mov al,2; int 21h
使用 ( )时,我所有的显示都是 ASCII 。
我只能检查一种情况,但不能检查全部。如何同时检查所有并输出?
我的任务是
考虑数组中一组预先存储的 1 字节正整数元素。请执行下列操作。
- 计算数组中元素的数量并显示它们;
- 识别并显示小于特定阈值的所有数字(您可以根据需要设置此阈值)。如果没有,则显示一条消息;
- 识别偶数,计算它们并计算它们的平均值。显示您的结果;
- 识别数组中的所有素数并显示它们;
你需要分段处理这样的事情。考虑到您需要做什么,我可能要处理的第一部分是将单字节整数转换为以十进制表示该数字的字符串。
为此,您将数字除以 10。余数将代表最低有效位(包括 0 到 9 的数字)。通过添加“0”将其转换为数字。重复该过程,直到您的数字为 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:
请不要说有比这更好、更高效、更优雅的方法来检查素数,但它应该可以完成工作。在不了解更多信息的情况下,我无法告诉您如何输出您收集的信息。