【发布时间】: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 指令之后检查溢出。