久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: C程序和匯編程序相互調用 [打印本頁]

作者: 51黑tt    時間: 2016-3-6 13:06
標題: C程序和匯編程序相互調用

     為了使單獨編譯的C語言程序和匯編程序之間能夠相互調用,必須為子程序間的調用規定一定的規則。ATPCS(ARM/Thumb Procedure Call Standard) ,是ARM程序和Thumb程序中子程序調用的基本規則,它規定了一些子程序間調用的基本規則,如想了解更多的規則,可以查看上一篇中關于ATPCS的介紹。

     高級語言函數與匯編語言函數的混合調用也要遵循ATPCS規則,保證程序調用時參數的正確傳遞。

    當在C語言程序中調用匯編程序時,在匯編程序中使用EXPORT偽指令聲明本子程序,使其它程序可以調用此子程序;而在C語言程序中使用extern關鍵字聲明外部函數(聲明要調用的匯編子程序),即可調用此匯編子程序。

    當在匯編程序中調用C語言程序時,在C程序中不需要使用任何關鍵字來聲明將被匯編語言調用的C程序,但是在匯編程序調用該C程序之前需要在匯編語言程序中使用IMPORT偽操作來聲明該C程序。在匯編程序中通過BL指令來調用子程序。

下面給出兩個例子來介紹函數相互調用。

// C程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


//定義LED端口寄存器
#define rGPFCON (*(volatile unsigned *)0x56000050) //Port F control
#define rGPFDAT (*(volatile unsigned *)0x56000054) //Port F data
#define rGPFUP (*(volatile unsigned *)0x56000058) //Pull-up control F

extern void delay(int times);                          //聲明要調用的匯編子程序
extern void strcpydiy(char *dest, const char *src);    //聲明要調用的匯編子程序
extern int callsum(void );                             //聲明要調用的匯編子程序


int sumdiy(int a, int b, int c, int d, int e)
{
    return(a+b+c+d+e);
}

void xmain(void)
{

    int temp;

    const char *strsrc = "First string source";
    char strdest[] = "Scend string source";
    printf("Before copying ...:\n");
    printf("%s...%s...\n",strdest,strsrc);
     strcpydiy(strdest, strsrc);
    printf("After copying ...\n");
    printf("%s...%s...\n",strdest,strsrc);

     temp = callsum();
#if 0
    if (temp == 15)
    {
            printf("the sum is :%d\n",temp);

             rGPFCON=(rGPFCON|0xFF00)&0x55FF; //GPF4--GPF7設置為output

              rGPFUP|=0xF0; //disable GPF pull up

              rGPFDAT=(rGPFDAT&0x0F)|0x70;//GPF7 output 0

             while(1);     
    }
#endif

#if 0   
    if(strcmp(strdest,strsrc) == 0)
    {
               rGPFCON=(rGPFCON|0xFF00)&0x55FF;//GPF4--GPF7設置為output
                rGPFUP|=0xF0;                  //disable GPF pull up
                rGPFDAT=(rGPFDAT&0x0F)|0x70;   //GPF7 output 0

               while(1);
    }
#endif
   ...

}

;匯編指令延時程序   
     EXPORT delay                 ;聲明本子程序,別的程序可以調用
     EXPORT strcpydiy             ;聲明本子程序,別的程序可以調用
     EXPORT callsum               ;聲明本子程序,別的程序可以調用
     IMPORT sumdiy               ;聲明本程序可以使用C程序中的sumdiy本程序

     AREA DELAY,CODE,READONLY     ;該偽指令定義了一個代碼段,段名為Delay,屬性只讀
;下面是延遲子程序
delay
    sub r0,r0,#1 ;r0=r0-1 r0是入口參數
    cmp r0,#0x0 ;將r0的值與0相比較
    bne delay   ;比較的結果不為0(r0不為0),繼續調用delay,否則執行下一條語句
    mov pc,lr    ;返回

strcpydiy
    ;r0為目標字符串地址
    ;r1為源字符串地址
     ldrb r2,[r1],#1
     strb r2,[r0],#1
    cmp r2,#0
     bne strcpydiy
    mov pc,lr

callsum
     stmfd sp!,{lr}   ;返回地址壓棧
    mov r0,#0        ;清零,對應sumdiy中的a
    mov r1,#0        ;對應sumdiy中的b
    mov r2,#0        ;對應sumdiy中的c
    mov r3,#0        ;對應sumdiy中的d
    mov r4,#0        ;對應sumdiy中的e

    add r0,r0,#1    ;附初值
    add r1,r1,#2
    add r2,r2,#3
    add r3,r3,#4
    add r4,r4,#5

    str r4,[sp,#-4]! ;r4需要用數據棧來傳送
    bl sumdiy        ;調用C函數
    add sp,sp,#4     ;到這里,r0存儲了sumdiy的返回值為15
     ldmfd sp!,{pc}

     END ;程序結束符






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产羞羞视频在线观看 | 国产精品成人在线播放 | 欧美日韩综合视频 | 97色综合 | 美女黄色在线观看 | 久久久久久中文字幕 | 国产亚洲欧美另类一区二区三区 | 欧美99久久精品乱码影视 | 99久久婷婷国产综合精品电影 | 精品日本中文字幕 | 91欧美精品 | 91精品久久久久久久久久 | 亚洲精品视频免费 | 国产精品国产三级国产aⅴ中文 | 99精品免费在线观看 | 亚洲福利一区二区 | 天天艹日日干 | 亚洲乱码国产乱码精品精的特点 | 欧美日韩网站 | 国产一级免费视频 | 日韩中文不卡 | 免费国产一区 | 91精品国产综合久久久久久丝袜 | 欧美黄色性生活视频 | 国产 日韩 欧美 在线 | 亚洲91av| 亚洲精品66 | 无码日韩精品一区二区免费 | 国产高清不卡 | 自拍偷拍亚洲欧美 | 欧美一区二区另类 | 国产激情免费视频 | www.一级毛片| 一区二区精品在线 | 欧美一级精品片在线看 | 国产激情视频 | 国产午夜精品一区二区三区四区 | 国产无人区一区二区三区 | 日韩精品久久久久久 | 久久久区 | 在线观看国产www |