我的任务是创建一个程序,该程序将列出用户标识范围内的复合数字。为了确定一个数字是否为整数,我将对其进行除法并检查是否为零。我的实际问题是尝试在我的代码中打印名为“ current”的变量。 current初始化为3,然后在每个循环中递增,因此我希望数字4首先打印,但先打印2。这怎么可能,电流甚至从未达到2,而仅从3增加。
mov ecx, terms
trial:
inc current
mov eax, current
cdq
mov ebx, 2
div ebx
cmp edx, 0
je composite
cmp edx, 0
jg below
composite:
mov edx, OFFSET current
call WriteDec
call CrLf
below:
loop trial
如果我输入9,我希望可以打印4、6和8,因为当它们除以2时,它们都剩下0。相反,我得到了2、3、4、5和6。
答案 0 :(得分:1)
WriteDec takes its arg in EAX。它在打印,而不是您在EDX中放入的指标(!)。 WriteDec按值取一个整数
第一次调用WriteDec
时(在3之后的第一个偶数上),EAX = 4/2 = 2
就是这样打印的。使用调试器查看寄存器,您可能已经在EAX中看到了2
。
顺便说一句,顺便说一句,您的循环仅检查偶数,而不是所有组合。 (而且您以大量的低效率方式进行操作。即使是微不足道的,也只需test al,1
即可测试EAX的低端版本。此版本可让我们扩展到试用版,排除偶数后进行除法循环,但目前最简单的分支是否可以完全打印。
mov ecx, terms
mov ebx, current
trial: ; do {
inc ebx
test bl, 1
jnz odd ; low bit set = not divisible by 2 = odd
;; TODO: trial division loop after ruling out even numbers
;; mov eax,ebx
;; xor edx,edx
;; div something in a loop
even:
mov eax, ebx ; WriteDec takes an arg in EAX, and preserves all others
call WriteDec
call CrLf
odd:
cmp ebx, ecx
jb trial ; }while(current < terms)
;; The loop instruction is inefficient, don't bother with it
;; and you don't need a down-counter for the loop anyway
;; you already have terms
mov current, ebx ; in case you care?
检查组合的最简单方法是进行试验划分:Checking if a number is prime in NASM Win64 Assembly。
如果您想将所有合成材料打印到一定数量,则运行Sieve of Eratosthenes来查找达到足够高值的奇数合成材料,然后循环打印每个偶数和奇数会更有效。如果在筛子中设置了位图或字节图条目,则为数字。