函數(shù)原型估計(jì)看不到,應(yīng)該是封裝在一個(gè)標(biāo)準(zhǔn)lib庫(kù)里面了,一般是C庫(kù)。
平順網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
在基于ARM的嵌入式系統(tǒng)開(kāi)發(fā)中,常常用到交叉編譯的GCC工具鏈有兩種:
arm-linux-*和 arm-elf-*,兩者區(qū)別主要在于使用不同的C庫(kù)文件。arm-linux-*使用
GNU的Glibc,而arm-elf-*一般使用 uClibc/uC-libc或者使用REDHAT專(zhuān)門(mén)為嵌入式系統(tǒng)
的開(kāi)發(fā)的C庫(kù)newlib.Glibc。uClibc/uC-libc以及 newlib都是C語(yǔ)言庫(kù)文件,只是所應(yīng)
用的領(lǐng)域不同而已,Glibc是針對(duì)PC開(kāi)發(fā)的,uClibc/uC-libc是與Glibc API兼容的小型
化C語(yǔ)言庫(kù),實(shí)現(xiàn)了Glibc部分功能。
關(guān)于uClibc/uC-libc的說(shuō)明,詳見(jiàn)如下:
There are two libc libraries commonly used with uClinux. uC-libc and
uClibc. They are quite different despite their similar names. Here is a
quick overview of how they are different.
uC-libc is the original library for uClinux. It was based on sources
from the Linux-8086 C library which was part of the ELKs project with m68000
support added by Jeff Dionne and Kenneth Albanowski. It is a fairly complete
libc implementation, however, some of the API's are a little non-standard
and quite a few common libc routines are not present. Currently it has
stable support for m68000, ColdFire and ARM (Non-MMU) architectures. It was
primary design goal is to be small and light weight. It does try to conform
to any standards, although its API tries to be compatible with most libcs,
it is not always exactly the same.
The uClinux distribution provides an environment that can compile using
either uC-libc or uClibc depending on your needs. For m68000 and Coldfire
platforms it is generally better to chose uC-libc as it supports shared
libraries and is the most commonly used libc for these CPUs. uClibc also
works quite well with almost all platforms supported by the distribution.
Which libc you choose to use will be decided by your requirements
uClinux有兩個(gè)經(jīng)常使用的libc庫(kù):uC-libc和uClibc。雖然兩者名字很相似,其實(shí)有差
別,下面就簡(jiǎn)單的介紹一下二者的不同之處。uC -libc是最早為uClinux開(kāi)發(fā)的庫(kù),是
Jeff Dionne和Kenneth Albanowski為在EKLs項(xiàng)目中支持m68000在Linux-8086 C庫(kù)源碼
上移植的。uC-libc是一個(gè)完全的libc實(shí)現(xiàn),但其中有一些api是非標(biāo)準(zhǔn)的,有些libc的
標(biāo)準(zhǔn)也沒(méi)有實(shí)現(xiàn)。uC-libc穩(wěn)定地支持 m68000,ColdFire和沒(méi)有MMU的ARM。其主要設(shè)計(jì)
目標(biāo)是“小”、"輕",并盡量與標(biāo)準(zhǔn)一致,雖然它的API和很多l(xiāng)ibc兼容,但是似乎并
不像它期望的那樣和所有標(biāo)準(zhǔn)一致。
uClibc就是為了解決這個(gè)問(wèn)題從uC-libc中發(fā)展出來(lái)的。它的所有API都是標(biāo)準(zhǔn)的(正確
的返回類(lèi)型,參數(shù)等等),它彌補(bǔ)了uC-libc中沒(méi)有實(shí)現(xiàn)的libc標(biāo)準(zhǔn),現(xiàn)在已經(jīng)被移植到
多種架構(gòu)中。一般來(lái)講,它盡量兼容glibc以便使應(yīng)用程序用uClibc改寫(xiě)變的容易。
uClibc能夠在標(biāo)準(zhǔn)的 VM linux和uClinux上面使用。為了應(yīng)用程序的簡(jiǎn)潔,它甚至可以
在許多支持MMU的平臺(tái)上被編譯成共享庫(kù)。Erik Anderson在uClibc背后做了很多的工
作。uClibc支持許多系列的處理器:m68000,Coldfire,ARM,MIPS,v850, x86,
i960,Sparc,SuperH,Alpha,PowerPC和Hitachi 8。不斷增加的平臺(tái)支持顯示uClibc
能夠很容易的適應(yīng)新的架構(gòu)。uClinux發(fā)行版提供了環(huán)境能夠讓你選擇使用uC-libc或是
uClibc編譯。對(duì)于m68000和Coldfire平臺(tái)來(lái)說(shuō),選擇uC-libc還是稍微好一點(diǎn),因?yàn)樗?/p>
支持共享庫(kù),而共享庫(kù)是這些cpu經(jīng)常使用的 libc.uClibc也幾乎和所有的平臺(tái)都能很
好的工作。選擇哪種libc取決于你的需求。
newlib 是一個(gè)用于嵌入式系統(tǒng)的開(kāi)放源代碼的C語(yǔ)言程序庫(kù),由libc和libm兩個(gè)庫(kù)組
成,特點(diǎn)是輕量級(jí),速度快,可移植到很多CPU結(jié)構(gòu)上。newlib實(shí)現(xiàn)了許多復(fù)雜的功
能,包括字符串支持,浮點(diǎn)運(yùn)算,內(nèi)存分配(如malloc)和I/O流函數(shù)(printf,fprinf()
等等)。其中l(wèi)ibc提供了c 語(yǔ)言庫(kù)的實(shí)現(xiàn),而libm提供了浮點(diǎn)運(yùn)算支持。
在為ARM交叉編譯gcc編譯器時(shí),對(duì)gcc指定不同的配置選項(xiàng)時(shí),使用的C語(yǔ)言庫(kù)就不同,
gcc編譯器默認(rèn)使用Glibc,也可以使用 uClibc/uC-libc(基本兼容Glibc API),當(dāng)使用
--with-newlib時(shí),gcc編譯器不使用Glibc。當(dāng)沒(méi)有交叉編譯Glibc時(shí),可以使用
--with-newlib禁止連接Glibc而編譯bootstrap gcc編譯器。從gcc源目錄下的
config/arm中的t-linux和t-arm-elf中可以看出,不同的--target也影響gcc連接C語(yǔ)言
庫(kù),t-linux(--target=arm-linux)默認(rèn)使用Glibc,-arm-elf(--target=arm-elf)使用
- Dinhibit_libc禁止連接Glibc,這時(shí)我們就可以使用newlib等其他C語(yǔ)言庫(kù)編譯GCC工
具鏈。
雖然GCC工具鏈配置了不同的的C語(yǔ)言庫(kù),但由于這些C語(yǔ)言庫(kù)都可以用來(lái)支持GCC,它們
對(duì)核心數(shù)據(jù)的處理上不存在較大出入。因而arm-linux-* 和 arm-elf-*區(qū)別主要表現(xiàn)在
C語(yǔ)言庫(kù)的實(shí)現(xiàn)上,例如不同系統(tǒng)調(diào)用,不同的函數(shù)集實(shí)現(xiàn),不同的ABI\啟動(dòng)代碼以及
不同系統(tǒng)特性等微小的差別。
arm-linux-*和 arm-elf-*的使用沒(méi)有一個(gè)絕對(duì)的標(biāo)準(zhǔn),排除不同庫(kù)實(shí)現(xiàn)的差異,gcc可
以編譯任何系統(tǒng)。arm-linux-*和 arm-elf-*都可以用來(lái)編譯裸機(jī)程序和操作系統(tǒng),只
是在遵循下面的描述時(shí)系統(tǒng)程序顯得更加協(xié)調(diào):
arm-linux-*針對(duì)運(yùn)行l(wèi)inux的ARM機(jī)器,其依賴(lài)于指定的C語(yǔ)言庫(kù)Glibc,因?yàn)橥瑯邮褂?/p>
Glibc的linux而使得arm-linux-*在運(yùn)行l(wèi)inux的ARM機(jī)器上編譯顯得更加和諧。
arm-elf-*則是一個(gè)獨(dú)立的編譯體系,不依賴(lài)于指定的C語(yǔ)言庫(kù)Glibc,可以使用newlib
等其他C語(yǔ)言庫(kù),不要求操作系統(tǒng)支持,當(dāng)其使用為嵌入式系統(tǒng)而設(shè)計(jì)的一些輕巧的C語(yǔ)
言庫(kù)時(shí)編譯裸機(jī)程序(沒(méi)有l(wèi)inux等大型操作系統(tǒng)的程序),如監(jiān)控程序,bootloader等
能使得系統(tǒng)程序更加小巧快捷。
頭文件:#include string.h
定義函數(shù):int memcmp (const void *s1, const void *s2, size_t n);
函數(shù)說(shuō)明:memcmp()用來(lái)比較s1 和s2 所指的內(nèi)存區(qū)間前n 個(gè)字符。
字符串大小的比較是以ASCII 碼表上的順序來(lái)決定,次順序亦為字符的值。memcmp()首先將s1 第一個(gè)字符值減去s2 第一個(gè)字符的值,若差為0 則再繼續(xù)比較下個(gè)字符,若差值不為0 則將差值返回。例如,字符串"Ac"和"ba"比較則會(huì)返回字符'A'(65)和'b'(98)的差值(-33)。
返回值:若參數(shù)s1 和s2 所指的內(nèi)存內(nèi)容都完全相同則返回0 值。s1 若大于s2 則返回大于0 的值。s1 若小于s2 則返回小于0 的值。
范例#include string.hmain(){ char *a = "aBcDeF"; char *b = "AbCdEf"; char *c = "aacdef"; char *d = "aBcDeF"; printf("memcmp(a, b):%d\n", memcmp((void*)a, (void*)b, 6)); printf("memcmp(a, c):%d\n", memcmp((void*)a, (void*)c, 6)); printf("memcmp(a, d):%d\n", memcmp((void*)a, (void*)d, 6));}
執(zhí)行結(jié)果:
memcmp(a, b):1 //字符串a(chǎn)字符串b, 返回1
memcmp(a, c):-1 // 字符串a(chǎn)字符串c, 返回-1
memcmp(a, d):0 //字符串a(chǎn)=字符串d, 返回0
首先你得搞清楚s32 function(u32 VirtualAddr)編譯后叫什么。一般來(lái)說(shuō)可能會(huì)叫_function。
傳遞參數(shù)很簡(jiǎn)單,如果ax里放的就是參數(shù),那么push ax,然后再調(diào)用就可以。
返回值如果我沒(méi)有記錯(cuò)的話應(yīng)該在AX里。如果返回值太長(zhǎng),就會(huì)放到堆棧里。
你想搞清楚如果跨語(yǔ)言編程,最好徹底明白C語(yǔ)言的機(jī)制。也就是寫(xiě)一段函數(shù)調(diào)用程序比如下面的
main()
{ int i;}
fu(int i)
{in j}
然后編譯成匯編語(yǔ)言,好好研究一下?;蛘咴?gòu)?fù)雜一點(diǎn)。請(qǐng)參考。
有什么問(wèn)題再向我提問(wèn)