實(shí)驗(yàn)3匯編和語言相互調(diào)用_第1頁
實(shí)驗(yàn)3匯編和語言相互調(diào)用_第2頁
實(shí)驗(yàn)3匯編和語言相互調(diào)用_第3頁
實(shí)驗(yàn)3匯編和語言相互調(diào)用_第4頁
實(shí)驗(yàn)3匯編和語言相互調(diào)用_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

主要內(nèi)容:C語言的編譯過程C語言程序→匯編語言程序→目標(biāo)可執(zhí)行程序匯編語言的函數(shù)調(diào)用過程參數(shù)準(zhǔn)備函數(shù)返回匯編函數(shù)間調(diào)用函數(shù)調(diào)用舉例C語言調(diào)用匯編函數(shù)匯編語言調(diào)用C語言函數(shù)命令 文件和 文件20132C和匯編語言混合編程C語言程序→匯編語言程序→目標(biāo)可執(zhí)行程序C程序先要轉(zhuǎn)化為匯編程序,意味著C和匯編語言混合編程時,最終可以從匯編語言之間的相用過程著眼C程序匯編程序匯編程序目標(biāo)程序編譯轉(zhuǎn)化C程序匯編程序匯編程序如何轉(zhuǎn)化如何調(diào)用C程序匯編程序如何調(diào)用20133C語言函數(shù)→匯編函數(shù)inttest_fun(paras...){[處理過程]}test_fun:mov ip,spstmdb

sp!,

{fp,ip,

lr,

pc}sub fp,ip,

#4 ;

0x4[處理過程]ldmdb fp,

{fp,

sp,pc}函數(shù)名轉(zhuǎn)化為標(biāo)號?;厮萁Y(jié)構(gòu)退出fpipsplrpc(r11):

Frame

Pointer(r12):(r13):

Stack

Pointer(r14):

Link

Register(r15):

Program

Counterip

→外層函數(shù)的棧頂fp

→當(dāng)前函數(shù)的棧底20134參數(shù)個數(shù)≤4時-輸入?yún)?shù)20135在函數(shù)體內(nèi)使用參數(shù)(4個參數(shù)見下表)別名寄存器說明a1r0參數(shù)1a2r1參數(shù)2a3r2參數(shù)3a4r3參數(shù)4參數(shù)個數(shù)≤4時-返回值20136函數(shù)結(jié)束時,應(yīng)將返回值存放到r0中用匯編語言編寫函數(shù)舉例(參數(shù)個數(shù)≤4)20137C語言函數(shù)total_fun(int

p1,int

p2,int

p3),返回三數(shù)之和,用匯編語言實(shí)現(xiàn)total_fun:/*

函數(shù)名由標(biāo)號替代*/movip,

sp/*

?;厮萁Y(jié)構(gòu)*/stmdbsp!,

{fp,

ip,

lr,

pc}subfp,

ip,

#4adda1,a1,a2/*

實(shí)現(xiàn)p1+p2,存放在r0中*/adda1,a1,a3/*

實(shí)現(xiàn)p1+p2+p3,存放在r0中*/ldmdbfp,

{fp,

sp,

pc}/*

返回*/匯編語言調(diào)用函數(shù)(參數(shù)個數(shù)≤4)如何準(zhǔn)備函數(shù)參數(shù)將參數(shù)依次直接存入R0-R3如何獲得函數(shù)返回值從寄存器R0中舉例:mov

r0,#1/*

準(zhǔn)備參數(shù)1*/mov

r1,#2/*

準(zhǔn)備參數(shù)2*/mov

r2,#3/*

準(zhǔn)備參數(shù)3*/bl

total_fun /*

調(diào)用剛編寫的求和函數(shù)*//*

此時,r0中的值應(yīng)該是6

*/20138參數(shù)個數(shù)>4時-輸入?yún)?shù)test_fun:mov ip,

spstmdb

sp!,

{fp,ip,

lr,pc}sub fp,ip,

#4 ;

0x4sub sp,

sp,

#32[處理過程]ldmdb fp,

{fp,

sp,

pc}ip

→外層函數(shù)體的棧頂fp

→當(dāng)前函數(shù)體的棧底20139sp→當(dāng)前函數(shù)體的棧頂

#32→當(dāng)前函數(shù)所用棧容量當(dāng)前函數(shù)所用棧容量201310臨時變量個數(shù)+函數(shù)參數(shù)個數(shù)多于4個的部分例如:int

foo(int

x1,int

x2){int

a,b,c; /*

3個臨時變量*/}其使用的棧容量=3int

foo(int

x1,int

x2,

int

x3,

int

x4,

intx5){int

a,b,c; /*

3個臨時變量*/...}其使用的棧容量=3+(5-4)=4當(dāng)前函數(shù)內(nèi)存布局外層函數(shù)棧頂當(dāng)前函數(shù)棧頂子函數(shù)參數(shù):由頂開始依次存放現(xiàn)場信息函數(shù)中的臨時變量:由底開始依次存放子函數(shù)參數(shù)5子函數(shù)參數(shù)6子函數(shù)參數(shù)函數(shù)變量函數(shù)變量2函數(shù)變量1fpiplrpcfpipip

→外層函數(shù)體的棧頂fp

→當(dāng)前函數(shù)體的棧底201311當(dāng)前函數(shù)內(nèi)存布局-思考題如果當(dāng)前函數(shù)有多個子函數(shù),那么它的內(nèi)存布局是如何的?例如:– int

foo(){int

x1,x2,x3,x4,x5,x6;foo1(x1,x2);foo2(x1,x2,x3,x4);foo3(x1,x2,x3,x4,x5,x6);}子函數(shù)參數(shù)5子函數(shù)參數(shù)6子函數(shù)參數(shù)函數(shù)變量函數(shù)變量2函數(shù)變量1fpiplrpc201312C語言調(diào)用匯編函數(shù).global

total_fun.texttotal_fun:4movip,

sp5stmdbsp!,

{fp,

ip,

lr,pc}6subfp,

ip,

#47adda1,a1,a28adda1,a1,a39ldmdbfp,

{fp,sp,

pc}10.endtest.cextern

int

unsignedtotal_fun(int

p1,int

p2,

int

p3);int

test(){inty;y

=

total_fun(1,2,3);return

y;7

}201313total_fun.s匯編語言調(diào)用C語言函數(shù)1

.extern

total_fun1

unsigned

int

total_fun(.texttest:mov ip,spint

p1,

int

p2,

int

p3)

{return

p1+p2+p3;4

}5

stmdb sp!,

{fp,ip,

lr,

pc}6

sub fp,

ip,

#47

mov r0,#18

mov r1,#29

mov r2,#310bl

total_fun11ldmdb fp,

{fp,

sp,

pc}12.endtest.s201314total_fun.c命令文件命令 文件IDE與目標(biāo)板連接時調(diào)試過程中復(fù)位目標(biāo)板后需要集成環(huán)境自動完成一些特定的功能:復(fù)位目標(biāo)板、清除看門狗、

中斷寄存器,等等這些功能可以由一組命令序列完成,該命令序列保存在文件中。該文件稱為命令 文件。文件后綴一般為.cs201315文件命令命令–

GO執(zhí)行程序:從當(dāng)前PC開始執(zhí)行程序MEMWRITE

區(qū)寫向地址0x1000寫入值0x5Amemwrite

0x1000

0x5A–

REFRESH刷新窗口REGWRITE

寄存器寫向寄存器PC寫入值0x3840regwrite

pc

0x3840RESET

復(fù)位目標(biāo)設(shè)備–

STOP停止執(zhí)行程序201316文件命令命令 文件舉例(page

122):–stopregwrite

sp

0x1000命令 文件;一般目標(biāo)板都會處于運(yùn)行狀態(tài);程序剛執(zhí)行時未初始化堆棧地址–

類似于Windows操作系統(tǒng)中的autoexec.bat

自動執(zhí)行批處理文件201317命令文件的設(shè)置什么也不做,這時,IDE只是和目標(biāo)板連接而已,但映像文件并不 到目標(biāo)板IDE和目標(biāo)板連接以后,自動把映像文件 到目標(biāo)板IDE和目標(biāo)板連接以后,執(zhí)行

文件,但并不將映像文件 到目標(biāo)板201318文件在程序編譯時起作用。該文件描述代碼

定位的有關(guān)信息,包括代碼段,數(shù)據(jù)段,地址段等, 器必須使用該文件對整個系統(tǒng)的代碼做正確的定位。在IDE開發(fā)環(huán)境中使用擴(kuò)展名*.ld201319文件SECTIONS{3

.=0X10000;.text:{*(.text)}.=0x80000000;.data:{*(.data)}.bss:{*(.bss)}8

}SECTIONS{.text:{*(.text)}.data:{*(.data)}.bss:

{*(.bss)}6

}目標(biāo)輸入文件1目標(biāo)輸入文件2目標(biāo)輸入文件n目標(biāo)輸出文件目標(biāo)輸入文件1:代碼段初始化的數(shù)據(jù)段未初始化的數(shù)據(jù)段目標(biāo)輸入文件2:代碼段初始化的數(shù)據(jù)段未初始化的數(shù)據(jù)段目標(biāo)輸出文件:代碼段初始化的數(shù)據(jù)段未初始化的數(shù)據(jù)段201320文件點(diǎn)"."表示當(dāng)前位置SECTIONS{.text:{*(.text)}.data:{*(.data)}.bss:

{*(.bss)}6

}SECTIONS{3

.=0X10000;.text:{*(.text)}.=0x80000000;.data:{*(.data)}.bss:{*(.bss)}8

}201321代碼的執(zhí)行過程起始點(diǎn):代碼段起始處(地址)程序入口地址查找程序 地址默認(rèn)為標(biāo)號:_start從程序地址開始執(zhí)行是否找到入口地址?從代碼段起始處開始執(zhí)行否是從程序地址開始?否

是201322程序 地址的設(shè)置默認(rèn)是global

_start

標(biāo)號處也可以人工指定程序

地址所在文件程序

標(biāo)號名稱201323連接后代碼段的組織(默認(rèn)情況下)單個文件的情況按源程序編寫順序多個文件的情況文件放在最前面,其余文件按字母順序組織SECTIONS{.text:{*(.text)}.data:{*(.data)}.bss:

{*(.bss)}6

}目標(biāo)輸入文件1:代碼段初始化的數(shù)據(jù)段未初始化的數(shù)據(jù)段目標(biāo)輸入文件2:代碼段初始化的數(shù)據(jù)段未初始化的數(shù)據(jù)段目標(biāo)輸出文件:代碼段初始化的數(shù)據(jù)段未初始化的數(shù)據(jù)段201324連接后代碼段的組織(默認(rèn)情況下)如何查看連接后的代碼–

編譯連接后可使用Tool>Disassemble

all命令,會在工程的Debug生成一個objdum文件下201325作業(yè)

溫馨提示

  • 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

提交評論