版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來五年河蚌種苗企業(yè)ESG實(shí)踐與創(chuàng)新戰(zhàn)略分析研究報(bào)告
- 抹灰施工中工藝變更管理方案
- 未來五年食用益生菌制品企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報(bào)告
- 未來五年鍵盤鼠標(biāo)企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報(bào)告
- 未來五年導(dǎo)游服務(wù)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略分析研究報(bào)告
- 橋梁施工風(fēng)險(xiǎn)評估與應(yīng)對方案
- 抹灰施工中新材料應(yīng)用研究方案
- 2025年一級注冊建筑師考試題庫500道及完整答案(網(wǎng)校專用)
- 2024年惠來縣招教考試備考題庫含答案
- 2026年南寧市明秀東路小學(xué)教育集團(tuán)春季學(xué)期編外教師招聘若干人備考題庫附答案
- 2026年湖南民族職業(yè)學(xué)院單招綜合素質(zhì)筆試備考試題附答案詳解
- 全球AI應(yīng)用平臺市場全景圖與趨勢洞察報(bào)告
- 2026.05.01施行的中華人民共和國漁業(yè)法(2025修訂)課件
- 維持性血液透析患者管理
- 2025年大學(xué)大四(臨床診斷學(xué))癥狀鑒別診斷試題及答案
- 解除勞動(dòng)合同證明電子版(6篇)
- 呼吸科規(guī)培疑難病例討論
- 基于PLC控制的小型鉆床機(jī)械設(shè)計(jì)
- DB11T 290-2005山區(qū)生態(tài)公益林撫育技術(shù)規(guī)程
- 開放大學(xué)(原電視大學(xué))行政管理實(shí)務(wù)期末復(fù)習(xí)資料所有單
- 特種設(shè)備安全檢查臺賬
評論
0/150
提交評論