Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631561
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:13:01

原文地址:ARM/C混合编程 作者:luozhiyong131

//C语言内嵌汇编

#include

#include

 

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

#include

 

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

#include

 

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

#include

 

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

阅读(199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~