第2章3-ARM匯編程序設(shè)計(jì)課件_第1頁
第2章3-ARM匯編程序設(shè)計(jì)課件_第2頁
第2章3-ARM匯編程序設(shè)計(jì)課件_第3頁
第2章3-ARM匯編程序設(shè)計(jì)課件_第4頁
第2章3-ARM匯編程序設(shè)計(jì)課件_第5頁
已閱讀5頁,還剩58頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第二章_3ARM匯編程序設(shè)計(jì)在ARM嵌入式系統(tǒng)中,一般用C語言等高級語言對各個應(yīng)用接口模塊功能的實(shí)現(xiàn)進(jìn)行程序設(shè)計(jì),但在某些地方用匯編語言更方便、簡單。在一些關(guān)鍵部分,例如用來初始化電路以及用來為軟件(高級語言編寫)做運(yùn)行前準(zhǔn)備的啟動代碼必須用匯編語言編寫。匯編語言的代碼效率很高,一般用于對硬件的直接控制。編程步驟

1分析問題

2確定算法3確定數(shù)據(jù)分配的存儲單元

4畫程序流程圖

5編寫程序ARM源程序文件

文件類型擴(kuò)展名匯編語言源文件.sC語言源文件.cC++源文件.cpp引入文件.INC頭文件.h本章提要324匯編語言程序設(shè)計(jì)實(shí)例嵌入式C語言程序設(shè)計(jì)技巧匯編語言與C語言混合編程技術(shù)1GNU匯編語言源程序格式GNU匯編程序基本格式使用偽操作.equ定義了幾個變量并為其賦值。用偽操作.global聲明一個全局變量_strat,在下面就可以看出,_strat一般用于標(biāo)識程序代碼的開始,即程序的入口點(diǎn)。.text偽操作表示以下為代碼段,將被編譯到代碼段或者代碼子段。.end偽操作匯編編譯器源文件的結(jié)束。每一個匯編模塊必須包含一個.end偽操作,指示本模塊的結(jié)束。

二、ARM編譯環(huán)境下匯編語句.global_start.equx,30.equy,40.text_start:movsp,#0x00000800movr0,#xmovr1,#yaddr2,r0,r1strr2,[sp]stop:bstop.end GNU環(huán)境下匯編語句與編譯說明

GNU環(huán)境下ARM匯編語言程序設(shè)計(jì)主要是面對在ARM平臺上進(jìn)行嵌入式LINUX的開發(fā)。GNU標(biāo)準(zhǔn)中提供了支持ARM匯編語言的匯編器as(arm-elf-as)、交叉編譯器gccld(arm-elf-gcc)和鏈接器ld(arm-elf-ld)。GNU環(huán)境下ARM匯編語言語句格式如下:[標(biāo)簽:]指令/偽操作/偽指令操作數(shù)[@語句的注釋]GNU環(huán)境下ARM匯編程序編譯基本語法(1)預(yù)處理GNU匯編器as的內(nèi)部預(yù)處理包括:移除多余的間隔符代碼中的所有注釋,并將字符常量轉(zhuǎn)換為數(shù)字值。它不作宏處理和文件包含處理,但這些事情可以交由gcc編譯器去做,文件包含可以用.include偽指令來實(shí)現(xiàn)。(2)注釋GNUARMAssembly可識別的注釋方式有:C風(fēng)格多行注釋符/*...*/或GNU單行注釋符“@”或“#”。(3)符號與C語言基本一致,符號名由字母、數(shù)字以及'_'、和'.'組成,大小寫敏感。段與重定位鏈接器ld用于把多個目標(biāo)文件合并為一個可執(zhí)行文件。匯編器as生成的目標(biāo)文件都假定從地址0開始,ld為其指定最終的地址。鏈接器ld把目標(biāo)文件中的每個section都作為一個整體,為其分配運(yùn)行的地址符號說明(1)labellable后面要帶冒號‘:’

例如:_start:breset_handler。(2)給符號賦值三種方式:=.set.equ(3)符號名由數(shù)字、字母或“.”,“_”組成,不可以數(shù)字開頭,大小寫敏感。匯編器預(yù)定義的寄存器名稱本章提要324匯編語言程序設(shè)計(jì)實(shí)例嵌入式C語言程序設(shè)計(jì)技巧匯編語言與C語言混合編程技術(shù)1匯編語言源程序格式ARM匯編語言程序設(shè)計(jì)實(shí)例解析

數(shù)據(jù)塊復(fù)制

兩數(shù)中大者減小者直到零累加隊(duì)列中所有數(shù)利用跳轉(zhuǎn)表實(shí)現(xiàn)程序跳轉(zhuǎn)整數(shù)除法

例1先對內(nèi)存地址0x3000開始的100個字內(nèi)存單元填入0x10000001~0x10000064字?jǐn)?shù)據(jù),然后將每個字單元進(jìn)行64位累加結(jié)果保存于[R9:R8]。(R9中存放高32位)_start:

MOV R0,#0X3000 @初始化寄存器

MOV R1,#0X10000001 MOV R2,#100loop_1: @第一次循環(huán)賦值

STR R1,[R0],#4 ADD R1,R1,#1 SUBS R2,R2,#1 BNE loop_1

MOV R0,#0X3000 MOV R2,#100 MOV R9,#0 MOV R8,#0 loop_2: @第二次循環(huán)累加

LDR R1,[R0],#4 ADDS R8,R1,R8@R8=R8+R1,進(jìn)位影響標(biāo)志位

ADC R9,R9,#0@R9=R9+C,C為進(jìn)位

SUBS R2,R2,#1 BNE loop_2用ARM指令編寫程序,將兩數(shù)中的大數(shù)減小數(shù)直至減到結(jié)果為0為止。例2程序如下:.text_start:MOV r0,#9MOV r1,#15CMP r0,r1 ;r0-r1即兩數(shù)比較

SUBLT r1,r1,r0 ;r1>r0,則r1=r1–r0SUBGT r0,r0,r1 ;r0>r1,則r0=r0–r1BNE start ;r0≠r1,則轉(zhuǎn)start繼續(xù)stopB stopEND寫一段ARM匯編程序:循環(huán)累加隊(duì)列中的所有元素,直到碰上零值元素,結(jié)果放在r4。源程序末尾處聲明隊(duì)列:Myarray DCD0x11 DCD0x22 DCD0r0指向隊(duì)列頭:

ADRr0,myarray

使用命令LDRr1,[r0],#4來裝載,累加至r4之中,循環(huán)直到r1為0,用死循環(huán)來停止。例3源程序如下:AREAtotal,CODEENTRY MOV r4,#0 ;設(shè)置初始值

ADR r0,arrayloop LDR r1,[r0],#4 ;基址指針r0自動增加

ADD r4,r4,r1 CMP r1,#0

BNE loop ;r1為0時中斷循環(huán)stop

B stop ;死循環(huán)ArrayDCD 0x11 ;聲明隊(duì)列

DCD 0x22

DCD 0END利用跳轉(zhuǎn)表實(shí)現(xiàn)程序跳轉(zhuǎn)。在程序中常需要根據(jù)一定的參數(shù)選擇執(zhí)行不同的子程序。本例跳轉(zhuǎn)表中存放的是各子函數(shù)的地址,選擇不同的子程序的參數(shù)是該子程序在跳轉(zhuǎn)表中的偏移量。在本例中,R3寄存器中存放的是跳轉(zhuǎn)表的基地址,即存放子程序的入口地址的跳轉(zhuǎn)表的首地址。

R0寄存器的值用于選擇不同的子程序:當(dāng)R0為0時,選擇的是子程序DoAdd;當(dāng)R0為1時,選擇的是子程序DoSub。例4在ADS編譯環(huán)境下,程序如下:AREAJump,CODE,READONLY ;設(shè)置本段程序的名稱及屬性NUMEQU2 ;跳轉(zhuǎn)表中的子程序個數(shù)ENTRY ;程序執(zhí)行的入口點(diǎn)StartMOVR0,#0 ;設(shè)置參數(shù),R0中為需調(diào)用哪個子程序

MOVR1,#3 ;R1為子程序要用的參數(shù)

MOVR2,#2 ;R2為子程序要用的參數(shù)

BLFunc

;調(diào)用子程序Func,進(jìn)行算術(shù)運(yùn)算stopMOVR0,#0x18 ;軟中斷參數(shù)設(shè)置

LDRR1,=0x20026 ;軟中斷參數(shù)設(shè)置

SWI0x123456 ;將CPU的控制權(quán)交給調(diào)試器FuncCMPR0,#NUM ;判斷R0是否在有效范圍之內(nèi)

MOVHSPC,LR ;如果超出范圍則程序返回ADRR3,JTable

;讀取跳轉(zhuǎn)表的基地址

LDRPC,[R3,R0,LSL#2] ;根據(jù)R0的值跳轉(zhuǎn)到相應(yīng)的子程序JtableDCDDoAdd

;當(dāng)R0為0時上面的代碼將跳轉(zhuǎn)到DoAddDCDDoSub

;當(dāng)R0為1時上面的代碼將跳轉(zhuǎn)到DoSubDoAdd

ADDR0,R1,R2 ;子程序DoAdd執(zhí)行加法操作

MOVPC,LR ;子程序返回DoSub

SUBR0,R1,R2 ;子程序DoAdd執(zhí)行減法操作

MOVPC,LR ;子程序返回

END ;結(jié)束匯編例5實(shí)現(xiàn)整數(shù)除法,整數(shù)用補(bǔ)碼表示。先將被除數(shù)和除數(shù)高位對齊,如果夠減上商1,并減去除數(shù);否則上商0。然后右移除數(shù)1位,重復(fù)上述操作。.global_start .macromCLZRd,Rs @求一個數(shù)的前導(dǎo)0個數(shù)

MOV \Rd,#0 @在某些ARM中,可使用指令CLZ代替__mCLZ_L1: TST \Rs,#0x80000000 ADDEQ \Rd,\Rd,#1 MOVEQ \Rs,\Rs,ROR#31 @左移一位 BEQ __mCLZ_L1 MOV \Rs,\Rs,LSR\Rd.endm

.macro mUNSIGN Rd,Rs @將一個數(shù)無符號化

TST \Rs,#0x80000000 @將無符號的整數(shù)放到Rs中

EORNE \Rd,\Rd,#1 @將符號部分放到Rd中

MVNNE \Rs,\Rs ADDNE \Rs,\Rs,#1.endm.text_start: LDR R0,=-123456 @被除數(shù)

LDR R1,=523 @除數(shù)Div: MOV R6,#0 @結(jié)果的符號位

mUNSIGN R6,R0 @無符號化

mUNSIGN R6,R1 MOV R5,#0 @商

CMP R0,R1 @如果被除數(shù)小于除數(shù)

BLT Division_L2 @直接商0 mCLZ R3,R1 @判斷除數(shù)位數(shù),確定移位情況

SUB R3,R3,#1 MOV R1,R1,LSLR3Division_L1: MOV R5,R5,LSL#1 CMP R0,R1 @判斷是否夠減

SUBGT R0,R0,R1 @如果夠減,做減法,上商1 ORRGT R5,R5,#1 SUBS R3,R3,#1 MOVCS R1,R1,LSR#1 BCS Division_L1Division_L2: TST R6,#1 @處理結(jié)果的符號

MVNNE R5,R5 ADDNE R5,R5,#1Division_F: MOV R1,R0 MOV R0,R5例6用Thumb指令實(shí)現(xiàn)內(nèi)存數(shù)據(jù)區(qū)塊拷貝操作。.global _start.equ NUM, 18 @設(shè)置要復(fù)拷貝的字?jǐn)?shù).text_start: .arm MOV SP,#0x9000 ADR R0,Thumb_start+1 BX R0 .thumb Thumb_start: LDR R0,=Src@R0=源數(shù)據(jù)區(qū)指針

LDR R1,=Dst@R1=目標(biāo)數(shù)據(jù)區(qū)指針MOV R2,#NUM LSR R3,R2,#2 @獲得塊拷貝的次數(shù)

BEQ Copy_Words PUSH {R4-R7}@保存將要使用的寄存器R4-R7

Copy_4Word: @進(jìn)行塊拷貝,每次拷貝4個字 LDMIA R0!,{R4-R7} STMIA R1!,{R4-R7} SUB R3,#1 BNE Copy_4Word POP {R4-R7} @恢復(fù)寄存器R4-R7 Thumb_start: @將剩余的數(shù)據(jù)區(qū)以字為單位拷貝Copy_Words: MOV R3,#3 AND R2,R3 @獲得剩余的數(shù)據(jù)的字?jǐn)?shù)

BEQ Stop Copy_Word: LDMIA R0!,{R3} STMIA R1!,{R3} SUB R2,#1 BNE Copy_Word Stop: B Stop.ltorgSrc: .long 1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10,0x11,0x12Dst: .long 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.end @文件結(jié)束

本章提要324匯編語言程序設(shè)計(jì)嵌入式C語言程序設(shè)計(jì)技巧匯編語言與C語言混合編程技術(shù)1匯編語言源程序格式4.3嵌入式C語言程序設(shè)計(jì)技巧變量定義參數(shù)傳遞循環(huán)條件以空間換時間數(shù)學(xué)方法解決問題使用位操作嵌入?yún)R編一、變量定義

在變量聲明的時候,最好把所有相同類型的變量放在一起定義,這樣可以優(yōu)化存儲器布局。由下例可以看出:對于局部變量類型的定義,使用short或char來定義變量并不是總能節(jié)省存儲空間。有時使用32位int或unsinged

int局部變量更有效率一些,如下圖所示:變量定義中,為了精簡程序,程序員總是竭力避免使用冗余變量。但有時使用冗余變量可以減少存儲器訪問的次數(shù)這可以提高系統(tǒng)性能。

二、參數(shù)傳遞

為了使單獨(dú)編譯的C語言程序和匯編程序能夠互相調(diào)用,定義了統(tǒng)一的函數(shù)過程調(diào)用標(biāo)準(zhǔn)ATPCS。ATPCS定義了寄存器組中的{R0~R3}作為參數(shù)傳遞和結(jié)果返回寄存器,如果參數(shù)數(shù)目超過四個,則使用堆棧進(jìn)行傳遞。

內(nèi)部寄存器的訪問速度是遠(yuǎn)遠(yuǎn)大于存儲器的,所以要盡量使參數(shù)傳遞在寄存器里面進(jìn)行,即應(yīng)盡量把函數(shù)的參數(shù)控制在四個以下。三、循環(huán)條件

計(jì)數(shù)循環(huán)是程序中十分常用的流程控制結(jié)構(gòu),一般有以下兩種形式:for(loop=1;loop<=limit;loop++)

for(loop=limit;loop!=0;loop--)這兩種循環(huán)形式在邏輯上并沒有效率差異,但是映射到具體的體系結(jié)構(gòu)中時,就產(chǎn)生了很大的不同,如下圖所示。

四、以空間換時間

計(jì)算機(jī)程序中最大的矛盾是空間和時間的矛盾,從這個角度出發(fā)逆向思維來考慮程序的效率問題,比如若系統(tǒng)的實(shí)時性要求很高,內(nèi)存還有剩余,則我們就有可以用以空間換時間的方法來提高程序執(zhí)行的效率。

五、數(shù)學(xué)方法解決問題

數(shù)學(xué)是計(jì)算機(jī)之母,計(jì)算機(jī)的發(fā)展是以數(shù)學(xué)為依據(jù)和基礎(chǔ)的,所以在編寫程序的時候,適當(dāng)?shù)夭捎靡恍?shù)學(xué)方法會對程序的執(zhí)行效率有數(shù)量級的提高,如下例所示:

方法1:inti,,j;For(i=1;i<=100;i=++){j+=i;}方法2:inti;i=(100*(1+100))/2六、使用位操作

一般的位操作是用來控制硬件的,或者做數(shù)據(jù)變換使用,但是,靈活的位操作可以減少除法和取模的運(yùn)算有效地提高程序運(yùn)行的效率,如下例所示:

方法1:intI,J;I=257/8;J=456%32;方法2:intI,J;I=257>>3;J=456-(456>>4<<4);七、嵌入?yún)R編

匯編語言是效率最高的計(jì)算機(jī)語言,但是它地可讀性較差,因此在C語言編程中為了獲得程序的高效率,我們可以采用變通的方法--嵌入?yún)R編、混合編程。

本章提要324匯編語言上機(jī)過程嵌入式C語言程序設(shè)計(jì)技巧匯編語言與C語言混合編程技術(shù)1匯編語言源程序格式匯編語言與C語言混合編程技術(shù)ARM體系結(jié)構(gòu)支持ARM的匯編語言與C與C++的混合編程.一般的在一個完整的程序設(shè)計(jì)的中,除了初始化部分用匯編語言完成外,其大部分的編程任務(wù)一般都用C或C++完成。ATPCS介紹內(nèi)嵌匯編C和ARM匯編程序間相互調(diào)用一、ATPCS介紹

ATPCS(ARM-ThumbProduceCallStandard)是ARM程序和Thumb程序中子程序調(diào)用的基本規(guī)則,目的是為了使單獨(dú)編譯的C語言程序和匯編程序之間能夠相互調(diào)用。這些基本規(guī)則包括子程序調(diào)用過程中寄存器的使用規(guī)則、數(shù)據(jù)棧的使用規(guī)則和參數(shù)的傳遞規(guī)則。

1.寄存器的使用規(guī)則子程序間通過寄存器R0~R3來傳遞參數(shù),這時,寄存器R0~R3可以記作A1~A4。

在子程序中,使用寄存器R4~R11來保存局部變量。這時,寄存器

R4~R11可以記作V1~V8。在Thumb程序中,通常只能使用寄存器R4~R7來保存局部變量。寄存器R12用作子程序間的scratch寄存器(用于保存SP,在函數(shù)返回時使用該寄存器出棧),記作ip。

寄存器R13用作數(shù)據(jù)棧指針,記作sp。

寄存器R14稱為鏈接寄存器,記作lr。

寄存器R15是程序計(jì)數(shù)器,記作pc。

寄存器別名特殊名使用規(guī)則R0a1

參數(shù)/結(jié)果/scratch寄存器1R1a2

參數(shù)/結(jié)果/scratch寄存器2R2a3

參數(shù)/結(jié)果/scratch寄存器3R3a4

參數(shù)/結(jié)果/scratch寄存器4R4v1

ARM狀態(tài)局部變量寄存器1R5v2

ARM狀態(tài)局部變量寄存器2R6v3

ARM狀態(tài)局部變量寄存器3R7v4wrARM狀態(tài)局部變量寄存器4Thumb狀態(tài)工作寄存器R8v5

ARM狀態(tài)局部變量寄存器5R9v6sbARM狀態(tài)局部變量寄存器6,在支持RWPI的ATPCS中為靜態(tài)基址寄存器R10v7slARM狀態(tài)局部變量寄存器7,在支持?jǐn)?shù)據(jù)棧檢查的ATPCS中為數(shù)據(jù)棧限制指針R11v8fpARM狀態(tài)局部變量寄存器8/幀指針R12

ip子程序內(nèi)部調(diào)用的scratch寄存器R13

sp數(shù)據(jù)棧指針R14

lr連接寄存器R15

pc程序計(jì)數(shù)器2.數(shù)據(jù)棧的使用規(guī)則根據(jù)堆棧指針指向位置的不同和增長方向的不同可以分為以下4種數(shù)據(jù)棧:

FD(FullDescending)滿遞減

ED(EmptyDescending)空遞減

FA(FullAscending)滿遞增

EA(EmptyAscending)空遞增

ATPCS規(guī)定數(shù)據(jù)棧為FD(滿遞減)類型,并且對數(shù)據(jù)棧的操作是8字節(jié)對齊的。

3.參數(shù)的傳遞規(guī)則參數(shù)個數(shù)固定的子程序參數(shù)傳遞規(guī)則:第一個整數(shù)參數(shù),通過寄存器R0~R3來傳遞。其他參數(shù)通過數(shù)據(jù)棧傳遞。參數(shù)個數(shù)可變的子程序參數(shù)傳遞規(guī)則:當(dāng)參數(shù)不超過4個時,可以使用寄存器R0~R3來傳遞參數(shù);當(dāng)參數(shù)超過4個時,還可以使用數(shù)據(jù)棧來傳遞參數(shù)子程序結(jié)果返回規(guī)則:

結(jié)果為一個32位的整數(shù)時,可以通過寄存器R0返回;結(jié)果為一個64位整數(shù)時,可以通過寄存器R0和R1返回,依次類推。二、內(nèi)嵌匯編

在C程序中嵌入?yún)R編程序可以實(shí)現(xiàn)一些高級語言沒有的功能,并可以提高執(zhí)行效率。armcc和armcpp內(nèi)嵌匯編器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。內(nèi)嵌的匯編指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的變量定義,數(shù)據(jù)交換必須通過ATPCS進(jìn)行。嵌入式匯編在形式上表現(xiàn)為獨(dú)立定義的函數(shù)體。1.內(nèi)嵌匯編指令的語法格式

__asm(“指令[;指令]”);ARMC匯編器使用關(guān)鍵字“__asm"。如果有多條匯編指令需要嵌入,可以用“{}”將它們歸為一條語句。如:__asm{指令[;指令]…[指令]}需要特別注意的是__asm是兩個下劃線。2.內(nèi)嵌的匯編指令的特點(diǎn)

操作數(shù)可以是寄存器、常量或C表達(dá)式。它們可以是char、short或者int類型,而且是作為無符號數(shù)進(jìn)行操作。內(nèi)嵌的匯編指令中使用物理寄存器有一些限制。常量前的符號“#”可以省略只有指令B可以使用C程序中的標(biāo)號,指令BL不能使用C程序中的標(biāo)號。不支持匯編語言中用于內(nèi)存分配的偽操作。指令中如果包含常量操作數(shù),該指令可能會被匯編器展開成幾條指令。3.內(nèi)嵌匯編器與armasm匯編器的區(qū)別

內(nèi)嵌匯編器不支持通過“·”指示符或PC獲取當(dāng)前指令地址;

不支持LDRRn,=expression偽指令,而使用MOVRn,

expression指令向寄存器賦值;

不支持標(biāo)號表達(dá)式;不支持ADR和ADRL偽指令;不支持BX和BLX指令;不可以向PC賦值;使用0x前綴替代“&”表示十六進(jìn)制數(shù)。

4.內(nèi)嵌匯編注意事項(xiàng)

必須小心使用物理寄存器,如R0~R3,LR和PC。

不要使用寄存器尋址變量。

使用內(nèi)嵌匯編時,編譯器自己會保存和恢復(fù)它可能用到的寄存器,用戶無須保存和恢復(fù)寄存器。

LDM和STM指令的寄存器列表只允許物理寄存器。

匯編語言用“,”作為操作數(shù)分隔符

三、C和ARM匯編程序間相互調(diào)用

在C和ARM匯編程序之間相互調(diào)用必須遵守ATPCS(ARM-ThumbProcedureCallStandard)規(guī)則。C和匯編之間的相互調(diào)用可以從以下這三方面來介紹:匯編程序?qū)全局變量的訪問在C語言程序中調(diào)用匯編程序在匯編程序中調(diào)用C語言程序1.匯編程序訪問全局C變量

匯編程序可以通過地址間接訪問在C語言程序中聲明的全局變量。通過使用IMPORT關(guān)鍵詞引人全局變量,并利用LDR和STR指令根據(jù)全局變量的地址可以訪問它們。對于不同類型的變量,需要采用不同選項(xiàng)的LDR和STR指令,如下所示:

unsignedchar LDRB/STRBunsignedshort LDRH/STRHunsignedint LDR/STRchar LDRSB/STRSBshort LDRSH/STRSHAREAglobals,CODE,READONLYEXPORTasmsubroutine;IMPORTglobvar

;asmsubroutineLDRR1,=globvar;從文字池讀globvar的地;址,并將其保存到R1LDRR0,[R1] ;再將其值讀入到寄存器R0中ADDR0,R0,#2STRR0,[R1];修改后再將寄存器R0的值;賦予變量globvarMOVPC,LREND2.在C語言程序中調(diào)用匯編程序

為了保證程序調(diào)用時參數(shù)的正確傳遞,匯編程序的設(shè)計(jì)要遵守ATPCS。在匯編程序中需要使用EXPORT偽操作來聲明,使得本程序可以被其它程序調(diào)用。同時,在C程序調(diào)用該匯編程序之前需要在C語言程序中使用extern關(guān)鍵詞來聲明該匯編程序。C源程序:#include<stdio.h>externvoidstrcopy(char*d,constchar*s)

;用extern聲明一個函數(shù)為外部函數(shù),可以被其他文件中的函數(shù)調(diào)用。intmain(){constchar*srcstr=“Firststring

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論