基礎(chǔ)代碼示例實驗手冊_第1頁
基礎(chǔ)代碼示例實驗手冊_第2頁
基礎(chǔ)代碼示例實驗手冊_第3頁
基礎(chǔ)代碼示例實驗手冊_第4頁
基礎(chǔ)代碼示例實驗手冊_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

基礎(chǔ)代碼示例實驗手冊

目錄

1課程介紹........................................................................3

1.1簡介........................................................................................3

1.2內(nèi)容描述....................................................................................3

1.3讀者知識背景................................................................................3

1.4實驗環(huán)境說明................................................................................3

2實驗1:hello-world示例程序...................................................4

2.1實驗介紹...................................................................................4

2.1.1關(guān)于本實驗................................................................................4

2.1.2教學(xué)目標(biāo)..................................................................................4

2.1.3實驗內(nèi)容介紹..............................................................................4

2.2實驗任務(wù)操作指導(dǎo)...........................................................................4

2.2.1創(chuàng)建示例程序源碼..........................................................................4

2.2.2思考題及答案..............................................................................6

3實驗士使用C語言代碼調(diào)用匯編程序.............................................6

3-1實驗介紹.....................................................................................6

3.11關(guān)于本實驗...............................................................................6

3.1.2教學(xué)目標(biāo).................................................................................6

3.1.3實驗內(nèi)容介紹.............................................................................6

3-2實驗任務(wù)操作指導(dǎo)............................................................................7

3.2.1創(chuàng)建示例程序源碼..........................................................................7

322進(jìn)行編譯運行...............................................................................8

3.3思考題及答案................................................................................9

4實驗3:使用C語言代碼內(nèi)嵌匯編程序.............................................9

4.1實驗介紹...................................................................................9

4.1.1關(guān)于本實驗................................................................................9

4.1.2教學(xué)目標(biāo)..................................................................................9

4-1-3內(nèi)容介紹...................................................................................9

4.2實驗任務(wù)操作指導(dǎo)...........................................................................9

4-2.1創(chuàng)建示例程序源碼..........................................................................9

4.2.2進(jìn)行編譯..................................................................................11

4.2-3進(jìn)行運行..................................................................................11

4-2.4思考題及答案..............................................................................11

X課程介紹

工.1簡介

本手冊適用于學(xué)習(xí)ARM平臺匯編課程的學(xué)生進(jìn)行實驗練習(xí),完成本實驗手冊后,您將能更加

充分理解GNUARM匯編代碼運行環(huán)境的搭建、配置及編譯運行,掌握在華為鯨鵬云服務(wù)器上

進(jìn)行環(huán)境配置°

1.2內(nèi)容描述

本實驗指導(dǎo)書通過在華為鯨鵬云服務(wù)器上,編譯運行3個不同功能的示例程序。完成實驗操作

后,讀者會掌握基本的匯編程序編寫,ARMv8開發(fā)編譯環(huán)境的配置以及加深對ARM平臺的了

解。

1.3讀者知識背景

本課程為ARM平臺匯編基礎(chǔ)課程,為了更好地掌握本書內(nèi)容,閱讀本書的讀者應(yīng)首先具備以

下基本條件:

?具備基本的Linux命令能力。

14實驗環(huán)境說明

?華為鯉鵬云主機(jī)、0penEuler20.03操作系統(tǒng);

?安裝gcc7.3+版本;

?每套實驗環(huán)境可供1名學(xué)員上機(jī)操作。

mkdirhello

cdhello

步驟2創(chuàng)建示例程序源碼hello.s

執(zhí)行以下命令,創(chuàng)建示例程序源碼hello.s0

vimhello.s

代碼內(nèi)容如下:

.(cx(

.globaltartl

tart1!

movx0.#0

Idrxl.=msg

movx2,len

movx8,64

svc#0

movxO.I23

movx8,93

svc#0

.data

msg:

.ascii"HelloWorld!\n"

len=.-msg

.text

.globaltart1

tart1:X0

mov

X1

Idr

X21en

movX

X84

mov

SVC

mov

mov

svc

data

isg:

.ascii'HelloWorld

)en=.-msg

步驟3進(jìn)行編譯運行

保存示例源碼文件,然后退出vim編輯器。在當(dāng)前目錄中依次執(zhí)行以下命令,進(jìn)行代碼編譯運

行。

ashello.s-ohello.o

Idhello.o-ohello

./hello

[root@ecs-huaweihello]#Is

hello,s

[root@ecs-huaweihello]#ashello,s-ohello,o

[root@ecs-huaweihello]#Is

hello,ohello,s

[root@ecs-huaweihello]#Idhello,o-ohello

Id:warning:cannotfindentrysymbol_start;defaultingto00000000004000b0

[root@ecs-huaweihello]#Is

hellohello,ohello,s

Lroot@ecs-huaweihelloj#./hello

HelloWorld!.

[root@ecs-huaweihello]#.

通過上述代碼運行,可以看出,編寫的hello-wolrd示例程序已經(jīng)在華為鯨鵬云服務(wù)器上通過

編譯和運行,并成功輸出結(jié)果。

222思考題及答案

?思考下同樣的代碼在X86平臺能否運行,為什么?

參考答案:

不能,因為X86平臺使用的是復(fù)雜指令集(CISC),而我們實驗中使用到的華為鯨鵬云服務(wù)器是

基于ARM平臺的,使用的是精簡指令集(RISC),二者的匯編指令差異較大。

3實驗2:使用C語言代碼調(diào)用匯編程序

3」實驗介紹

3.1.1關(guān)于本實驗

實現(xiàn)ARM平臺上通過C語言源碼來調(diào)用匯編源碼中的代碼。

3.1.2教學(xué)目標(biāo)

掌握在ARM平臺上使用C語言源碼來調(diào)用匯編源碼的方法。

3.1.3實驗內(nèi)容介紹

該匯編代碼是針對Aarch64架構(gòu)的。在匯編程序中,用.global定義一個全局函數(shù)strcpyi,然

后該函數(shù)就可以在C代碼中用extern關(guān)鍵字加以聲明,然后直接調(diào)用。

3.2實驗任務(wù)操作指導(dǎo)

321創(chuàng)建示例程序源碼

以下步驟以在華為鯨鵬云服務(wù)器上執(zhí)行為例。

步驟1創(chuàng)建目錄

執(zhí)行以下命令,創(chuàng)建called目錄存放該程序的所有文件,并進(jìn)入called目錄。

rnkdircalled

cdcalled

步驟2創(chuàng)建globalCalling.c源代碼

執(zhí)行以下命令,創(chuàng)建示例調(diào)用C語言程序源碼globalCalling.c。

vimglobalCalling.c

代碼內(nèi)容如下:

/*globalCalling.c*/

"include<stdio.h>

externvoidstrcpy1(char*(Lconstchar*s);

intmain()

(

constchar*srcstring="Sourcestring";

chardststringf]="Dest:nationstring";

prinlf("OriginalStatus:%s%s\n".srcslring,dststring);

strcpy1(dststring,srcsiring);

printf("ModifiedStatus:%s%s\n",srcstring,dststring);

return0;

}

^include<stdio.h>

axternvoidstrcpy1(char*d,constchar*s);

intmainO

(

constchar*srcstring=ii'ce;

chardststring[]=;

printf(式tu:,srestring,dststring);

strepyl(dststring,srestring);

arintf('rodi:ie-t.ws'「n,srestring,dststring);

return0:

步驟3創(chuàng)建globalCalled.S源代碼

執(zhí)行以下代碼命令,創(chuàng)建被調(diào)用的匯編語言程序源碼globalCalled.So

vimglobalCalled.S

代碼內(nèi)容如下:

/*globalCalled.S*/

.globalstrcpy1

#Startthefunction:strcpyI

strcpy1:

LDRBw2,[Xl],#l

STRw2,[X0],#1

CMPw2.#0//asciicode"NUL"isthelastcharacterofastring,

BNEstrcpy1

RET

.globalstrcpyl

strcpyl:

LDRBw2,[XI],

STRw2,[XO],

CMPw2,

BNEstrcpyl

322進(jìn)行編譯運行

保存示例源碼文件,然后退出vim編輯器。在當(dāng)前目錄中依次執(zhí)行以下命令,進(jìn)行代碼編譯運

行。

gccglobalCalling.cglobalCalled.S-ocalled

./called

[root@ecs-huaweicalled]#pwd

/root/called

[rootdecs-huaweicalled]#Is

globalCalled.SglobalCalling.c

[root@ecs-huaweicalled]#gccglobalCalling.cglobalCalled.S-ocalled

[root@ecs-huaweicalled]#Is

calledglobalCalled.SglobalCalling.c

[root@ecs-huaweicalled]#./called

OriginalStatus:SourcestringDestinationstring

ModifiedStatus:SourcestringSourcestring

[root@ecs-huaweicalled]#.

通過上述代碼運行,可以看出,編寫的使用C語言代碼調(diào)用匯編程序已經(jīng)在華為鯨鵬云服務(wù)

器上通過編譯和運行,并成功輸出結(jié)果:

OriginalStatus:SourcestringDestinationstring

ModifiedStatus:SourcestringSourcestring

33思考題及答案

?除了使用調(diào)用匯編腳本的方式,還有哪些方法可以使用c語言調(diào)用匯編代碼?

參考答案:

可以使用C語言中的asm關(guān)鍵字來在C語言源碼中嵌入?yún)R編代碼。

實驗3:使用C語言代碼內(nèi)嵌匯編程序

4.工實驗介紹

4.1,關(guān)于本實驗

實現(xiàn)在ARM平臺上通過C語言代碼內(nèi)嵌匯編代碼的方式,將一個整數(shù)類型值,以字節(jié)為單位

從小尾端轉(zhuǎn)到大尾端或者相反的功能。

4.1.2教學(xué)目標(biāo)

掌握在ARM平臺上實現(xiàn)C語言代碼中內(nèi)嵌匯編代碼的方法。

4.1.3內(nèi)容介紹

通過(:語言代碼內(nèi)嵌匯編代碼,將一個整數(shù)類型值,以字節(jié)為單位從小尾端轉(zhuǎn)到大尾端或者

相反的功能。例如小尾端時32bit整數(shù)值用進(jìn)制表示為。X12345678,將其以字節(jié)為單位轉(zhuǎn)

換為大尾端存儲后,該值為0x78563422。

4.2實驗任務(wù)操作指導(dǎo)

421倉IJ建示例程序源碼

以下步驟以在華為魚昆鵬云服務(wù)器上執(zhí)行為例。

步驟1創(chuàng)建目錄

執(zhí)行以下命令,創(chuàng)建builtin目錄存放該程序的所有文件,并進(jìn)入bulitin目錄。

mkdirbuiltin

cdbuiltin

步驟2創(chuàng)建C語言內(nèi)嵌匯編程序源代碼

執(zhí)行以下命令,創(chuàng)建C語言內(nèi)嵌匯編程序源碼globalBuiltin.ee

vimglobalBuiltin.c

代碼內(nèi)容如下:

/?globalBuiltin.c*/

#include<stdio.h>

intmain()

(

intval=0x12345678;

_asm____volatile_(

"movx3,%l\n"

"movw3.w3,ror#8\n"

"bicw3,w3,M)x00nWff\n"

"movx4,%l\n"

"movw4,w4.ror#24\n"

"bicw4.w4,#OxfR)OffUO\n"

"addw3,w4,w3'n"

"mov%0,x3\n"

:"0"(val)

:"w3","w4","cc"

);

printf("outis%x\n",val);

return0;

)

'include<stdio.h>

ntmain。

intval=0xl2:-l";

—asm____volatile—(

/z

IOVx3,%l\n

“movw3,w3,ror#8'n'

“bicw3,w3,#OxOOffOOff\n,z

“movx4,%l\n,z

“movw4,w4,ror#24\n”

“bicw4,w4,#OxffOOffOO\n"?

“addw3,w4,w3'n”

“mov%0,x3\nz,

:(val)

:,z0(val)

);

printf(outis\n,val);

return「1

422進(jìn)行編譯

保存示例源碼文件,然后退出vim編輯器。在當(dāng)前目錄中依次執(zhí)行以下命令,進(jìn)行代碼編譯。

步驟1預(yù)處理

gcc-EglobalBuiltin.c-oglobalBuiltin.i

步驟2編譯

gcc-SglobalBuiltin.i-oglobalBuiltin.s

步驟3匯編

gcc-cglobalBuiltin.s-ogio

溫馨提示

  • 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

提交評論