小编Sir*_*ack的帖子

更快的16位乘法算法,适用于8位MCU

我正在寻找一种算法来乘以两个比下面更好的整数.你有一个好主意吗?(MCU - AT Tiny 84/85或类似 - 此代码运行的地方没有mul/div运算符)

uint16_t umul16_(uint16_t a, uint16_t b)
{
    uint16_t res=0;

    while (b) {
        if ( (b & 1) )
            res+=a;
        b>>=1;
        a+=a;
    }

    return res;
}
Run Code Online (Sandbox Code Playgroud)

当使用avr-gcc编译器为AT Tiny 85/84编译时,该算法几乎与avr-gcc生成的算法__mulhi3相同.

avr-gcc算法:

00000106 <__mulhi3>:
 106:   00 24           eor r0, r0
 108:   55 27           eor r21, r21
 10a:   04 c0           rjmp    .+8         ; 0x114 <__mulhi3+0xe>
 10c:   08 0e           add r0, r24
 10e:   59 1f           adc r21, r25
 110:   88 0f           add r24, r24
 112:   99 1f           adc r25, …
Run Code Online (Sandbox Code Playgroud)

c c++ algorithm microcontroller avr

21
推荐指数
1
解决办法
1742
查看次数

有谁知道为什么gcc 4.8.4在无限循环中优化这段代码?

我发现在没有优化和-Os优化的情况下编译的以下代码的汇编程序结果之间的差异非常奇怪.

#include <stdio.h>

int main(){
    int i;

    for(i=3;i>2;i++);

    printf("%d\n",i);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有优化代码结果:

000000000040052d <main>:
  40052d:   55                      push   %rbp
  40052e:   48 89 e5                mov    %rsp,%rbp
  400531:   48 83 ec 10             sub    $0x10,%rsp
  400535:   c7 45 fc 03 00 00 00    movl   $0x3,-0x4(%rbp)
  40053c:   c7 45 fc 03 00 00 00    movl   $0x3,-0x4(%rbp)
  400543:   eb 04                   jmp    400549 <main+0x1c>
  400545:   83 45 fc 01             addl   $0x1,-0x4(%rbp)
  400549:   83 7d fc 02             cmpl   $0x2,-0x4(%rbp)
  40054d:   7f f6                   jg     400545 <main+0x18> …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc

0
推荐指数
1
解决办法
193
查看次数

标签 统计

c ×2

algorithm ×1

assembly ×1

avr ×1

c++ ×1

gcc ×1

microcontroller ×1