当前位置: 首页 > 知识库问答 >
问题:

在AVR-GCC中,常数除法是如何工作的?[副本]

昝枫
2023-03-14
#include <stdint.h>

uint8_t divide_by_6(uint8_t x) {
    return x / 6;
}
divide_by_6:
    ldi r25,lo8(-85)
    mul r24,r25
    mov r24,r1
    clr r1
    lsr r24
    lsr r24
    ret

但我不明白大会在做什么。此汇编代码如何执行除法?

共有1个答案

东郭远航
2023-03-14

-85是0xFFFFFFFFFFFFFFFAB,所以lo8(-85)是0xAB,即171。

代码将参数乘以171,然后返回乘积的最高有效字节,右移2(即除以4)。

所以它实际上返回x*171/(256*4)==x*171/1024,大约==x*1/6==x/6。

 类似资料:
  • 问题内容: 我有一个调用sin,cos和acos的ac程序。编译时出现以下错误: 我知道当您不使用-lm gcc标志时这很常见。我正在使用此标志。我这样称呼GCC: 当我在其中一台计算机上进行编译时,这可以正常工作。我能想到的唯一区别是,它不能在x86_64上运行,而可以在其上运行的计算机是i686。两者都是Ubuntu。文件libm.a存在于无法使用的计算机上,并且我没有收到任何错误消息称无法找

  • 可能的重复: C++中指针变量和引用变量有什么区别? 这让我很困惑: 在C语言中&通常表示VAR的地址。这里是什么意思?这是指针符号的一种别致方式吗? 我之所以假设它是一个指针符号,是因为这毕竟是一个指针,我们正在检查两个指针是否相等。 我在cplusplus.com上学习,他们有这个例子。

  • 在Kotlin中,编译以下代码: 但是,该代码不: 编译此代码将导致以下错误: 在Java中,两个示例都无法编译: 不出所料,前面的两个代码片段都会产生熟悉的编译器错误: 令我惊讶的是,第一个 Kotlin 示例根本有效,其次,如果它有效,为什么第二个 Kotlin 示例会失败?Kotlin 是否将方法的返回类型视为其签名的一部分?此外,为什么 Kotlin 中的方法签名与 Java 相比,它遵循

  • 当我将inplace属性的值更改为False时,索引"a"中的元素未删除,但当我更改inplace=True value at index"a"时删除。我不明白它是如何工作的。

  • 我是JavaScript的新手,我认为对象是通过引用传递的。 我期望的输出是: 获得的输出: 当引用的地址时,为什么仍然 null null

  • 我已经理解了quicksort算法中的分区部分是如何完成的,但是我在理解quicksort递归函数时遇到了麻烦。谁能一步一步地给我解释一下它是怎么工作的吗?这里粘贴的是C++代码。 我的逻辑到目前为止(一步一步)是这样的: