久久久久久久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
|