• C语言调用汇编


    程序的入口是main,在main里调用汇编的函数。

    首先要解决怎么定义函数的问题

    在C语言中,要extern 一个函数声明即可,然后这个函数在汇编里面实现。

    在汇编里面,用EXPORT 把C语言定义的函数名引进来,再开始编写函数名开始的段

    例子是一个六个数相加的函数。

    C语言:

    #include<stdio.h>
    
    extern int sum(int a,int b,int c,int d,int e,int f);
    
    int main(){
        
        
        int result = sum(1,2,3,4,5,6);
        
        return 0;
        
    
    }

    汇编代码:

            AREA    EXAMPLE,CODE,READONLY
            EXPORT    sum
            ENTRY
            
    sum
            ADD R0,R0,R1
            ADD R2,R2,R3
            ADD R0,R0,R2
            
            LDR    R4,[SP]
            LDR R5,[SP,#4]
            
            ADD R4,R4,R5
            ADD R0,R4,R0
            
            BX LR
            
            END

    其实关键的问题是参数和返回值。

    我们能看到,C里面调用这个函数,C给里面传参数。

    汇编是怎么接受这些参数的呢?

    4个以内的参数,直接存放在R0~R3 这4个寄存器里面。

    4个以后的参数放在堆栈里。

    如果函数有返回值,那么返回值放在R0里。

    Debug看看编译器是怎么处理的,我们就怎样把参数取出来。

    还是比较易懂

    首先是

    R0 =6

    R1=5

    R2=3

    R3=4

    然后把R1的值放在堆栈里,R13=5,然后R1=2

    然后吧R0的值放在堆栈的下一个位置,R13+4=6,然后R0=1.

    之后就是:

    R0=1,R1=2,R2=3,R3=4

    堆栈里面:

    所以取参数的时候就是:

    LDR    R4,[SP];R4=5
    LDR R5,[SP,#4];R5=6

    把相加的结果放在R0,然后BX LR返回

    可以看到:

    可以验证的确R0是存放返回值的。

  • 相关阅读:
    线程安全和非线程安全
    spring MVC和hibernate的结合
    Spring学习笔记1——基础知识 (转)
    bitset && Luogu 3674 小清新人渣的本愿
    luogu P3452 [POI2007]BIU-Offices
    每日刷题记录
    Codeforces Round #721 (Div. 2) B2. Palindrome Game (hard version)
    2019湘潭邀请赛A
    2021CCPC浙江省赛 B
    Codeforces Round #720 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/wzben/p/5441970.html
Copyright © 2020-2023  润新知