【问题标题】:Add new line every 5 loops MASM每 5 个循环添加新行 MASM
【发布时间】:2016-08-03 15:17:23
【问题描述】:

我正在尝试在我正在编写的汇编程序中正确格式化输出,但我发现很难使用 ECX 寄存器来跟踪我在哪个循环上并根据该值采取行动.

我想每 5 次循环运行一次添加一个新行,我尝试使用 ECX 寄存器的模数来执行此操作,但没有任何运气。我正在使用 Irvine32 库。

我正在尝试做这样的事情:

mov    ecx, someNumber

the_loop:
    cmp    0, ecx mod 5
    je     fifth_loop
    jmp    continue

    fifth_loop:
        call    CrLf

    continue:
        loop    the_loop

这显然不能正常运行。虽然我认为逻辑是合理的,但我不知道在语法上如何在 ECX 寄存器旁边使用模数。我知道我可以将 DIV 与 EAX 和 EDX 寄存器一起使用,但我已经在使用 EAX 和 EBX 寄存器来计算斐波那契数列(这是我程序的目标。)

【问题讨论】:

    标签: assembly x86 masm irvine32


    【解决方案1】:

    有多种选择。 如果您在寄存器上运行不足,您可以将它们的值存储在堆栈或内存中,并在不再需要寄存器后恢复原始值。

    另一种选择是计数到 5,然后执行 CrLf 并重置计数器:

        mov    ecx, someNumber
        mov    edx, 1
    the_loop:
        cmp    edx, 5
        je     fifth_loop
        inc    edx
        jmp    continue
    fifth_loop:
        call    CrLf
        mov     edx, 1
    continue:
        loop    the_loop
    

    这里你只需要edx 和其他寄存器。

    【讨论】:

    • 用 5 加载 edx 并减少它(分支为零)将不再需要 cmp edx
    • @Tommylee2k 我想你的意思是在 1 上使用分支
    • 不,在 0 上,使用 jnz ...在 1 上的分支也需要一个“cmp”...看我的答案,也许这更清楚
    • @Tommylee2k 在这种情况下,您需要从 4 开始,否则您将获得 6 次迭代
    • @Tommylee2k 是的,以这种形式很好。我以为你是在递减计数器之前执行循环内容
    【解决方案2】:

    SomeWittyUsername 的答案的较小版本,对于 dx % 5 东西使用 3 条指令,而不是 5 条,因为“cmp dx”和“jmp”是不需要的

        mov    edx, 5
        mov    ecx, someNumber
    
    the_loop:
        ; do the stuff you want inside 'the loop'
        dec    edx
        jnz    continue
    fifth_loop:
        call    CrLf
        mov     edx, 5    ; reload counter
    
    continue:
        loop    the_loop
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多