




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第二章_3ARM匯編程序設(shè)計(jì)在ARM嵌入式系統(tǒng)中,一般用C語言等高級(jí)語言對(duì)各個(gè)應(yīng)用接口模塊功能的實(shí)現(xiàn)進(jìn)行程序設(shè)計(jì),但在某些地方用匯編語言更方便、簡單。在一些關(guān)鍵部分,例如用來初始化電路以及用來為軟件(高級(jí)語言編寫)做運(yùn)行前準(zhǔn)備的啟動(dòng)代碼必須用匯編語言編寫。匯編語言的代碼效率很高,一般用于對(duì)硬件的直接控制。編程步驟
1分析問題
2確定算法3確定數(shù)據(jù)分配的存儲(chǔ)單元
4畫程序流程圖
5編寫程序ARM源程序文件
文件類型擴(kuò)展名匯編語言源文件.sC語言源文件.cC++源文件.cpp引入文件.INC頭文件.h本章提要324匯編語言程序設(shè)計(jì)實(shí)例嵌入式C語言程序設(shè)計(jì)技巧匯編語言與C語言混合編程技術(shù)1GNU匯編語言源程序格式GNU匯編程序基本格式使用偽操作.equ定義了幾個(gè)變量并為其賦值。用偽操作.global聲明一個(gè)全局變量_strat,在下面就可以看出,_strat一般用于標(biāo)識(shí)程序代碼的開始,即程序的入口點(diǎn)。.text偽操作表示以下為代碼段,將被編譯到代碼段或者代碼子段。.end偽操作匯編編譯器源文件的結(jié)束。每一個(gè)匯編模塊必須包含一個(gè).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ì)主要是面對(duì)在ARM平臺(tái)上進(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可識(shí)別的注釋方式有:C風(fēng)格多行注釋符/*...*/或GNU單行注釋符“@”或“#”。(3)符號(hào)與C語言基本一致,符號(hào)名由字母、數(shù)字以及'_'、和'.'組成,大小寫敏感。段與重定位鏈接器ld用于把多個(gè)目標(biāo)文件合并為一個(gè)可執(zhí)行文件。匯編器as生成的目標(biāo)文件都假定從地址0開始,ld為其指定最終的地址。鏈接器ld把目標(biāo)文件中的每個(gè)section都作為一個(gè)整體,為其分配運(yùn)行的地址符號(hào)說明(1)labellable后面要帶冒號(hào)‘:’
例如:_start:breset_handler。(2)給符號(hào)賦值三種方式:=.set.equ(3)符號(hào)名由數(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先對(duì)內(nèi)存地址0x3000開始的100個(gè)字內(nèi)存單元填入0x10000001~0x10000064字?jǐn)?shù)據(jù),然后將每個(gè)字單元進(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自動(dòng)增加
ADD r4,r4,r1 CMP r1,#0
BNE loop ;r1為0時(shí)中斷循環(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時(shí),選擇的是子程序DoAdd;當(dāng)R0為1時(shí),選擇的是子程序DoSub。例4在ADS編譯環(huán)境下,程序如下:AREAJump,CODE,READONLY ;設(shè)置本段程序的名稱及屬性NUMEQU2 ;跳轉(zhuǎn)表中的子程序個(gè)數(shù)ENTRY ;程序執(zhí)行的入口點(diǎn)StartMOVR0,#0 ;設(shè)置參數(shù),R0中為需調(diào)用哪個(gè)子程序
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時(shí)上面的代碼將跳轉(zhuǎn)到DoAddDCDDoSub
;當(dāng)R0為1時(shí)上面的代碼將跳轉(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ù)高位對(duì)齊,如果夠減上商1,并減去除數(shù);否則上商0。然后右移除數(shù)1位,重復(fù)上述操作。.global_start .macromCLZRd,Rs @求一個(gè)數(shù)的前導(dǎo)0個(gè)數(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 @將一個(gè)數(shù)無符號(hào)化
TST \Rs,#0x80000000 @將無符號(hào)的整數(shù)放到Rs中
EORNE \Rd,\Rd,#1 @將符號(hào)部分放到Rd中
MVNNE \Rs,\Rs ADDNE \Rs,\Rs,#1.endm.text_start: LDR R0,=-123456 @被除數(shù)
LDR R1,=523 @除數(shù)Div: MOV R6,#0 @結(jié)果的符號(hào)位
mUNSIGN R6,R0 @無符號(hào)化
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é)果的符號(hào)
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個(gè)字 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í)間數(shù)學(xué)方法解決問題使用位操作嵌入?yún)R編一、變量定義
在變量聲明的時(shí)候,最好把所有相同類型的變量放在一起定義,這樣可以優(yōu)化存儲(chǔ)器布局。由下例可以看出:對(duì)于局部變量類型的定義,使用short或char來定義變量并不是總能節(jié)省存儲(chǔ)空間。有時(shí)使用32位int或unsinged
int局部變量更有效率一些,如下圖所示:變量定義中,為了精簡程序,程序員總是竭力避免使用冗余變量。但有時(shí)使用冗余變量可以減少存儲(chǔ)器訪問的次數(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ù)目超過四個(gè),則使用堆棧進(jìn)行傳遞。
內(nèi)部寄存器的訪問速度是遠(yuǎn)遠(yuǎn)大于存儲(chǔ)器的,所以要盡量使參數(shù)傳遞在寄存器里面進(jìn)行,即應(yīng)盡量把函數(shù)的參數(shù)控制在四個(gè)以下。三、循環(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)中時(shí),就產(chǎn)生了很大的不同,如下圖所示。
四、以空間換時(shí)間
計(jì)算機(jī)程序中最大的矛盾是空間和時(shí)間的矛盾,從這個(gè)角度出發(fā)逆向思維來考慮程序的效率問題,比如若系統(tǒng)的實(shí)時(shí)性要求很高,內(nèi)存還有剩余,則我們就有可以用以空間換時(shí)間的方法來提高程序執(zhí)行的效率。
五、數(shù)學(xué)方法解決問題
數(shù)學(xué)是計(jì)算機(jī)之母,計(jì)算機(jī)的發(fā)展是以數(shù)學(xué)為依據(jù)和基礎(chǔ)的,所以在編寫程序的時(shí)候,適當(dāng)?shù)夭捎靡恍?shù)學(xué)方法會(huì)對(duì)程序的執(zhí)行效率有數(shù)量級(jí)的提高,如下例所示:
方法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++的混合編程.一般的在一個(gè)完整的程序設(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ù),這時(shí),寄存器R0~R3可以記作A1~A4。
在子程序中,使用寄存器R4~R11來保存局部變量。這時(shí),寄存器
R4~R11可以記作V1~V8。在Thumb程序中,通常只能使用寄存器R4~R7來保存局部變量。寄存器R12用作子程序間的scratch寄存器(用于保存SP,在函數(shù)返回時(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(滿遞減)類型,并且對(duì)數(shù)據(jù)棧的操作是8字節(jié)對(duì)齊的。
3.參數(shù)的傳遞規(guī)則參數(shù)個(gè)數(shù)固定的子程序參數(shù)傳遞規(guī)則:第一個(gè)整數(shù)參數(shù),通過寄存器R0~R3來傳遞。其他參數(shù)通過數(shù)據(jù)棧傳遞。參數(shù)個(gè)數(shù)可變的子程序參數(shù)傳遞規(guī)則:當(dāng)參數(shù)不超過4個(gè)時(shí),可以使用寄存器R0~R3來傳遞參數(shù);當(dāng)參數(shù)超過4個(gè)時(shí),還可以使用數(shù)據(jù)棧來傳遞參數(shù)子程序結(jié)果返回規(guī)則:
結(jié)果為一個(gè)32位的整數(shù)時(shí),可以通過寄存器R0返回;結(jié)果為一個(gè)64位整數(shù)時(shí),可以通過寄存器R0和R1返回,依次類推。二、內(nèi)嵌匯編
在C程序中嵌入?yún)R編程序可以實(shí)現(xiàn)一些高級(jí)語言沒有的功能,并可以提高執(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是兩個(gè)下劃線。2.內(nèi)嵌的匯編指令的特點(diǎn)
操作數(shù)可以是寄存器、常量或C表達(dá)式。它們可以是char、short或者int類型,而且是作為無符號(hào)數(shù)進(jìn)行操作。內(nèi)嵌的匯編指令中使用物理寄存器有一些限制。常量前的符號(hào)“#”可以省略只有指令B可以使用C程序中的標(biāo)號(hào),指令BL不能使用C程序中的標(biāo)號(hào)。不支持匯編語言中用于內(nèi)存分配的偽操作。指令中如果包含常量操作數(shù),該指令可能會(huì)被匯編器展開成幾條指令。3.內(nèi)嵌匯編器與armasm匯編器的區(qū)別
內(nèi)嵌匯編器不支持通過“·”指示符或PC獲取當(dāng)前指令地址;
不支持LDRRn,=expression偽指令,而使用MOVRn,
expression指令向寄存器賦值;
不支持標(biāo)號(hào)表達(dá)式;不支持ADR和ADRL偽指令;不支持BX和BLX指令;不可以向PC賦值;使用0x前綴替代“&”表示十六進(jìn)制數(shù)。
4.內(nèi)嵌匯編注意事項(xiàng)
必須小心使用物理寄存器,如R0~R3,LR和PC。
不要使用寄存器尋址變量。
使用內(nèi)嵌匯編時(shí),編譯器自己會(huì)保存和恢復(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ù)全局變量的地址可以訪問它們。對(duì)于不同類型的變量,需要采用不同選項(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ù)的正確傳遞,匯編程序的設(shè)計(jì)要遵守ATPCS。在匯編程序中需要使用EXPORT偽操作來聲明,使得本程序可以被其它程序調(diào)用。同時(shí),在C程序調(diào)用該匯編程序之前需要在C語言程序中使用extern關(guān)鍵詞來聲明該匯編程序。C源程序:#include<stdio.h>externvoidstrcopy(char*d,constchar*s)
;用extern聲明一個(gè)函數(shù)為外部函數(shù),可以被其他文件中的函數(shù)調(diào)用。intmain(){constchar*srcstr=“Firststring
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)場打分活動(dòng)方案
- 班級(jí)常規(guī)活動(dòng)方案
- 燕窩贈(zèng)送活動(dòng)方案
- 現(xiàn)金返還促銷活動(dòng)方案
- 愛心莊園活動(dòng)方案
- 愛心餃子活動(dòng)方案
- 牙科講座活動(dòng)方案
- 珠寶店鈀金換款活動(dòng)方案
- 爸爸來了活動(dòng)方案
- 甜品店開業(yè)前活動(dòng)方案
- 成人女性壓力性尿失禁護(hù)理干預(yù)護(hù)理團(tuán)標(biāo)解讀
- GB 29743.2-2025機(jī)動(dòng)車?yán)鋮s液第2部分:電動(dòng)汽車?yán)鋮s液
- 廣州外語學(xué)校小升初數(shù)學(xué)試題
- 2024內(nèi)蒙古煤炭地質(zhì)勘查(集團(tuán))一一七有限公司招聘筆試參考題庫附帶答案詳解
- 信訪工作法治化培訓(xùn)講座
- 急性右心衰的治療與護(hù)理
- 露天礦山新進(jìn)員工安全培訓(xùn)
- 主播助理合同范本
- 制約理論(TOC)驅(qū)動(dòng)制造業(yè)突破性增長
- 湖南省2024年普通高等學(xué)校對(duì)口升學(xué)旅游專業(yè)
- 氨甲環(huán)酸用藥護(hù)理
評(píng)論
0/150
提交評(píng)論