使用arm none eabi gcc编译时不考虑优化标志

使用arm none eabi gcc编译时不考虑优化标志,c,makefile,arm,compiler-optimization,libopencm3,C,Makefile,Arm,Compiler Optimization,Libopencm3,我想使用该项目编译一个带有arm none eabi gcc 9.2.1的程序,并在arm Cortex-M4处理器上运行它。我的程序由两个文件组成:main.c #include "../common/stm32wrapper.h" #include "test.h" #include <stdio.h> #include <string.h> typedef unsigned char u8; typedef unsigned int u32; typedef u

我想使用该项目编译一个带有
arm none eabi gcc 9.2.1
的程序,并在arm Cortex-M4处理器上运行它。我的程序由两个文件组成:
main.c

#include "../common/stm32wrapper.h"
#include "test.h"
#include <stdio.h>
#include <string.h>

typedef unsigned char u8;
typedef unsigned int  u32;
typedef unsigned long long u64;

int main(void)
{
    clock_setup();
    gpio_setup();
    usart_setup(115200);
    flash_setup();

    SCS_DEMCR |= SCS_DEMCR_TRCENA;
    DWT_CYCCNT = 0;
    DWT_CTRL |= DWT_CTRL_CYCCNTENA;

    u32 oldcount, newcount;
    u32 a = 0x75;
    u32 b = 0x14;
    char buffer[36];
    oldcount = DWT_CYCCNT;
    u32 c = test(a,b);
    newcount = DWT_CYCCNT-oldcount;
    sprintf(buffer, "cycles: %d, %08x", newcount, c);
    send_USART_str(buffer);
    return 0;
}
要编译我的程序,我使用以下makefile:

.PHONY: all clean

PREFIX  ?= arm-none-eabi
CC      = $(PREFIX)-gcc -v
LD      = $(PREFIX)-gcc -v
OBJCOPY = $(PREFIX)-objcopy
OBJDUMP = $(PREFIX)-objdump
GDB     = $(PREFIX)-gdb

OPENCM3DIR = ../libopencm3
ARMNONEEABIDIR = /usr/arm-none-eabi
COMMONDIR = ../common

all: test_m4.bin

test_m4.%: ARCH_FLAGS = -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
test_m4.o: CFLAGS += -DSTM32F4
$(COMMONDIR)/stm32f4_wrapper.o: CFLAGS += -DSTM32F4
test_m4.elf: LDSCRIPT = $(COMMONDIR)/stm32f4-discovery.ld
test_m4.elf: LDFLAGS += -L$(OPENCM3DIR)/lib/ -lopencm3_stm32f4
test_m4.elf: OBJS += $(COMMONDIR)/stm32f4_wrapper.o 
test_m4.elf: $(COMMONDIR)/stm32f4_wrapper.o $(OPENCM3DIR)/lib/libopencm3_stm32f4.a

CFLAGS      += -O3 \
           -Wall -Wextra -Wimplicit-function-declaration \
           -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes \
           -Wundef -Wshadow \
           -I$(ARMNONEEABIDIR)/include -I$(OPENCM3DIR)/include \
           -fno-common $(ARCH_FLAGS) -MD \
           -ftime-report
LDFLAGS     += --static -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group \
           -T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections,--no-print-gc-sections \
           $(ARCH_FLAGS)

OBJS        += test.c

%.bin: %.elf
    $(OBJCOPY) -Obinary $^ $@

%.elf: %.o $(OBJS) $(LDSCRIPT)
    $(LD) -o $@ $< $(OBJS) $(LDFLAGS)

test%.o: main.c
    $(CC) $(CFLAGS) -o $@ -c $^

%.o: %.c 
    $(CC) $(CFLAGS) -o $@ -c $^

clean:
    rm -f *.o *.d *.elf *.bin
优化标志似乎没有被考虑在内,因为不管我怎么说,生成的二进制文件总是一样的,程序总是打印
循环:196645000063
。通过分解二进制文件,我得到了-Os和-O3优化的以下输出:

080001ac <main>:
 80001ac:   b570        push    {r4, r5, r6, lr}
 80001ae:   b08a        sub sp, #40 ; 0x28
 80001b0:   f006 fc06   bl  80069c0 <clock_setup>
 80001b4:   f006 fc1c   bl  80069f0 <gpio_setup>
 80001b8:   f44f 30e1   mov.w   r0, #115200 ; 0x1c200
 80001bc:   f006 fc32   bl  8006a24 <usart_setup>
 80001c0:   f006 fc52   bl  8006a68 <flash_setup>
 80001c4:   490e        ldr r1, [pc, #56]   ; (8000200 <main+0x54>)
 80001c6:   4c0f        ldr r4, [pc, #60]   ; (8000204 <main+0x58>)
 80001c8:   680b        ldr r3, [r1, #0]
 80001ca:   4a0f        ldr r2, [pc, #60]   ; (8000208 <main+0x5c>)
 80001cc:   2500        movs    r5, #0
 80001ce:   f043 7380   orr.w   r3, r3, #16777216   ; 0x1000000
 80001d2:   600b        str r3, [r1, #0]
 80001d4:   6025        str r5, [r4, #0]
 80001d6:   6813        ldr r3, [r2, #0]
 80001d8:   f043 0301   orr.w   r3, r3, #1
 80001dc:   6013        str r3, [r2, #0]
 80001de:   6826        ldr r6, [r4, #0]
 80001e0:   f000 f816   bl  8000210 <test>
 80001e4:   6822        ldr r2, [r4, #0]
 80001e6:   4909        ldr r1, [pc, #36]   ; (800020c <main+0x60>)
 80001e8:   4603        mov r3, r0
 80001ea:   1b92        subs    r2, r2, r6
 80001ec:   a801        add r0, sp, #4
 80001ee:   f006 fca5   bl  8006b3c <sprintf>
 80001f2:   a801        add r0, sp, #4
 80001f4:   f006 fc48   bl  8006a88 <send_USART_str>
 80001f8:   4628        mov r0, r5
 80001fa:   b00a        add sp, #40 ; 0x28
 80001fc:   bd70        pop {r4, r5, r6, pc}
 80001fe:   bf00        nop
 8000200:   e000edfc    .word   0xe000edfc
 8000204:   e0001004    .word   0xe0001004
 8000208:   e0001000    .word   0xe0001000
 800020c:   0800c1e8    .word   0x0800c1e8

08000210 <test>:
 8000210:   b480        push    {r7}
 8000212:   b087        sub sp, #28
 8000214:   af00        add r7, sp, #0
 8000216:   2375        movs    r3, #117    ; 0x75
 8000218:   60fb        str r3, [r7, #12]
 800021a:   2314        movs    r3, #20
 800021c:   60bb        str r3, [r7, #8]
 800021e:   2300        movs    r3, #0
 8000220:   613b        str r3, [r7, #16]
 8000222:   e020        b.n 8000266 <test+0x56>
 8000224:   68fb        ldr r3, [r7, #12]
 8000226:   b2db        uxtb    r3, r3
 8000228:   607b        str r3, [r7, #4]
 800022a:   68bb        ldr r3, [r7, #8]
 800022c:   b2db        uxtb    r3, r3
 800022e:   603b        str r3, [r7, #0]
 8000230:   687a        ldr r2, [r7, #4]
 8000232:   683b        ldr r3, [r7, #0]
 8000234:   405a        eors    r2, r3
 8000236:   693b        ldr r3, [r7, #16]
 8000238:   2b00        cmp r3, #0
 800023a:   da01        bge.n   8000240 <test+0x30>
 800023c:   f203 13ff   addw    r3, r3, #511    ; 0x1ff
 8000240:   125b        asrs    r3, r3, #9
 8000242:   4619        mov r1, r3
 8000244:   68fb        ldr r3, [r7, #12]
 8000246:   40cb        lsrs    r3, r1
 8000248:   405a        eors    r2, r3
 800024a:   693b        ldr r3, [r7, #16]
 800024c:   2b00        cmp r3, #0
 800024e:   da01        bge.n   8000254 <test+0x44>
 8000250:   f203 33ff   addw    r3, r3, #1023   ; 0x3ff
 8000254:   129b        asrs    r3, r3, #10
 8000256:   4619        mov r1, r3
 8000258:   68bb        ldr r3, [r7, #8]
 800025a:   40cb        lsrs    r3, r1
 800025c:   4053        eors    r3, r2
 800025e:   617b        str r3, [r7, #20]
 8000260:   693b        ldr r3, [r7, #16]
 8000262:   3301        adds    r3, #1
 8000264:   613b        str r3, [r7, #16]
 8000266:   693b        ldr r3, [r7, #16]
 8000268:   f5b3 5f80   cmp.w   r3, #4096   ; 0x1000
 800026c:   dbda        blt.n   8000224 <test+0x14>
 800026e:   697b        ldr r3, [r7, #20]
 8000270:   4618        mov r0, r3
 8000272:   371c        adds    r7, #28
 8000274:   46bd        mov sp, r7
 8000276:   f85d 7b04   ldr.w   r7, [sp], #4
 800027a:   4770        bx  lr
080001ac:
80001ac:b570推力{r4,r5,r6,lr}
80001ae:b08a子sp,#40;0x28
80001b0:f006 fc06 bl 80069c0
80001b4:f006 fc1c bl 80069f0
80001b8:f44f 30e1移动带r0,#115200;0x1c200
80001bc:f006 fc32 bl 8006a24
80001c0:f006 fc52 bl 8006a68
80001c4:490e ldr r1,[pc,#56];(8000200 )
80001c6:4c0f ldr r4,[pc,#60];(8000204 )
80001c8:680b ldr r3[r1,#0]
80001ca:4a0f ldr r2,[pc,#60];(8000208 )
80001cc:2500 movs r5,#0
80001ce:f043 7380或w r3,r3,#16777216;0x1000000
80001d2:600b str r3[r1,#0]
80001d4:6025 str r5[r4,#0]
80001d6:6813 ldr r3[r2,#0]
80001d8:f043 0301或w r3,r3,#1
80001dc:6013街r3[r2,#0]
80001de:6826 ldr r6[r4,#0]
80001e0:f000 f816 bl 8000210
80001e4:6822 ldr r2[r4,#0]
80001e6:4909 ldr r1,[pc,#36];(800020c)
80001e8:4603 mov r3,r0
80001ea:1b92接头r2、r2、r6
80001ec:a801添加r0,sp,#4
80001ee:f006 fca5 bl 8006b3c
80001f2:a801添加r0,sp,#4
80001f4:f006 fc48 bl 8006a88
80001f8:4628 mov r0,r5
80001fa:b00a添加sp,#40;0x28
80001fc:bd70 pop{r4,r5,r6,pc}
80001fe:bf00 nop
8000200:e000edfc。字0xe000edfc
8000204:e0001004.字0xe0001004
8000208:e0001000.字0xe0001000
800020c:0800c1e8.字0x0800c1e8
08000210 :
8000210:b480推送{r7}
8000212:b087子sp,#28
8000214:af00添加r7,sp,#0
8000216:2375 movs r3,#117;0x75
8000218:60fb街r3[r7,#12]
800021a:2314 movs r3,#20
800021c:60bb str r3[r7,#8]
800021e:2300 movs r3,#0
8000220:613b街r3[r7,#16]
8000222:e020 b.n 8000266
8000224:68fb ldr r3[r7,#12]
8000226:b2db uxtb r3,r3
8000228:607b str r3[r7,#4]
800022a:68bb ldr r3[r7,#8]
800022c:b2db uxtb r3,r3
800022e:603b str r3[r7,#0]
8000230:687a ldr r2[r7,#4]
8000232:683b ldr r3[r7,#0]
8000234:405a提高采收率r2,r3
8000236:693b ldr r3[r7,#16]
8000238:2b00 cmp r3,#0
800023a:da01 bge.n 8000240
800023c:f203 13ff地址r3,r3,#511;0x1ff
8000240:125b asrs r3,r3,#9
8000242:4619 mov r1,r3
8000244:68fb ldr r3[r7,#12]
8000246:40cb LSR r3、r1
8000248:405a提高采收率r2,r3
800024a:693b ldr r3[r7,#16]
800024c:2b00 cmp r3,#0
800024e:da01 bge.n 8000254
8000250:f203第33层增补r3、r3、#1023;0x3ff
8000254:129b asrs r3,r3,#10
8000256:4619 mov r1,r3
8000258:68bb ldr r3[r7,#8]
800025a:40cb LSR r3、r1
800025c:4053提高采收率r3,r2
800025e:617b str r3[r7,#20]
8000260:693b ldr r3[r7,#16]
8000262:3301加上r3,#1
8000264:613b街r3[r7,#16]
8000266:693b ldr r3[r7,#16]
8000268:f5b3 5f80 cmp.w r3,#4096;0x1000
800026c:dbda blt.n 8000224
800026e:697b ldr r3[r7,#20]
8000270:4618 mov r0,r3
8000272:371c加上r7,#28
8000274:46bd mov sp,r7
8000276:f85d 7b04 ldr.w r7[sp],#4
800027a:4770 bx lr
这对我来说真的很奇怪,因为代码可以在速度方面得到明显的增强。例如,可以计算一个
uxtb
,而不是两个(如果在
eor
之后执行),因此我认为这里有问题。为什么这里不考虑优化标志?我的makefile有什么问题吗

typedef unsigned int uint32_t;

uint32_t test(uint32_t a, uint32_t b) {
    uint32_t tmp0, tmp1;
    uint32_t c;

    for(int i = 0; i< 4096; i++) {
        tmp0 = a & 0xff;
        tmp1 = b & 0xff;
        c = tmp0 ^ tmp1 ^ (a>>(i/512)) ^ (b >> (i/1024));
    }
    return c;
}

unsigned int hello ( void )
{
    return(test(0x75,0x14));
}
-O0

arm none eabi gcc-O0 so.c-c-mthumb-mcpu=cortex-m4-o so.o
第节的分解。正文:
00000000 :
0:b480推送{r7}
2:b087子sp,#28
4:af00加上r7,sp,#0
6:6078 str r0,[r7,#4]
8:6039 str r1[r7,#0]
a:2300 movs r3,#0
c:613b str r3[r7,#16]
e:e020 b.n.52
10:687b ldr r3[r7,#4]
12:b2db uxtb r3,r3
14:60fb str r3[r7,#12]
16:683b ldr r3[r7,#0]
18:b2db uxtb r3,r3
1a:60bb str r3[r7,#8]
1c:68fa ldr r2,[r7,#12]
1e:68bb ldr r3,[r7,#8]
20:405a提高采收率r2,r3
22:693b ldr r3[r7,#16]
24:200立方厘米r3,#0
26:da01 bge.n 2c
28:f203 13ff地址r3,r3,#511;0x1ff
2c:125b asrs r3,r3,#9
2e:4619 mov r1,r3
30:687b ldr r3,[r7,#4]
32:40 CB LSR r3,r1
34:405a提高采收率r2,r3
36:693b ldr r3[r7,#16]
38:2b00 cmp r3,#0
3a:da01 bge.n 40
3c:f203第33段增补r3,r3,#1023;0x3ff
40:129b asrs r3,r3,#10
42:4619 mov r1,r3
44:683b ldr r3[r7,#0]
46:40 CB LSR r3,r1
48:4053 e
080001ac <main>:
 80001ac:   b570        push    {r4, r5, r6, lr}
 80001ae:   b08a        sub sp, #40 ; 0x28
 80001b0:   f006 fc06   bl  80069c0 <clock_setup>
 80001b4:   f006 fc1c   bl  80069f0 <gpio_setup>
 80001b8:   f44f 30e1   mov.w   r0, #115200 ; 0x1c200
 80001bc:   f006 fc32   bl  8006a24 <usart_setup>
 80001c0:   f006 fc52   bl  8006a68 <flash_setup>
 80001c4:   490e        ldr r1, [pc, #56]   ; (8000200 <main+0x54>)
 80001c6:   4c0f        ldr r4, [pc, #60]   ; (8000204 <main+0x58>)
 80001c8:   680b        ldr r3, [r1, #0]
 80001ca:   4a0f        ldr r2, [pc, #60]   ; (8000208 <main+0x5c>)
 80001cc:   2500        movs    r5, #0
 80001ce:   f043 7380   orr.w   r3, r3, #16777216   ; 0x1000000
 80001d2:   600b        str r3, [r1, #0]
 80001d4:   6025        str r5, [r4, #0]
 80001d6:   6813        ldr r3, [r2, #0]
 80001d8:   f043 0301   orr.w   r3, r3, #1
 80001dc:   6013        str r3, [r2, #0]
 80001de:   6826        ldr r6, [r4, #0]
 80001e0:   f000 f816   bl  8000210 <test>
 80001e4:   6822        ldr r2, [r4, #0]
 80001e6:   4909        ldr r1, [pc, #36]   ; (800020c <main+0x60>)
 80001e8:   4603        mov r3, r0
 80001ea:   1b92        subs    r2, r2, r6
 80001ec:   a801        add r0, sp, #4
 80001ee:   f006 fca5   bl  8006b3c <sprintf>
 80001f2:   a801        add r0, sp, #4
 80001f4:   f006 fc48   bl  8006a88 <send_USART_str>
 80001f8:   4628        mov r0, r5
 80001fa:   b00a        add sp, #40 ; 0x28
 80001fc:   bd70        pop {r4, r5, r6, pc}
 80001fe:   bf00        nop
 8000200:   e000edfc    .word   0xe000edfc
 8000204:   e0001004    .word   0xe0001004
 8000208:   e0001000    .word   0xe0001000
 800020c:   0800c1e8    .word   0x0800c1e8

08000210 <test>:
 8000210:   b480        push    {r7}
 8000212:   b087        sub sp, #28
 8000214:   af00        add r7, sp, #0
 8000216:   2375        movs    r3, #117    ; 0x75
 8000218:   60fb        str r3, [r7, #12]
 800021a:   2314        movs    r3, #20
 800021c:   60bb        str r3, [r7, #8]
 800021e:   2300        movs    r3, #0
 8000220:   613b        str r3, [r7, #16]
 8000222:   e020        b.n 8000266 <test+0x56>
 8000224:   68fb        ldr r3, [r7, #12]
 8000226:   b2db        uxtb    r3, r3
 8000228:   607b        str r3, [r7, #4]
 800022a:   68bb        ldr r3, [r7, #8]
 800022c:   b2db        uxtb    r3, r3
 800022e:   603b        str r3, [r7, #0]
 8000230:   687a        ldr r2, [r7, #4]
 8000232:   683b        ldr r3, [r7, #0]
 8000234:   405a        eors    r2, r3
 8000236:   693b        ldr r3, [r7, #16]
 8000238:   2b00        cmp r3, #0
 800023a:   da01        bge.n   8000240 <test+0x30>
 800023c:   f203 13ff   addw    r3, r3, #511    ; 0x1ff
 8000240:   125b        asrs    r3, r3, #9
 8000242:   4619        mov r1, r3
 8000244:   68fb        ldr r3, [r7, #12]
 8000246:   40cb        lsrs    r3, r1
 8000248:   405a        eors    r2, r3
 800024a:   693b        ldr r3, [r7, #16]
 800024c:   2b00        cmp r3, #0
 800024e:   da01        bge.n   8000254 <test+0x44>
 8000250:   f203 33ff   addw    r3, r3, #1023   ; 0x3ff
 8000254:   129b        asrs    r3, r3, #10
 8000256:   4619        mov r1, r3
 8000258:   68bb        ldr r3, [r7, #8]
 800025a:   40cb        lsrs    r3, r1
 800025c:   4053        eors    r3, r2
 800025e:   617b        str r3, [r7, #20]
 8000260:   693b        ldr r3, [r7, #16]
 8000262:   3301        adds    r3, #1
 8000264:   613b        str r3, [r7, #16]
 8000266:   693b        ldr r3, [r7, #16]
 8000268:   f5b3 5f80   cmp.w   r3, #4096   ; 0x1000
 800026c:   dbda        blt.n   8000224 <test+0x14>
 800026e:   697b        ldr r3, [r7, #20]
 8000270:   4618        mov r0, r3
 8000272:   371c        adds    r7, #28
 8000274:   46bd        mov sp, r7
 8000276:   f85d 7b04   ldr.w   r7, [sp], #4
 800027a:   4770        bx  lr
typedef unsigned int uint32_t;

uint32_t test(uint32_t a, uint32_t b) {
    uint32_t tmp0, tmp1;
    uint32_t c;

    for(int i = 0; i< 4096; i++) {
        tmp0 = a & 0xff;
        tmp1 = b & 0xff;
        c = tmp0 ^ tmp1 ^ (a>>(i/512)) ^ (b >> (i/1024));
    }
    return c;
}

unsigned int hello ( void )
{
    return(test(0x75,0x14));
}
arm-none-eabi-gcc --version
arm-none-eabi-gcc (GCC) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
arm-none-eabi-gcc -O0 so.c -c -mthumb -mcpu=cortex-m4 -o so.o

Disassembly of section .text:

00000000 <test>:
   0:   b480        push    {r7}
   2:   b087        sub sp, #28
   4:   af00        add r7, sp, #0
   6:   6078        str r0, [r7, #4]
   8:   6039        str r1, [r7, #0]
   a:   2300        movs    r3, #0
   c:   613b        str r3, [r7, #16]
   e:   e020        b.n 52 <test+0x52>
  10:   687b        ldr r3, [r7, #4]
  12:   b2db        uxtb    r3, r3
  14:   60fb        str r3, [r7, #12]
  16:   683b        ldr r3, [r7, #0]
  18:   b2db        uxtb    r3, r3
  1a:   60bb        str r3, [r7, #8]
  1c:   68fa        ldr r2, [r7, #12]
  1e:   68bb        ldr r3, [r7, #8]
  20:   405a        eors    r2, r3
  22:   693b        ldr r3, [r7, #16]
  24:   2b00        cmp r3, #0
  26:   da01        bge.n   2c <test+0x2c>
  28:   f203 13ff   addw    r3, r3, #511    ; 0x1ff
  2c:   125b        asrs    r3, r3, #9
  2e:   4619        mov r1, r3
  30:   687b        ldr r3, [r7, #4]
  32:   40cb        lsrs    r3, r1
  34:   405a        eors    r2, r3
  36:   693b        ldr r3, [r7, #16]
  38:   2b00        cmp r3, #0
  3a:   da01        bge.n   40 <test+0x40>
  3c:   f203 33ff   addw    r3, r3, #1023   ; 0x3ff
  40:   129b        asrs    r3, r3, #10
  42:   4619        mov r1, r3
  44:   683b        ldr r3, [r7, #0]
  46:   40cb        lsrs    r3, r1
  48:   4053        eors    r3, r2
  4a:   617b        str r3, [r7, #20]
  4c:   693b        ldr r3, [r7, #16]
  4e:   3301        adds    r3, #1
  50:   613b        str r3, [r7, #16]
  52:   693b        ldr r3, [r7, #16]
  54:   f5b3 5f80   cmp.w   r3, #4096   ; 0x1000
  58:   dbda        blt.n   10 <test+0x10>
  5a:   697b        ldr r3, [r7, #20]
  5c:   4618        mov r0, r3
  5e:   371c        adds    r7, #28
  60:   46bd        mov sp, r7
  62:   bc80        pop {r7}
  64:   4770        bx  lr

00000066 <hello>:
  66:   b580        push    {r7, lr}
  68:   af00        add r7, sp, #0
  6a:   2114        movs    r1, #20
  6c:   2075        movs    r0, #117    ; 0x75
  6e:   f7ff fffe   bl  0 <test>
  72:   4603        mov r3, r0
  74:   4618        mov r0, r3
  76:   bd80        pop {r7, pc}
arm-none-eabi-gcc -O1 so.c -c -mthumb -mcpu=cortex-m4 -o so.o
arm-none-eabi-objdump -D so.o

so.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <test>:
   0:   f44f 5380   mov.w   r3, #4096   ; 0x1000
   4:   3b01        subs    r3, #1
   6:   d1fd        bne.n   4 <test+0x4>
   8:   08ca        lsrs    r2, r1, #3
   a:   ea82 12d0   eor.w   r2, r2, r0, lsr #7
   e:   ea80 0301   eor.w   r3, r0, r1
  12:   b2db        uxtb    r3, r3
  14:   ea82 0003   eor.w   r0, r2, r3
  18:   4770        bx  lr

0000001a <hello>:
  1a:   b508        push    {r3, lr}
  1c:   2114        movs    r1, #20
  1e:   2075        movs    r0, #117    ; 0x75
  20:   f7ff fffe   bl  0 <test>
  24:   bd08        pop {r3, pc}
Disassembly of section .text:

00000000 <test>:
   0:   ea80 0301   eor.w   r3, r0, r1
   4:   08ca        lsrs    r2, r1, #3
   6:   ea82 10d0   eor.w   r0, r2, r0, lsr #7
   a:   b2db        uxtb    r3, r3
   c:   4058        eors    r0, r3
   e:   4770        bx  lr

00000010 <hello>:
  10:   2063        movs    r0, #99 ; 0x63
  12:   4770        bx  lr
00000000 <test>:
   0:   ea80 0301   eor.w   r3, r0, r1
   4:   08ca        lsrs    r2, r1, #3
   6:   ea82 10d0   eor.w   r0, r2, r0, lsr #7
   a:   b2db        uxtb    r3, r3
   c:   4058        eors    r0, r3
   e:   4770        bx  lr

00000010 <hello>:
  10:   2063        movs    r0, #99 ; 0x63
  12:   4770        bx  lr
00000000 <test>:
   0:   08cb        lsrs    r3, r1, #3
   2:   ea83 13d0   eor.w   r3, r3, r0, lsr #7
   6:   4048        eors    r0, r1
   8:   b2c0        uxtb    r0, r0
   a:   4058        eors    r0, r3
   c:   4770        bx  lr

0000000e <hello>:
   e:   2114        movs    r1, #20
  10:   2075        movs    r0, #117    ; 0x75
  12:   f7ff bffe   b.w 0 <test>