无法理解为什么某些变量被更改

时间:2019-02-17 21:19:01

标签: assembly masm irvine32

我的任务是创建一个程序,该程序将列出用户标识范围内的复合数字。为了确定一个数字是否为整数,我将对其进行除法并检查是否为零。我的实际问题是尝试在我的代码中打印名为“ 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。

1 个答案:

答案 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来查找达到足够高值的奇数合成材料,然后循环打印每个偶数和奇数会更有效。如果在筛子中设置了位图或字节图条目,则为数字。