免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 616 | 回复: 0
打印 上一主题 下一主题

ARM/C混合编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览

//C语言内嵌汇编

#include <stdio.h>

#include <stdlib.h>

 

void enable(void)

{

    __asm

    {

        MRS v1, CPSR       

        BIC v1, v1, 0x40 

        MSR CPSR_c, v1

    }

}

 

void disable(void)

{

    int temp;

    __asm

    {      

        MRS temp, CPSR

        orr temp, temp, 0X40

        msr CPSR_c, temp

    }

}

int main(void)

{

    enable();

    disable();

 

    return 0;

}

 

 

//C语言调用汇编文件

//少于等于4个参数传递

#include <stdio.h>

#include <stdlib.h>

 

extern add4(int n1, int n2,int n3, int n4);

 

int main(void)

{

    int temp;

   

    temp = add4(1,2,3,4);

   

    return 0;

}

 

;

;   汇编文件程序

;

 

    export add4

   

    AREA fun, CODE

   

add4

    add a1, a1, a2

    add a1, a1, a3

    add a1, a1, a4

    mov pc, lr

   

    END

 

 

 

 

//C语言调用汇编文件

//多于4个参数传递

 

#include <stdio.h>

#include <stdlib.h>

 

extern add4(int n1, int n2,int n3, int n4, int n5);

 

int main(void)

{

    int temp;

   

    temp = add4(1,2,3,4,5);

   

    return 0;

}

 

 

;

;   汇编程序

;

 

    export add4

   

    AREA fun, CODE

   

add4

    add a1, a1, a2

    add a1, a1, a3

    add a1, a1, a4

    ldmfd sp, {v1}            ; 只取出第五个参数,不要弹出,编译器会自动帮你弹出

    add a1, a1, v1

    mov pc, lr             ; 函数返回

   

    END

 

 

 

 

;

;   在汇编程序中调用C语言程序

;   参数传递

 

    IMPORT add5

   

    AREA sccdata, DATA

stack space 256

 

    AREA scccode, CODE

    ENTRY

START

    ldr sp, =stack+256

   

    mov a1, #0

    mov a2, #1

    mov a3, #3

    mov a4, #4

    mov v1, #5

   

    stmfd sp!, {v1}               ; 压栈

    bl add5

    ldmfd sp!, {v1}               ; 弹栈

   

stop

    mov r0, #0x18

    ldr r1, =0X20026

    swi 0x123456

 

    END

 

   

//C语言调用汇编文件

//多于4个参数传递

 

int add5(int n1, int n2,int n3, int n4, int n5)

{

    return n1+n2+n3+n4+n5;

}

 

 

 

;

;   在汇编程序中调用C语言程序

;   19!观察结果返回情况

;

 

    IMPORT add5

   

    AREA scccode, CODE

    ENTRY

   

START 

    mov a1, #19

    bl add5

   

stop

    mov r0, #0x18

    ldr r1, =0X20026

    swi 0x123456

 

    END

 

//C语言调用汇编文件

 

long long add5(int n)

{

    long long  ret = 1;

   

    while(n != 0)

    {

        ret *= n;

        n--;

    }

    return ret;

}

 

 

//GNU ARM 汇编程序

//C语言调用汇编实现字符串对换

 

#include <stdio.h>

#include <stdlib.h>

 

extern void strswp(char *str1, char *str2);

 

int main(void)

{

    char str1[10] = "123456789";

    char str2[10] = "abcde";

   

    strswp(str1, str2);      //调汇编函数

 

    printf("buf1 = %s\nbuf2 = %s\n",str1, str2);

    return 0;

}

 

 

    .text

    .global strswp

strswp:

    @取出字节

    ldrb v1, [a1]

    ldrb v2, [a2]

   

    @结束判断

    cmp v1, #0

    cmpne v2, #0

    beq quit

   

    @数据对换

    strb v1, [a2], #1

    strb v2, [a1], #1

    b strswp

 

quit: 

    mov pc, lr

    .end

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP