久久久久久久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://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 免费理论片 | 波多野结衣之双调教hd | 91麻豆产精品久久久久久夏晴子 | 国产福利网站 | 日韩欧美中文在线 | 四川一级毛毛片 | 国产中文字幕一区 | 久热在线 | 日韩一级黄| 丁香婷婷在线 | 国产福利精品视频 | 国产网站免费 | av片在线免费观看 | 在线观看91 | 超碰在线视屏 | 亚洲三级在线 | 欧美视频a | 日韩视频在线观看 | 日韩精品在线观看视频 | 国产激情久久久 | 日韩女优在线 | 国产精品一二三四区 | 国产成人三级一区二区在线观看一 | 玖玖久久 | 蜜桃精品一区二区三区 | 欧美亚洲国产日韩 | 亚洲欧美中文字幕 | 亚洲激情另类 | 国产在线视频一区 | 狠狠干天天操 | 天天爱综合 | 中文有码在线 | 欧美亚洲激情 | 天天做夜夜爽 | 国产一区二区不卡 | 亚洲视频网址 | 五月天一区二区 | 一区在线观看 | 伊人综合影院 | 九九热在线精品 | 国产精品久久久久久妇女6080 |