assembly 在汇编语言中使用CMP语句

ncgqoxb0  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(208)

我想在汇编语言中使用比较语句和用户输入。在我接受用户输入后,它将比较语句并执行任务。但是,不管结果如何,它将只读取第一个比较语句并执行任务,即使它不符合条件。

bl _inputFunc

    cmp r1, #1
    beq _redLight
    cmp r1, #2
    beq _greenLight
    cmp r1, #3
    beq _offLight

    _redLight:
            GPIOWrite   pin17, high
            bl _inputFunc
            
    _greenLight:
            GPIOWrite   pin18, high
            bl _inputFunc

    _offLight:
            GPIOWrite   pin17, low
            GPIOWrite   pin18, low
            bl _inputFunc
jrcvhitl

jrcvhitl1#

在机器代码中,在任何一条不是分支的指令之后,继续执行存储器中的下一条指令。这包括没有被采用的条件分支。在指令之间插入标签并不改变这一点。标签不是函数或块,在标签的“末尾”没有隐含的“返回”或任何类似的东西。事实上,标签没有“结束”这回事。
不要试图从if/elsewhileswitch等更高级别的结构来考虑汇编,至少不是直接的只有分支(相当于goto ...)和条件分支(if (cond) goto ...)。任何更高级别的抽象都由您根据这些构建块来实现。关于编程时不要使用goto的所有经验教训都已过时;在程序集中,除了goto之外,没有其他内容。
假设这个程序应该是一个无限循环,我会把它写为

_top:
    bl _inputFunc

    cmp r1, #1
    beq _redLight
    cmp r1, #2
    beq _greenLight
    cmp r1, #3
    beq _offLight
    // if we reach here, we got an input out of range.
    // insert error handling code here
    b _top // continue looping

_redLight:
    GPIOWrite   pin17, high
    b _top
            
_greenLight:
    GPIOWrite   pin18, high
    b _top

_offLight:
    GPIOWrite   pin17, low
    GPIOWrite   pin18, low
    b _top

我去掉了您的额外缩进,这似乎会造成汇编是块结构语言的误解。它们也可能只是分支回到已经有对它调用的_top
我保留了用下划线作为标签命名的惯例,但在独立程序中通常不需要这样做,您可以直接将它们命名为topredLight等。

相关问题