【问题标题】:How can i exit the for statement in assembly如何退出程序集中的 for 语句
【发布时间】:2019-02-24 02:11:23
【问题描述】:

此代码的目的是将打开的位闪烁 3 次,退出循环并关闭它们。目前代码似乎处于无限循环,计数为0后不退出循环

                   mov.b   #0x00,&P2REN ;

                   mov.b   #0xFF,&P2OUT ;
                   ;mov.b   #3, r5
                   .bss    i,3 





                                     mov.w   #3,&i        ; 



                   dec.w   &i           ; i--,
                   jnz     for          ; back to for loop
  for_Done:

                    delayloop:                 dec.w   r15          ;
                   jnz     delayloop    ;jump if not zero to delayloop
                   jmp     for         ;jump to the for
                   ;jmp    for_Done

【问题讨论】:

  • asm 没有“for 语句”。您只需在循环上有一个名为for 的标签。使底部的分支有条件,因此当某个计数器或其他任何条件达到某个条件时它会落空。
  • 我已经更新了代码,我用 C 语言做了一个版本,它完成了我打算为这个汇编代码做的事情。我只想知道如何退出“for”标签。我知道这是有条件的,但是当 i = 0 时它仍然没有退出循环
  • 您是否使用调试器单步验证它不会失败?稍后您有一个无条件的jmp 回到for:,所以很明显,如果您想在过去的某个地方继续执行,您需要跳过那个jmp。另外,为什么要将i 保存在内存中,而不是在寄存器中?
  • 关于上拉电阻的 cmets 是错误的。请出示原始 C 代码。

标签: assembly msp430


【解决方案1】:

就像@PeterCordes 提到的,最后一个命令是无条件跳转到循环。

该循环减少变量i,在从结尾跳转到循环后为0。它将不会再次用 3 初始化。在循环中递减 i 后,它将是负数,并将保持超过 32000 次迭代(w=16Bit?)。然后它继续到最后一跳,一切都将从新开始。

你真的需要最后一跳吗?如果您到达此代码,您可以确定i == 0

【讨论】:

    猜你喜欢
    • 2022-07-28
    • 2015-03-06
    • 1970-01-01
    • 2014-07-19
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多