1、 參數(shù)傳遞
成都創(chuàng)新互聯(lián)專注于麗江網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供麗江營銷型網(wǎng)站建設(shè),麗江網(wǎng)站制作、麗江網(wǎng)頁設(shè)計(jì)、麗江網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造麗江網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供麗江網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
二、匯編程序、C程序相互調(diào)用舉例
1、 C程序調(diào)用匯編程序
匯編程序的設(shè)計(jì)要遵守ATPCS(ARM—Thumb Procedure Call Standard),保證程序調(diào)用時(shí)參數(shù)的正確傳遞。在匯編程序中使用EXPORT 偽操作聲明本程序,使得本程序可以被別的程序調(diào)用。在C程序使用extern聲明該匯編程序。
下面是一個(gè)C程序調(diào)用匯編程序的例子。其中匯編程序strcopy實(shí)現(xiàn)字符串復(fù)制功能,C程序調(diào)用strcopy完成字符串復(fù)制的工作。
把匯編寫在另一個(gè)文件里 在main寫個(gè)原型聲明 再把兩個(gè)文件同時(shí)編譯可不可以。
我的gcc編譯器里是這樣寫的
匯編文件m.s
.file "stdio.h"
#hellowrold.s print "hello,world!"
.section .data
output:
.ascii "%d %d %d\0"
.section .text
.globl _fun
_fun:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 0x8(%ebp), %eax
movl %eax, 0x4(%esp)
movl 0xc(%ebp), %eax
movl %eax, 0x8(%esp)
movl 0x10(%ebp), %eax
movl %eax, 0xc(%esp)
movl $output, %eax
movl %eax, (%esp)
call _printf
movl %ebp, %esp
popl %ebp
ret
.end
主函數(shù)前的原型聲明 extern int fun(int i, int j, int k);
在調(diào)試聯(lián)盛德W800芯片代碼時(shí),看到了下面的代碼實(shí)現(xiàn),記錄下C語言內(nèi)嵌匯編語言的實(shí)現(xiàn)方式。部分代碼如下:
該函數(shù)實(shí)現(xiàn)功能:將入?yún)ewMask的值寫入到psr寄存器,用于恢復(fù)現(xiàn)場(chǎng)。
代碼下載路徑:
__asm__ (
匯編語句部分
:輸出部分
:輸入部分
:破壞描述部分
);
1)C內(nèi)嵌匯編以關(guān)鍵字 __asm__ 或 asm 開始。如果使用 volatile 關(guān)鍵字,則表示告訴編譯器不優(yōu)化后續(xù)的代碼。
2) 匯編語句部分:可以包含多條匯編語句,每條語句之間用“ ”或“;”,例:
注:匯編語句中的操作數(shù)可以使用占位符引用C語言變量,名稱如下:%0,%1,…。
2) 輸出部分:在匯編語言中被修改的C變量
3) 輸入部分:作為參數(shù)輸入到匯編語言中的C變量
注:輸出和輸入部分是針對(duì)匯編語句部分的輸入和輸出參數(shù)而言。例:如果匯編語言使用變量設(shè)置寄存器,則用輸入部分;如果匯編語言從寄存器讀取值,保存到變量,則用輸出部分。
4) 破壞描述部分:通知編譯器使用了哪些寄存器或內(nèi)存。
5) 每個(gè)部分之間用”:”隔開。匯編語句部分必不可少,其他部分可以省略。例: asm("nop") ,實(shí)現(xiàn)空操作。
1、如果匯編程序是可執(zhí)行文件,比如exe文件,則可以使用system函數(shù)直接調(diào)用。比如下面的代碼,用system()打開windows上的記事本程序。
#include
#include
int main()
{
system("notepad.exe");
return 0;
}2、在C語言源碼中,可以通過內(nèi)聯(lián)匯編來直接編寫匯編程序代碼。不同的編譯器使用內(nèi)聯(lián)匯編的方法不同,vc/vs編譯器中一般使用__asm關(guān)鍵字來使用內(nèi)聯(lián)匯編,gcc編譯器一般使用asm關(guān)鍵字來使用內(nèi)聯(lián)匯編,以vc6.0為例,下面的代碼通過使用內(nèi)聯(lián)匯編來計(jì)算1+1,并將結(jié)果保存到int型變量result中。
#include
int main()
{
int result;
_asm {
mov eax,1
mov ebx,1
add eax,ebx
mov result, eax
}
printf("1+1=%d\n", result);
return 0;
}