計(jì)算機(jī)基礎(chǔ)大作業(yè)_第1頁
計(jì)算機(jī)基礎(chǔ)大作業(yè)_第2頁
計(jì)算機(jī)基礎(chǔ)大作業(yè)_第3頁
計(jì)算機(jī)基礎(chǔ)大作業(yè)_第4頁
計(jì)算機(jī)基礎(chǔ)大作業(yè)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

金陵科故皆院

當(dāng)i實(shí)膾想告

(理工類)

課程名稱:計(jì)算機(jī)系統(tǒng)基礎(chǔ)I專業(yè)班級:

學(xué)生學(xué)號:學(xué)生姓名:

所屬院部:計(jì)算機(jī)工程學(xué)院指導(dǎo)教師:

2019——2020學(xué)年第1學(xué)期

金陵科技學(xué)院教務(wù)處制

實(shí)驗(yàn)報(bào)告書寫要求

實(shí)臉報(bào)告原則上要求學(xué)生手寫,要求書寫工整。若因課程特點(diǎn)需

打印的,要遵照以下字體、字號、間距等的具體要求。紙張一律采用

A4的紙張。

實(shí)驗(yàn)報(bào)告書寫說明

實(shí)臉報(bào)告中一至四項(xiàng)內(nèi)容為必填項(xiàng),包括實(shí)驗(yàn)?zāi)康暮鸵?;?shí)臉

儀器和設(shè)備;實(shí)驗(yàn)內(nèi)容與過程;實(shí)驗(yàn)結(jié)果與分析。各院部可根據(jù)學(xué)科

特點(diǎn)和實(shí)臉具體要求增加項(xiàng)目。

填寫注意事項(xiàng)

(1)細(xì)致觀察,及時(shí)、準(zhǔn)確、如實(shí)記錄。

(2)準(zhǔn)確說明,層次清晰。

(3)盡量采用專用術(shù)語來說明事物。

(4)外文、符號、公式要準(zhǔn)確,應(yīng)使用統(tǒng)一規(guī)定的名詞和符號。

(5)應(yīng)獨(dú)立完成實(shí)驗(yàn)報(bào)告的書寫,嚴(yán)禁抄襲、復(fù)印,一經(jīng)發(fā)現(xiàn),

以零分論處.

實(shí)驗(yàn)報(bào)告批改說明

實(shí)驗(yàn)報(bào)告的批改要及時(shí)、認(rèn)真、仔細(xì),一律用紅色筆批改。實(shí)驗(yàn)

報(bào)告的批改成績采用百分制,具體評分標(biāo)準(zhǔn)由各院部自行制定。

實(shí)驗(yàn)報(bào)告裝訂要求

實(shí)驗(yàn)批改完畢后,任課老師將每門課程的每個(gè)實(shí)驗(yàn)項(xiàng)目的實(shí)驗(yàn)報(bào)

告以自然班為單位、按學(xué)號升序排列,裝訂成冊,并附上一份該門課程

的實(shí)驗(yàn)大綱。

實(shí)驗(yàn)項(xiàng)目名稱:數(shù)據(jù)的表示實(shí)驗(yàn)學(xué)時(shí):2

同組學(xué)生姓名:無實(shí)驗(yàn)地點(diǎn):

實(shí)驗(yàn)日期:實(shí)驗(yàn)成績:

批改教師:批改時(shí)間:

一、實(shí)驗(yàn)?zāi)康暮鸵?/p>

熟悉數(shù)值數(shù)據(jù)在計(jì)算機(jī)內(nèi)部的表示方式,掌握相關(guān)的處理語句。

二、實(shí)驗(yàn)儀器和設(shè)備

硬件環(huán)境:1A-32

軟件環(huán)境:Linuxubuntul4.04,C語言,gcc

三、實(shí)驗(yàn)內(nèi)容與過程

3實(shí)驗(yàn)內(nèi)容

1.“-2<2”和"-2<2u”的結(jié)果一樣嗎?為什么?請編寫程序驗(yàn)證。

2.運(yùn)行下圖中的程序代碼,并對程序輸出結(jié)果進(jìn)行分析。

3.運(yùn)行下列代碼,并對輸出結(jié)果進(jìn)行分析。

#includc<stdio.h>

voidmain()

(

unionNUM

(

inta;

charb[4];

}num;

num.a=Ox12345678;

printf("Ox%X\n",num.b[2]);

)

4.請說明下列賦值語句執(zhí)行后,各個(gè)變量對應(yīng)的機(jī)器數(shù)和真值各是多少?編寫一

段程序代碼并進(jìn)行編譯,觀察默認(rèn)情況下,編譯器是否報(bào)warningo如果有

warning信息.的話,分析為何會(huì)出現(xiàn)這種warning信息。

inta=2147483648;

intb=-2147483648;

intc=2147483649;

unsignedshortd=65539:

shorte=-32790;

5.編譯運(yùn)行以下程序,并至少重復(fù)運(yùn)行3次。

voidmain()

{

doublex=23.001,y=24.001,z=1.0:

for(inti=0;i<10;i++){

if((y-x)==z)

printf("equal.n");

else

printf("notequal\n");

x+=z;

y+=z;

printf("%d,%f,%f\nni?x,y);

}

)

要求:

(1)給出每次運(yùn)行的結(jié)果截圖。

(2)每次運(yùn)行過程中,是否每一次循環(huán)中的判等結(jié)果都一致?為什么?

(3)每次運(yùn)行過程中,每一次循環(huán)輸出的i、x和y的結(jié)果分別是什么?為什

么?

2、實(shí)驗(yàn)步驟

1.進(jìn)入linux系統(tǒng),在shell終端的提示符后輸入gedit,編寫C語言源程序。

gedit

輸入實(shí)驗(yàn)內(nèi)容1的源程序并以SAMPLE.C為文件名將文件存盤。

2.用GCC對源文件SAMPLE.C進(jìn)行編譯并產(chǎn)生目標(biāo)文件SAMPLE.O,匯編語言

程序SAMPLES

gcc-s-oSAMPLE.SSAMPLE.C

gcc-g-oSAMPLE.OSAMPLE.C

3.用GDB跟蹤執(zhí)行SAMPLE。

ydbSAMPLE

4.觀察程序執(zhí)行情況并記錄運(yùn)行結(jié)果。

5.依照上述四個(gè)步驟,完成對其余實(shí)驗(yàn)內(nèi)容的操作。

四、實(shí)驗(yàn)結(jié)果與分析

(1)

?無標(biāo)起文智1-9?dit忘]40)1650中

打開9)▼尸1W(S)

Uncl.ude<stdtoh>

votdnatn()

n(a,L;

=(-2<2)?1:6;

c=(-2...:2u)?l:0;

pRnlf("%d\ildn".a.e);

)l

純文本了制衣符寬度:8...行8..列2干插入

#include<stdio.h>

voidmain()

(

inta,c;

a=(-2<2)?l:0;

c=(-2<2u)?l:0;

printf("%d\n%d\n",a/c);

)

O—Qysyubuntu;?/vuoyc

yscQubuntucdzuoye

ysc^ubuntu:*/zuoye$gcc-o1l.C

ysc^ubuntu:~/zuoye$./I

ysc0ubuntu:~/zuoye$|

正數(shù)的原碼,反碼,補(bǔ)碼都一樣。而負(fù)數(shù)在計(jì)算機(jī)里是按補(bǔ)碼存放和運(yùn)算的。-2在內(nèi)存中的

存儲(chǔ)方式為1111,1111,1111,1111,11111,11111,1111,111OBBPfffffffeH,最高位為

符號位,2在內(nèi)存中的存儲(chǔ)方式為0000,0000,0000,0000,0000,0000,0000,0010B即

2H,最高位為符號位,2u在內(nèi)存中存儲(chǔ)的方式為0000,0000,0000,0000,0000,

0000,0000,0010B即2H,最高位不再是符號位。所以-2<2是符號位的比較,即-2<2

是正確的。-2<2u是有符號數(shù)和無符號數(shù)之間的比較,此時(shí)編譯器會(huì)把有符號數(shù)自動(dòng)轉(zhuǎn)無符號

數(shù),所以-2=2。

-2<2,是有符號數(shù)的比較,即2+(-2)=fffffffeH+fffffffeH=1FFFFFFFCH=[-4|^,

最高位符號位溢出,所以證明被減數(shù)的符號是負(fù)號,即-2<2是正確的。.

有符號數(shù)和無符號數(shù)的比較。系統(tǒng)會(huì)自動(dòng)把有符號數(shù)轉(zhuǎn)換成無符號數(shù)。

fffffffeH=4294967294D<2D(是錯(cuò)誤的)=2H

gedie量打W?)

打開9)▼網(wǎng)

a.c

MincIude-::stc:lto.h:..

voidnatn()

unsigned廿忱a=l;

unsignedsnortb=1

,l1引i丘—-1;

tntd;

d=(a>c)?l:6;

Printf(lluniSIgnedi.n七tsd\nlhd);

d='b文)1.:o;

pri.nlf(llun5\gnedshorti.swd\n",dl);

9

<>G主文件夫a

xupeng(^xupeng-vlrtual-machine:~/a

xupengSxupeng-virtual-nachtne:-5cd./a

Yup^ng(dYup^ng.vtrtual-narhtn?7~/a$./h

bash:./b:爰有那個(gè)文件或目錄

xupeng@xupeng-vtrtual>machlne:*>/a$./b.o

bash:./b.o:沒有那個(gè)文件或目錄

xupengQxupeng-virtual-nachtne:~/d$gcc-ob

xupen9@xupeng-virtual-nachtne:~/a$.fb

unsignedintis0

unsignedshortts1

xupcng@xupeng-virtual-Rachtne:-/a$1

因?yàn)樗斜萯nt型小的數(shù)據(jù)類型(包括char,signedchacunsignedchanshort,signed

shortunsignedshort)轉(zhuǎn)換為int型。如果轉(zhuǎn)換后的數(shù)據(jù)會(huì)超山int型所能表示的范圍的話,

則轉(zhuǎn)換為unsignedint型;所以題中的c在和a比較時(shí)應(yīng)該先轉(zhuǎn)換成int型,再轉(zhuǎn)換成

unsignedint型,所以此時(shí)的c為1111111111111111111111111111111(1有?守號數(shù)按

最高位符號位進(jìn)行擴(kuò)位)即FFFFFFFFH,此時(shí)的。為1H,顯然c大于。,所以第一次輸

出的是unsignedintisO;同理當(dāng)b和c比較時(shí),c應(yīng)該轉(zhuǎn)換成int型,所以此時(shí)的c為1111

111111111111111111111111111HBFFFFH=-2147483647D,b也應(yīng)該轉(zhuǎn)換成int型,

所以此時(shí)的b為00000000000000000000000000000001B=1D,顯然b>c,所以輸出

unsignedshortis1

#include<stdio.h>

Voidmain()

(

Unsignedinta=1;

Unsignedshortb=l;

Charc=-1;

Intd;

d=(a>c)?l:O;

printf('*unsignedintis%d,n”,d);

d=(b>c)?l:O;

printf(uunsignedintis%dn”,d);

)

(3)

ysc$)ubuntu:~/zuoye

yscgubuntu:~Scdzuoye

ysc^ubuntu:~/zuoyc$gcc-o1l.c

ysc^ubuntu:~/zuoye$./I

1

0

yscgubuntu:*/zuoye$gcc-o22.c

gcc:error:2.c:Nosuchfileordirectory

gcc:fatalerror:noinputfiles

compilationterminated.

ysc^ubuntu:~/zuoye$./2

bash:./2:Nosuchfileordirectory

ysc^ubuntu:~/zuoye$gcc-o22.c

gcc:error:2.c:Nosuchfileordirectory

gcc:fatalerror:noinputfiles

compilationterminated.

yscgubuntu:~/zuoye$gcc-o33.c

ysc^ubuntu:~/zuoye$./3

0x34

ysc^ubuntu:~/zuoye$

由于在union共用體當(dāng)中,intQ和chcrb[4]數(shù)據(jù)公用同一段內(nèi)存地址,而此時(shí)c和b

同時(shí)占用四個(gè)字節(jié),所以當(dāng)執(zhí)行num.。=0x12345678;同時(shí)b也會(huì)被賦值,b的內(nèi)存示意圖

如下:

b的侑87654391

b的地址--------tllQ]----------------blU----------------bl2]----------------143]--------

由上圖可知執(zhí)行printf('6%X\n”,num.b[2]);會(huì)輸出0x34?,F(xiàn)在解釋為什么會(huì)出現(xiàn)表中的情

況對于數(shù)組來說,下標(biāo)越小地址越小,下標(biāo)越大地址越大,而。=0x12345678這個(gè)值中,1

和2分別在最高位和次高位,它就會(huì)存儲(chǔ)在下標(biāo)大的匕[3]中,以此類推,便可以得到表中的

數(shù)據(jù)。這也證明了我的32位Ubuntu是小端存儲(chǔ)(字?jǐn)?shù)據(jù)的高字節(jié)存儲(chǔ)在高地址中,而字

數(shù)據(jù)的低字節(jié)則存儲(chǔ)在低地址中)。

(4)

d.c(-/a)-geditxn制

就打開(O)▼同

CCC.Cd.c

析IlkIuxles:tdio.h;?

)tdI'latn()

intu=2.147483648;

Int:b=-2147483548;

tntc=-2147483549;

unsignedshortd=65539;

shorte=-32790;

pii.ntf("c\n".di:

PrIntf(匕出n":.b);

p六ntf(ll%d\nJ.c:);

prtnif("£d\n":;id);

Ptntf("%d.n".e):

CT特J表符寬臣:8行14,列2

?一值ysc(pubuntu:~/zuoye

inta=2147483648;

4.c:5:3:warning:thisdecimalconstanttsunsignedonlytnisoC90[enable

bydefault]

tntb=-2147483648;

A

4.c:6:3:warning:thisdecimalconstanttsunsignedonlytnISOC90[enable,

bydefault]

intc=-2147483649;

A

4.c:7:3:warning:largeintegerimplicitlytruncatedtounsignedtype[-Wov

rflow]

unsignedshortd*65539;

A

4.c:8:3:warning;overflowininplicitconstantconversion[-Woverflow]

shorte=-32790;

A

ysc@ubuntu:~/zuoye$./4

-Z147483C48

■2147483648

2147483647

3

32746

ysc@ubuntu;?/zuoy?5

#include<stdio.h>

voidmain()

(

inta=2147483648:4個(gè)字節(jié)

intb=-2147483648;

intc=-2147483649;

unsignedshortd=65539;2個(gè)字節(jié)

shorte=-32790;2個(gè)字節(jié)

printf("%d\n",a):

printf("%d\n"zb);

printf("%d\n”,c);

printf("%d\n",d);

printf("%d\n"ze);

)

機(jī)器數(shù)就是數(shù)字在計(jì)算機(jī)中的二進(jìn)制表示形式,其特點(diǎn)一是符號數(shù)字化,二是

其數(shù)的大小受機(jī)器字長的限制。將帶符號位的機(jī)器數(shù)對應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值

inta=2147483648的機(jī)器數(shù)是10000000000000000000000000000000B

intb=2147483648的機(jī)器數(shù)是10000000000000000000000000000000B

intc=2147483649的機(jī)器數(shù)是10000000000000000000000000000001B

unsignedshortd=65539的機(jī)器數(shù)無法表示

shorte=-32790的機(jī)器數(shù)無法表示

int類型在32位計(jì)算機(jī)中占4個(gè)字節(jié),即32位。又因?yàn)檎龜?shù)的補(bǔ)碼是其本身,所以int

類型能表示的所有正數(shù)為:0,0000000000000000000000000000000B至IJ0,1111111

111111111111111111111111010至IJ+2147483647。而負(fù)數(shù)的補(bǔ)碼是除符號位外各

位取反最后加一而來。所以int類型所能表示的所有負(fù)數(shù)為:0,0000000000000000000

000000000000B(-0D的補(bǔ)碼)到1,111111111111111111111111111111BPB0到

-2147483647D。而32位二進(jìn)制數(shù)能表示的所有值為2的32次方個(gè),而從

-2147483647D至卜2147483647D總共是2的32次方減一個(gè)數(shù),而少的這個(gè)數(shù)就是

10000000000000000000000000000000B(-0D的補(bǔ)碼),而任何數(shù)的原碼都不能在

轉(zhuǎn)換成補(bǔ)碼時(shí)成為這個(gè)數(shù),我們?nèi)藶榈陌阉?guī)定為-2147483648所以int類型的取值范圍

為-2147483648到+2147483647,所以題目中的b是正確的,并且不會(huì)發(fā)生溢出。

而題目中的a=2147483648其實(shí)已經(jīng)超出int類型的最大范圍,但是

a=2147483648=2147483647+1=0,1111111111111111111111111111111B+1B=1000

0000000000000000000000000000B=-2147483648,而-2147483648又在Int類型

的取值范圍內(nèi),所以也不會(huì)溢出,如果此時(shí)打印輸出a的十進(jìn)制就是-2147483648,同

理可得c=2147483649=2147483647+2=-2147483647,也不會(huì)發(fā)生溢出現(xiàn)象。

對于題FI中的d,由于它是無符號短整型的變量,在32位機(jī)中占兩個(gè)字節(jié)。所以d的取

值范圍為:0到65535,而65539不在這個(gè)范圍內(nèi),所以會(huì)報(bào)溢出警告。對于題目中

的e,由于它是有符號短整型的變量,在32位機(jī)中占兩個(gè)字節(jié)。所以e的取值

范圍為:-32768至IJ+32767,此時(shí)c=-32790=-32768-22=-32768+(-22)=

10000000000000000000000000000000B+1111111111111111111111111110

1001B=000101111111111111111111111111101001B=+6442450921D?+32767?

以e會(huì)報(bào)出溢出警告。

5.

Doub加雙精度浮點(diǎn)數(shù),按照IEEE-754標(biāo)準(zhǔn),雙精度浮點(diǎn)數(shù)有效數(shù)字到小數(shù)點(diǎn)后15位,

x=23001,可表示為2300100000000001:y=24001000000000001;

31.001會(huì)表示成31.001000000000001,32.001會(huì)表示成32.001000000000005,于是就不相等

了。結(jié)尾的那個(gè)1或5都是由于有限精度無法精確的小數(shù)造成的,

(1)

A

$)ubuillu.?/,uuyH

o55.c

equaiHHIHHHHIiHII

I?5_|QO1OO3,?6_0()1(X)5

CcllKlI

26.0GI0()0KMX)

3,Z7.001003,28.(X)100C

hqiuil|

M)l()()?9-00100C

□01(001加

001009,31.00100(:

\31.0()1(X)3.32.()0100(:

,Lieciii

8.32.|O()1OO^I

9,33.1()1003,卜由OOI

ysc@ubunlu:"/zuoy心

9,33-(X)1()0()-091

/sc@ubuntu;1uoyeS

I.24.('J0l000”乙

25.(X)IOCX).26.()91()(]

001000.27

GI000.28.09I(

)010()0129.

)01000,

30.06IOOf.1,3ICTTi9

061000,32-09100

001(X)0.33.00皿

33?01000,3493Q

c@ubuntu:zuoye|

?-6ysc(3)ubuntu:~/zuoye

equal

9,33.001600,34.001000

ysc^ubuntu:~/zuoye$./5

equal

0,24.091000,25.001000

equal

1,25.001000,26.001000

equal

2,26.091600.27.001000

equal

3,27.001606,?8.901000

equal

4,28.091000,29.901000

equal

5,29.001000,30.901606

equal

6,30.091600,31.901000

equal

7,31.001600,32.901000

notequal

8,32.001000,33.001000

equal

9,33.001000,34.001000

(2)

每次運(yùn)行過程中,每一次循環(huán)輸出的i、x和v的結(jié)果分別是

i=0,x=24,00by=25.001;

i=bx=25.001,y=26.001

i=2,x=26.001,y=27.001

i=3,x=27.001zy=28.001

i=4,x=28.001zy=29.001

i=5,x=29.001,y=30.001

i=6.x=30.001,y=31.001

i=7/x=31.00Ly=32.001

i=8zx=32.001,y=33.001

i=9zx=33.001zy=34.001

五、實(shí)驗(yàn)思考題和實(shí)驗(yàn)心得。

1、思考題

1.完成書上第二章習(xí)題中第40題,提交代碼,并在程序中以十六進(jìn)制形式打印變

量u的機(jī)器數(shù)。

floatfpower2(intx)

unsignedexp,frac,u;

if(x<-149)

(

exp=O;

frac=O;

)

elseif(x<-126)

(

exp=0;

frac=0x400000?(-x-127);

)

elseif(x<128)

(

exp=x+127;

frac=0;

)

else{

exp=255;

frac=0;

)

u=exp?23||frac;

returnu2f(u);

)

2、實(shí)驗(yàn)心得

了解了linux的基本糜作。理解了編譯執(zhí)行,反編譯的過程和操作步驟。理解了當(dāng)計(jì)算

機(jī)面對C語言時(shí),計(jì)算機(jī)是如何表示和編譯的。我們可以查看編譯過程來了解計(jì)算機(jī)的思

想。

還需繼續(xù)努力。

實(shí)驗(yàn)項(xiàng)目名稱:挑俅.程序的編相編暹和調(diào)試實(shí)驗(yàn)學(xué)時(shí):2

同組學(xué)生姓名:無實(shí)驗(yàn)地點(diǎn):

實(shí)驗(yàn)日期:實(shí)驗(yàn)成績:

批改教師:批改時(shí)間:

一、實(shí)驗(yàn)?zāi)康暮鸵?/p>

熟悉開發(fā)環(huán)境、掌握開發(fā)和調(diào)試的基本過程以及工具。

二、實(shí)驗(yàn)儀器和設(shè)備

硬件環(huán)境:IA-32

軟件環(huán)境:Linuxubuntuld.04,C語言,gcc

三、實(shí)驗(yàn)過程

1、實(shí)驗(yàn)內(nèi)容

以卜程序?qū)崿F(xiàn)了排序和求和算法,程序源碼如卜.圖所示。請根據(jù)提供的圖片輸入源

程序文件,并保存為相應(yīng)的,c和.h文件,然后遂行編譯、鏈接,調(diào)試。bubblcsort.h:

1#include<stdio.h>

voidbubblesort(ints[],int|n);

bubblesort.c:

1#include"bubblesort.hn

2-voidbubblesort(ints[],intn){

3inti

4for(i=0;i<n;i++){

for(j=0;j<n-l-i;j++){

6if(s[j]>s[j+l]){

7t=s[j];

s[j]=s[j+l];

9s[j+l]=t;

10}

11}

12}

13[)

add.h:

1#include<stdio.h>

2intadd(intn);

add.c:

1#includeHadd.h"

2-intadd(ints[],intn){

intresult=0;

4inti;

for(i=0;i<n;i++){

6result+=s[i];

7}

returnresult;

9}

priniresult.h:

1#include<stdio.h>

2voidprintArray(ints[]^intn^char*str);|

printresult.c:

1#include"printresult.h"

2-voidprintArray(ints[],intn,char*str){

3printf("%s",str);

4inti;

5for(i=0;i<n;i++){

6printf("%5d",s[i]);

7}

8printf("\nn);

9)1

rnain.c;

1#include"add-h*'

2#include"bubblesort.h"

3#include"printresult.h"

4#defineboolchar

5#definetrue1

6#definefalse0

7-voidmain(){

8inta[10],i;

9intb[10];

10printf(“請輸入個(gè)數(shù)據(jù):;

11for(i=0;i<10;i++){

12scanf("%d",&a[i]);

13b[i]=a[i];

14}

15boolflag=true;

16while(flag==true){

17printf("\nl.冒泡排序\n2.求和

18printf(“\n請選擇序號:”力

19intnumber=0;

20scanf("%d'\&number);

21intsum=0;

22switch(number)

23{

24case1:

25bubblesort(a,10);

26break;

27case2:

28sum=add(a,10);

29printf(“\n數(shù)說求和結(jié)果為:%5d\n",sum);

30break;

31case3:

32prirrtArray(b,T6J\n原始數(shù)組為:");

33prirrtArray(a,10,”\ri排序后數(shù)組為:”);

34break:

case4:

36flag=false;

37break;

default:

39Pin"(”\n請選擇正確醵曼1遁繼續(xù)J");

40break;

41}

42}

43printf("\n");

44}

冒泡排序求和打印結(jié)果退出

請選擇序號

原始數(shù)組為

數(shù)組求和結(jié)果為

排序后數(shù)組為

請選擇正確的序號!請繼續(xù)!

2、實(shí)驗(yàn)步驟

1.進(jìn)入linux系統(tǒng),在shell終端的提示符后輸入gedit,編寫C語言源程序。

2.將源程序文件進(jìn)行預(yù)處理、編譯、匯編和鏈接,以生成可執(zhí)行文件。

⑴使用gcc直接生成可執(zhí)行文件

gcc-omainmain.cbubblesort.cadd.cprintresult.c

(2)首先生成可重定位目標(biāo)文件(.。文件),再鏈接成可執(zhí)行文件。

首先,使用gccy……命令將所有.c文件編譯成.。文件(可以用-。選項(xiàng)命

名輸出的可重定位目標(biāo)文件),然后再用Id命令進(jìn)行鏈接,以生成可執(zhí)行目標(biāo)

文件。

(用Id命令鏈接時(shí)要包含很多系統(tǒng)庫,可以用gcc-vmain.c來查看系統(tǒng)鏈接

需要哪些庫,把collect2換成Id,生成的/tmp/ccBCUOrh.o即為mian.c編譯出

來的main.。文件,刪掉該句替換成以下命令:-omainmain.obubblesort.。

add.oprintresult.o-emain)

Id-omainmain.obubblesort.oadd.oprintresult.o-emain—sysroot=/-build-id—eh-frame-hdr-m

elCi386—hash-style=gnu-as-needed-dynamic-linker/lib/ld-linux.so.2-zrelro

/usr/lib/gcc/i686-linux-gr.u/4.8/../-7-/i386-linux-gnu/crtl.o

/usr/lib/gcc/i686-linux-gru/4.8i386-linux-gnu/crti.o

/usr/lib/gcc/i686-linux-gnu/4.8/crtbegin.o-L/usr/lib/gcc/i686-linux-gnu/4.8

-L/usr/lib/gcc/i686-linux-gnu/4.8/../-7--/i386-linux-gnu

-L/usr/lib/gcc/i686-linux-gnu/4.8/../../lib-L/lib/i386-linux-gnu-L/lib/../lib

-L/usr/lib/i386-linux-gnu-L/usr/lib/../lib-L/usr/lib/gcc/i686-linux-gnu/4.8/../?■/--lgcc-as-needed

-lgcc_s—no-as-needed-1c-Igcc-as-needed-lgcc_s—no-as-needed

/usr/lib/gcc/i686-linux-gnu/4.8/crtend.o/usr/lib/gcc/i686-iinux-gnu/4.8/../--/--/i386-linux-gnu/crtn.o

上述過程如下圖所示:

ericson@ericson-virtual-machine:~/wenjian3$gcc-cmain.c

ertcson@ertcson-virtual-machine:~/wenjian3$gcc-cbubblesort.c

ericson@ericson-virtual-machine:~/wenjian3$gcc-cadd.c

ertcson@ertcson-virtual-machine:~/wenjian3$gcc-cprtntresult.c

ericson@ericson-virtual-machine:~/wenjian3$Id-omainmain.obubblesort.oadd.o

printresult.o-enatn--sysroot=/--build-id--eh-frame-hdr-melf_t3B6--hash-

style=gnu--as-needed-dynamic-linker/lib/ld-Iinux.so.2-zrelro/usr/lib/gcc/i

686-linux-gnu/4.8/../../../1386-Linux-gnu/crrl.o/usr/lib/gcc/i686-ltnux-gnu/4.8

/../../../i386-linux-gnu/crti.o/usr/lib/gcc/i686-linux-gnu/4.8/crtbegin.o-L/us

r/ltb/gcc/t686-ltnux-gnu/4.8-L/usr/lib/gcc/i686-linux-gnu/4.8/../../../t386-l.in

ux-gnu-L/usr/lib/gcc/i686-linux-gnu/4.8/../lib-L/lib/i386-linux-gnu-

L/ltb/../lib-L/usr/ltb/t386-linux-gnu-L/usr/ltb/../lib-L/usr/ltb/gcc八686-ltn

ux-gnu/4.8/../../..-Igcc--as-needed-lgcc_s--no-as-needed-1c-Igcc--as-need

ed-lgcc_s--no-as-needed/usr/ltb/gcc/1686-linux-gnu/4.8/crtend.o/usr/lib/gcc/

t686-ltnux-gnu/4.8/..八386-ltnux-gnu/c「tn.o

ertcson@ertcson-virtual-machine:~/wenjian3$./main

請輸入1。個(gè)數(shù)據(jù):

10987654321

1.冒泡排序

2.求和

3.打印排序結(jié)果______________________________________________________________________

3.使用OBJDUMF命令進(jìn)行反匯編(請自行查閱OBJDUMP命令的使用方法)

例如,可使用“objdump-S''命令進(jìn)行反匯編

objdump-Smain.o:將main.o進(jìn)行反匯編

4.使用GDB命令進(jìn)行各種調(diào)試(GDB命令參見教材附錄C,也可自行查閱區(qū)上相

關(guān)文檔)

調(diào)試之前首先用“gcc-g”命令生成調(diào)試信息,否則調(diào)試失敗。

gcc-g-orrainmain.cbubblesort.cadd.cprintresult.c

gdbmain

要求用各種GDB命令對程序進(jìn)行調(diào)試(例如用inforegisters杳看寄存器內(nèi)

容)。

四、實(shí)驗(yàn)結(jié)果與分析

1.編寫相應(yīng)的.c和.h文件

?incl

void

linti

forfi

add.cadd.hbubblesort.c

?incl#incl

void?incl

#incl

bubblesorthmainmain.c

tineI-#incl

voidvoid

Rrint

inti

printresult.cprintresult.h

2.使用gcc直接生成可執(zhí)行文件

-Cwyx@ubuntu:?/1

@ubuntu:*$cd./I

@ubuntu:~/l$gcc-onain.onatn.cbubblesort.cprintresult.c|

ubuntu:~/l$gcc-omainmain.oadd.obubblesort.oprtntresult.o|

tinclItfinEI:-I?incl

inta1intavoid

intrliti

inti

add.cadd.hbubblesort.c

?incl-

find

void

?incl

令#incl

bubblesart.hmalnimaln.c

print戊sult.ltPFintrwult.h

3.運(yùn)行main結(jié)果

4.使用OBJDUMP命令進(jìn)行反匯編

naIn.foniHgilE^

0x4(%csp),%cd

s()xfffffff()?i;esp

-0x4(%ecx)^^B

,'"'、12!chi

勸x74,e

句s:0x14,cax

%eax|.-e|xc(%ebp

IsOxc::1%esp^^^H

so

[lai..n+0x2

$0xiog^j

賃勸,-6x64(%ebp)

5.使用GDB命令進(jìn)行各種調(diào)試.調(diào)試之前首先用“gcc-g”命令生成調(diào)試信

gcc-g-omainnain.cbubblesort,cadd.cprintresult,c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論