【问题标题】:AVR, Assembly, Flag VAVR,大会,标志 V
【发布时间】:2021-04-21 15:59:53
【问题描述】:

我需要关于汇编程序的建议 (AVR ATMega169)。我必须创建代码来计算这个表达式。

R20 = (4 * R16 + 3 * R17 - R18) / 8

我尝试计算代码中的算术表达式,总是检查溢出指令但它不能正常工作

  .org 0
start:
    ldi r16, 10
    ldi r17, 20
    ldi r18, 10
        
    lsl r16
    brvs OVERFLOW

    lsl r16
    brvs OVERFLOW

    mov r20,r17
    brvs OVERFLOW

    lsl r20
    brvs OVERFLOW

    add r20,r17
    brvs OVERFLOW

    add r20, r16
    brvs OVERFLOW

    sub r20,r18
    brvs OVERFLOW

    asr r20
    brvs OVERFLOW

    asr r20
    brvs OVERFLOW

    asr r20
    brvs OVERFLOW
    
    
    brvc OK

    OVERFLOW:
    ldi r30, 0x11

    OK:
    ldi r30, 0x11
konec:
    rjmp konec

【问题讨论】:

  • 在不了解情况的情况下,我们应该考虑将其中一个输入变量视为错误形式。因此,您应该在翻两番之前将 r16 复制到某处。此外,在除以 8 之前,您不会在 4*R16 计算中求和。
  • 你想处理乘法和加/减的溢出吗?如果符号改变则被签名然后左移是溢出是吗?对于在硬件中完成的加/减,我希望否则也不难计算,这里真正的问题是什么?你能更好地解释或展示一个你没有检测到的溢出示例吗?
  • 你的意思是不能正确计算?该表达式的最终值保证适合 8 位寄存器,介于 -127+127 之间,用于 8 位有符号输入,因此选择以可能溢出中间值的方式计算它取决于您.您可以在必要时对中间体使用额外的精度(2 个寄存器),而不是在每个 lsl / add / sub 指令之后检查溢出。

标签: assembly avr flags


【解决方案1】:

就正确设置溢出标志而言,大部分单个操作都会正确设置溢出标志,即addsublsl。然而,asr 似乎并没有以特别有意义的方式设置溢出标志来处理有符号除法。

有问题的是,正确设置溢出标志的指令也会清除溢出标志(成功/没有溢出),所以他们要么设置它,要么根据那个单独的算术运算清除它。因此,似乎没有直接的方法可以在多条指令中累积溢出条件。

解决方案是在每次操作后测试溢出,也许通过分支到出口(跳过其余的计算 - 尽管设置了溢出标志,但仍像 R20 一样留下垃圾。)因为除以 8 不会溢出, 那么如果你到达那部分代码(即没有溢出先前的计算),那么我会在除法之后和到达出口之前清除溢出标志。

另一种方法是在每次操作后将溢出标志or 放入某个变量中,然后使用该变量在最后设置溢出标志。当发生溢出时,这种方法会在R20 中留下更可预测的值,但会增加额外的指令和变量。

【讨论】:

  • 所以如果我在计算中只有 add, sub .. ,我可以在每次操作中使用 V 标志,直到遇到 asr?请问除了BRVS / BRVC指令外,我还应该如何检查溢出?
  • 我不知道如何检查这个处理器上的溢出标志,除了分支。似乎如果你想要寄存器中的值,你会使用某种形式的 if-then 或 if-then-else。
  • 请问汇编器中的分支会是什么样子或者我在哪里可以研究它?我是不是有点迷路了?
  • 不确定您的问题是什么。汇编/机器代码使用 if-goto-label 样式进行控制流,例如 if-then、while-loop、for-loop。条件分支指令,例如 BRVS,只需要一个操作数,即标号。 (溢出标志隐含在操作码中。)在执行期间,处理器将根据溢出标志中的值有条件地更改程序计数器(它告诉它接下来要执行的指令):它要么将 pc 正常推进到下一个顺序指令地址,否则它将改变 pc 等于分支目标地址。
  • 这就是为什么我建议在每次操作后检查溢出,可能通过分支到可以报告的标签,或者只是到计算结束。在溢出时的某处分支不会清除溢出标志,因此当程序到达那里时,溢出标志仍将设置在该路径上,这似乎是您正在寻找的。这个想法是在设置溢出标志时简单地停止计算,因此您可以在设置该标志的情况下跳到最后,而不是在R20 中做出实际答案。
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多