首页 > 其他分享 >Compile result comparison

Compile result comparison

时间:2023-07-02 12:23:57浏览次数:30  
标签:comparison r0 r1 sp mov Compile ldr add result

The source code as below

#include <stdint.h>
#include <stdio.h>

typedef struct
{
    uint8_t data1;
    uint8_t data2;
    uint8_t data3;
    uint8_t data4;
    uint8_t data5;
} config_t;

config_t gConfig[2] = {0};
uint8_t gIndex = 0;
config_t* pConfig = 0;

void func1(config_t* config)
{
    config->data1 = 0;
    config->data2 = 100;
}

void func2(void)
{
    gConfig[gIndex].data1 = 0;
    gConfig[gIndex].data2 = 100;
}


void func3(void)
{
    pConfig->data1 = 0;
    pConfig->data2 = 100;
}


void func4(void)
{
    gConfig[gIndex].data3 = 0;
    gConfig[gIndex].data4 = 100;
}


int main(void)
{

    pConfig = &gConfig[gIndex];
    func1(&gConfig[0]);
    func2();
    func3();

    return 0;
}

 

code explore base on  clang 13.0 arm v7

 

 

func1:
        sub     sp, sp, #4
        str     r0, [sp]
        ldr     r1, [sp]
        mov     r0, #0
        strb    r0, [r1]
        ldr     r1, [sp]
        mov     r0, #100
        strb    r0, [r1, #1]
        add     sp, sp, #4
        bx      lr
func2:
        ldr     r1, .LCPI1_0
.LPC1_0:
        add     r1, pc, r1
        ldrb    r0, [r1]
        add     r3, r0, r0, lsl #2
        ldr     r0, .LCPI1_1
.LPC1_1:
        add     r0, pc, r0
        mov     r2, #0
        strb    r2, [r0, r3]
        ldrb    r1, [r1]
        add     r1, r1, r1, lsl #2
        add     r1, r0, r1
        mov     r0, #100
        strb    r0, [r1, #1]
        bx      lr
.LCPI1_0:
        .long   gIndex-(.LPC1_0+8)
.LCPI1_1:
        .long   gConfig-(.LPC1_1+8)
func3:
        ldr     r1, .LCPI2_0
.LPC2_0:
        ldr     r1, [pc, r1]
        mov     r0, #0
        strb    r0, [r1]
        ldr     r1, .LCPI2_1
.LPC2_1:
        ldr     r1, [pc, r1]
        mov     r0, #100
        strb    r0, [r1, #1]
        bx      lr
.LCPI2_0:
        .long   pConfig-(.LPC2_0+8)
.LCPI2_1:
        .long   pConfig-(.LPC2_1+8)
func4:
        ldr     r1, .LCPI3_0
.LPC3_0:
        add     r1, pc, r1
        ldrb    r0, [r1]
        add     r2, r0, r0, lsl #2
        ldr     r0, .LCPI3_1
.LPC3_1:
        add     r0, pc, r0
        add     r3, r0, r2
        mov     r2, #0
        strb    r2, [r3, #2]
        ldrb    r1, [r1]
        add     r1, r1, r1, lsl #2
        add     r1, r0, r1
        mov     r0, #100
        strb    r0, [r1, #3]
        bx      lr
.LCPI3_0:
        .long   gIndex-(.LPC3_0+8)
.LCPI3_1:
        .long   gConfig-(.LPC3_1+8)
main:
        push    {r11, lr}
        mov     r11, sp
        sub     sp, sp, #8
        mov     r0, #0
        str     r0, [sp]                        @ 4-byte Spill
        str     r0, [sp, #4]
        ldr     r0, .LCPI4_0
.LPC4_0:
        add     r0, pc, r0
        ldrb    r0, [r0]
        add     r1, r0, r0, lsl #2
        ldr     r0, .LCPI4_1
.LPC4_1:
        add     r0, pc, r0
        add     r1, r0, r1
        ldr     r2, .LCPI4_2
.LPC4_2:
        add     r2, pc, r2
        str     r1, [r2]
        bl      func1
        bl      func2
        bl      func3
        ldr     r0, [sp]                        @ 4-byte Reload
        mov     sp, r11
        pop     {r11, lr}
        bx      lr
.LCPI4_0:
        .long   gIndex-(.LPC4_0+8)
.LCPI4_1:
        .long   gConfig-(.LPC4_1+8)
.LCPI4_2:
        .long   pConfig-(.LPC4_2+8)
gConfig:
        .zero   10

gIndex:
        .byte   0                               @ 0x0

pConfig:
        .long   0

Conclusion : using function 1 method is more saving code size.

 

 

func1:         sub     sp, sp, #4         str     r0, [sp]         ldr     r1, [sp]         mov     r0, #0         strb    r0, [r1]         ldr     r1, [sp]         mov     r0, #100         strb    r0, [r1, #1]         add     sp, sp, #4         bx      lr func2:         ldr     r1, .LCPI1_0 .LPC1_0:         add     r1, pc, r1         ldrb    r0, [r1]         add     r3, r0, r0, lsl #2         ldr     r0, .LCPI1_1 .LPC1_1:         add     r0, pc, r0         mov     r2, #0         strb    r2, [r0, r3]         ldrb    r1, [r1]         add     r1, r1, r1, lsl #2         add     r1, r0, r1         mov     r0, #100         strb    r0, [r1, #1]         bx      lr .LCPI1_0:         .long   gIndex-(.LPC1_0+8) .LCPI1_1:         .long   gConfig-(.LPC1_1+8) func3:         ldr     r1, .LCPI2_0 .LPC2_0:         ldr     r1, [pc, r1]         mov     r0, #0         strb    r0, [r1]         ldr     r1, .LCPI2_1 .LPC2_1:         ldr     r1, [pc, r1]         mov     r0, #100         strb    r0, [r1, #1]         bx      lr .LCPI2_0:         .long   pConfig-(.LPC2_0+8) .LCPI2_1:         .long   pConfig-(.LPC2_1+8) func4:         ldr     r1, .LCPI3_0 .LPC3_0:         add     r1, pc, r1         ldrb    r0, [r1]         add     r2, r0, r0, lsl #2         ldr     r0, .LCPI3_1 .LPC3_1:         add     r0, pc, r0         add     r3, r0, r2         mov     r2, #0         strb    r2, [r3, #2]         ldrb    r1, [r1]         add     r1, r1, r1, lsl #2         add     r1, r0, r1         mov     r0, #100         strb    r0, [r1, #3]         bx      lr .LCPI3_0:         .long   gIndex-(.LPC3_0+8) .LCPI3_1:         .long   gConfig-(.LPC3_1+8) main:         push    {r11, lr}         mov     r11, sp         sub     sp, sp, #8         mov     r0, #0         str     r0, [sp]                        @ 4-byte Spill         str     r0, [sp, #4]         ldr     r0, .LCPI4_0 .LPC4_0:         add     r0, pc, r0         ldrb    r0, [r0]         add     r1, r0, r0, lsl #2         ldr     r0, .LCPI4_1 .LPC4_1:         add     r0, pc, r0         add     r1, r0, r1         ldr     r2, .LCPI4_2 .LPC4_2:         add     r2, pc, r2         str     r1, [r2]         bl      func1         bl      func2         bl      func3         ldr     r0, [sp]                        @ 4-byte Reload         mov     sp, r11         pop     {r11, lr}         bx      lr .LCPI4_0:         .long   gIndex-(.LPC4_0+8) .LCPI4_1:         .long   gConfig-(.LPC4_1+8) .LCPI4_2:         .long   pConfig-(.LPC4_2+8) gConfig:         .zero   10
gIndex:         .byte   0                               @ 0x0
pConfig:         .long   0

标签:comparison,r0,r1,sp,mov,Compile,ldr,add,result
From: https://www.cnblogs.com/zjbfvfv/p/17520603.html

相关文章

  • python 报错AttributeError: '_TestResult' object has no attribute 'outputBuffer'
    报错信息: 原因:使用setupclass必须加@classmethod装饰器 解决方案:在setupclass和teardownclass方法前面加@classmethod ......
  • WPF Showdialog与DialogResult的注意事项
    我们知道如果要设置window.Showdialog()的返回值,需要设置window.DialogResult属性。但是设置window.DialogResult属性会自动触发close,如果window.DialogResult属性会触发Window_OnClosing事件privatevoidBtnCancel_Click(objectsender,RoutedEventArgse){......
  • Java获取数据库的列名、列数、标题、类型等信息, ResultSetMetaData
    importjava.sql.*;publicclassjdbcTest{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{//1、加载驱动Class.forName("com.mysql.jdbc.Driver");//2、用户信息和urlStringurl="......
  • Operation not allowed after ResultSet closed问题的解决
    问题描述使用JDBC连接数据库时,出现这个错误,我还能看出来,应该是我使用完Statement、ResultSet等之后,关闭close方法的顺序错误问题解决查阅资料发现,是一个stmt同时对应了多个rs对象,然后用完一个就关闭它,导致第二个rs不能正常使用,所以可以这么解决:要么,再为第二个rs重新定义一个st......
  • day 113- mybatis的查询resultMap
    mybatis中的resultMapresultMap用来处理字段名和属性名不一致的情况,处理映射关系若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射<!--字段名和属性名不一致的情况,处理映射关系:1.为查询的字段设置别名,和属性名保持一致2.当字段符合MySQL......
  • Maven构建项目后项目报Error错误Java compiler level does not match the version of
     Maven构建项目后项目报Error错误JavacompilerleveldoesnotmatchtheversionoftheinstalledJavaprojectfac 项目->右键->Properties->ProjectFacets->修改facets中Java版本(下拉箭头出)为要用的版本Maven构建项目需注意1.项目右键->Properties->buildpath->jdk2.项......
  • Error:java: Compilation failed: internal java compiler error 的解决过程
    1.错误描述:IDEA导入一个新的项目,运行时包编译失败在这里插入图片描述2.错误原因这个错误的原因是因为JDK版本问题,有两个原因,一个是编译器版本不匹配,一个是当前项目JDK版本不支持3.解决步骤需要调整三个位置的jdk版本调整项目的jdk版本,File-->ProjectStructure-->P......
  • Error:java: Compilation failed: internal java compiler error 的解决过程
    感谢原作者:https://blog.csdn.net/weixin_42045639/article/details/1255381611.错误描述:IDEA导入一个新的项目,运行时包编译失败2.错误原因这个错误的原因是因为JDK版本问题,有两个原因,一个是编译器版本不匹配,一个是当前项目JDK版本不支持3.解决步骤需要调整三个......
  • Proj. CAR Paper Reading: Dire: A neural approach to decompiled identifier naming
    Abstract本文:工具:DIRE(DecompiledIdentifierRenamingEngine)任务:variablenamerecovery方法:使用词法和结构信息计算概率提出数据集:164632uniquex86-64binariesCprojsongithub实验效果:74.3%相符......
  • .NET Compiler Platform SDK
    .NETCompilerPlatformSDK.NETCompilerPlatform是什么?通过学习该模型可以更快的了解Roslyn,或者说更快的了解c#编译器的相关知识。编译器管道编译器管道是什么如上图所示,编译器管在每个阶段会进行不同的操作,这些操作我们可以理解为一个独立的组件或者模块,是一个黑盒结构......