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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2153|回復: 0
打印 上一主題 下一主題
收起左側

C程序和匯編程序相互調用

[復制鏈接]
跳轉到指定樓層
樓主
ID:107189 發表于 2016-3-6 13:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

     為了使單獨編譯的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 ;程序結束符

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区欧美 | 可以免费看av的网站 | 天天躁日日躁狠狠躁av麻豆男男 | 日韩一区二区中文字幕 | 亚洲第一色网 | 激情婷婷网 | 免费一级黄色 | 天天爽夜夜操 | 中文字幕婷婷 | 日韩免费在线播放 | 亚洲精品一二 | 日本黄色免费网站 | 少妇一级淫免费观看 | 日韩视频免费观看 | 欧美日韩一二三 | 久久久精品国产sm调教网站 | 超碰中文字幕 | 亚洲国产精品网站 | 欧美日韩专区 | 视频一二区 | 韩日欧美| 男女免费视频 | 国产成人在线免费观看 | 深夜福利网 | 亚洲久久在线 | 亚洲精品综合 | 黄色大片免费观看 | 黄色一级大片在线免费看国产一 | 久久福利网 | 4438成人网 | 一区二区三区在线免费 | 亚洲午夜在线观看 | www操| 国产黄色免费网站 | 欧美一级欧美三级 | 中文字幕第三页 | 在线亚洲一区 | 黄色一级片网站 | 国产精品久久久久久无人区 | 国产又粗又猛视频免费 | 国产精品一区二区三 |