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