【问题标题】:Average of 2 registers, avoiding overflow in assembly?平均2个寄存器,避免汇编溢出?
【发布时间】:2021-06-07 14:22:27
【问题描述】:

我的问题是,当它超出 8 位范围时,我不知道如何处理。

我的程序使用较小的十六进制数字(如 #02h + #05h)运行,但不能使用较大的数字(如 #0A9H + #0B5H)。

【问题讨论】:

    标签: assembly average 8051


    【解决方案1】:

    对于 2 个数字,有一个 asm 技巧:进位标志保存 ADD 结果的第 9 位,我们可以通过进位右移右移该 9 位值。 8051 的RRC instruction 就是这样做的。

       ADD A, R0
       RRC
    

    如果没有,请查看以下问题 How can I safely average two unsigned ints in C++?Explanation of the safe average of two numbers

    对于超过 2 个数字,执行扩展精度(使用加法进位)以保持更大的总和。

    【讨论】:

    • @Doomedtostudy:不是这样的;你需要一个 12 位的和来保存最大可能的结果 (10 * 0xff = 0x9f6)。不过,您可以在完成后使用 RRC 作为扩展精度除法的一部分。由于您的除数甚至不再是 2 的幂,因此该部分不仅仅是扩展精度移位。如果您需要更多帮助,请提出一个新问题,在其中描述您实际尝试做的事情(我没有在现有问题中找到此答案,因此希望此问答对当前形式的未来读者有用)。或者只是在 C 中使用 uint16_t,看看优化的 8051 编译器做了什么
    • 谢谢你的朋友。我会问另一个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 2021-03-25
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多