《計(jì)算機(jī)組成原理》第2章 計(jì)算機(jī)語(yǔ)言_第1頁(yè)
《計(jì)算機(jī)組成原理》第2章 計(jì)算機(jī)語(yǔ)言_第2頁(yè)
《計(jì)算機(jī)組成原理》第2章 計(jì)算機(jī)語(yǔ)言_第3頁(yè)
《計(jì)算機(jī)組成原理》第2章 計(jì)算機(jī)語(yǔ)言_第4頁(yè)
《計(jì)算機(jī)組成原理》第2章 計(jì)算機(jī)語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩115頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

目前使用或曾經(jīng)使用本教材國(guó)內(nèi)高校浙江大學(xué)、武漢大學(xué)、東華理工大學(xué)、北京大學(xué)、上海交通大學(xué)、電子科技大學(xué)、吉林大學(xué)、北京師范大學(xué)、中央財(cái)經(jīng)大學(xué)、華東師范大學(xué)、中國(guó)地質(zhì)大學(xué)、哈爾濱工業(yè)大學(xué)、合肥工業(yè)大學(xué)、中山大學(xué)、重慶大學(xué)、太原科技大學(xué)、北京科技大學(xué)、西北工業(yè)大學(xué)

等Chapter2指令:計(jì)算機(jī)的語(yǔ)言本章概要計(jì)算機(jī)硬件的操作計(jì)算機(jī)硬件的操作數(shù)有符號(hào)和無(wú)符號(hào)數(shù)計(jì)算機(jī)中指令的表示邏輯操作決策指令計(jì)算機(jī)硬件對(duì)過(guò)程的支持人機(jī)交互MIPS中32位立即數(shù)和地址的尋址并行與指令:同步翻譯并執(zhí)行程序以一個(gè)C排序程序?yàn)槔龜?shù)組與指針Chapter2—Instructions:LanguageoftheComputer—3類別指令I(lǐng)nstruction示例含義注釋算術(shù)加法addadd$s1,$s2,$s3$s1=$s2+$s3三個(gè)寄存器操作數(shù)減法subtractsub$s1,$s2,$s3$s1=$s2-$s3三個(gè)寄存器操作數(shù)立即數(shù)加法addimmediateaddi$s1,$s2,20$s1=$s2+20加常數(shù)類別指令I(lǐng)nstruction示例含義注釋取數(shù)

取字loadwordlw$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存字寄存器取半字loadhalflh$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存半字寄存器取無(wú)符號(hào)半字loadhalfunsignedlhu$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存半字寄存器取字節(jié)loadbytelb$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存字節(jié)寄存器取鏈接字loadlinkedwordll$s1,20($s2)$s1=Memory[$s2+20]取字作為原子交換的前半部取立即數(shù)的高位loadupperimmediatelui$s1,20$s1=20×216取常數(shù)并放到高16位存數(shù)存字storewordsw$s1,20($s2)Memory[$s2+20]=$s1寄存器字內(nèi)存存半字storehalfsh$s1,20($s2)Memory[$s2+20]=$s1寄存器半字內(nèi)存存字節(jié)storebytesb$s1,20($s2)Memory[$s2+20]=$s1寄存器字節(jié)內(nèi)存存條件字storeconditionwordsc$s1,20($s3)Memory[$s2+20]=$s1

$s1=0or1存字作為原子交換的后半部類別指令I(lǐng)nstruction示例含義注釋邏輯與andand$s1,$s2,$s3$s1=$s2&$s3三個(gè)寄存器操作數(shù)按位與或oror$s1,$s2,$s3$s1=$s2|$s3三個(gè)寄存器操作數(shù)按位或或非nornor$s1,$s2,$s3$s1=~($s2|$s3)三個(gè)寄存器操作數(shù)按位或非立即數(shù)與andimmediateand$s1,$s2,20$s1=$s2&20和常數(shù)按位與立即數(shù)或orimmediateor$s1,$s2,20$s1=$s2|20和常數(shù)按位或邏輯左移shiftleftlogicalsll$s1,$s2,10$s1=$s2<<10根據(jù)常數(shù)左移相應(yīng)位邏輯右移shiftrightlogicalsrl$s1,$s2,10$s1=$s2>>10根據(jù)常數(shù)右移相應(yīng)位類別指令I(lǐng)nstruction示例含義注釋條件分支相等時(shí)跳轉(zhuǎn)branchonequalbeq$s1,$s2,25if($s1=$s2)gotoPC+4+100相等檢測(cè);

和PC相關(guān)的跳轉(zhuǎn)不相等時(shí)跳轉(zhuǎn)branchonnotequalbne$s1,$s2,25if($s1!=$s2)gotoPC+4+100不相等檢測(cè);

和PC相關(guān)的跳轉(zhuǎn)小于時(shí)置位setonlessthanslt$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比較是否小于:無(wú)符號(hào)數(shù)比較小于時(shí)置位setonlessthanunsignedsltu$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比較是否小于無(wú)符號(hào)數(shù)無(wú)符號(hào)數(shù)比較小于立即數(shù)時(shí)置位setlessthanimmediateslti$s1,$s2,20if($s2<20)$s1=1else$s1=0比較是否小于常數(shù)無(wú)符號(hào)數(shù)比較小于無(wú)符號(hào)立即數(shù)時(shí)置位setlessthanimmediateunsignedsltiu$s1,$s2,20if($s2<20)$s1=1else$s1=0比較是否小于無(wú)符號(hào)常數(shù)Chapter2—Instructions:LanguageoftheComputer—4類別指令I(lǐng)nstruction示例含義注釋算術(shù)加法addadd$s1,$s2,$s3$s1=$s2+$s3減法subtractsub$s1,$s2,$s3$s1=$s2-$s3三個(gè)寄存器操作數(shù)立即數(shù)加法addimmediateaddi$s1,$s2,20$s1=$s2+20加常數(shù)取數(shù)

取字loadwordlw$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存字寄存器取半字loadhalflh$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存半字寄存器取無(wú)符號(hào)半字loadhalfunsignedlhu$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存半字寄存器取字節(jié)loadbytelb$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存字節(jié)寄存器取鏈接字loadlinkedwordll$s1,20($s2)$s1=Memory[$s2+20]取字作為原子交換的前半部取立即數(shù)的高位loadupperimmediatelui$s1,20$s1=20×216取常數(shù)并放到高16位存數(shù)存字storewordsw$s1,20($s2)Memory[$s2+20]=$s1寄存器字內(nèi)存存半字storehalfsh$s1,20($s2)Memory[$s2+20]=$s1寄存器半字內(nèi)存存字節(jié)storebytesb$s1,20($s2)Memory[$s2+20]=$s1寄存器字節(jié)內(nèi)存存條件字storeconditionwordsc$s1,20($s3)Memory[$s2+20]=$s1

$s1=0or1存字作為原子交換的后半部邏輯與andand$s1,$s2,$s3$s1=$s2&$s3三個(gè)寄存器操作數(shù)按位與或oror$s1,$s2,$s3$s1=$s2|$s3三個(gè)寄存器操作數(shù)按位或或非nornor$s1,$s2,$s3$s1=~($s2|$s3)三個(gè)寄存器操作數(shù)按位或非立即數(shù)與andimmediateand$s1,$s2,20$s1=$s2&20和常數(shù)按位與立即數(shù)或orimmediateor$s1,$s2,20$s1=$s2|20和常數(shù)按位或邏輯左移shiftleftlogicalsll$s1,$s2,10$s1=$s2<<10根據(jù)常數(shù)左移相應(yīng)位邏輯右移shiftrightlogicalsrl$s1,$s2,10$s1=$s2>>10根據(jù)常數(shù)右移相應(yīng)位條件分支相等時(shí)跳轉(zhuǎn)branchonequalbeq$s1,$s2,25if($s1=$s2)gotoPC+4+100相等檢測(cè);

和PC相關(guān)的跳轉(zhuǎn)不相等時(shí)跳轉(zhuǎn)branchonnotequalbne$s1,$s2,25if($s1!=$s2)gotoPC+4+100不相等檢測(cè);

和PC相關(guān)的跳轉(zhuǎn)小于時(shí)置位setonlessthanslt$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比較是否小于:無(wú)符號(hào)數(shù)比較小于時(shí)置位setonlessthanunsignedsltu$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比較是否小于無(wú)符號(hào)數(shù)無(wú)符號(hào)數(shù)比較小于立即數(shù)時(shí)置位setlessthanimmediateslti$s1,$s2,20if($s2<20)$s1=1else$s1=0比較是否小于常數(shù)無(wú)符號(hào)數(shù)比較小于無(wú)符號(hào)立即數(shù)時(shí)置位setlessthanimmediateunsignedsltiu$s1,$s2,20if($s2<20)$s1=1else$s1=0比較是否小于無(wú)符號(hào)常數(shù)無(wú)條件跳轉(zhuǎn)跳轉(zhuǎn)jumpj2500goto10000跳轉(zhuǎn)到目標(biāo)地址跳轉(zhuǎn)至寄存器所指位置jumpregisterjr$ragoto$ra用于switch語(yǔ)句,以及過(guò)程調(diào)用跳轉(zhuǎn)并鏈接jumpandlinkjal2500$ra=PC+4;goto10000用于過(guò)程調(diào)用Chapter2—Instructions:LanguageoftheComputer—5指令集一臺(tái)計(jì)算機(jī)的全部指令不同計(jì)算機(jī)有不同的指令集但有許多共同的方面指令集目標(biāo)方便硬件、編譯器的設(shè)計(jì)性能最佳、成本和功耗最低早期計(jì)算機(jī)有很簡(jiǎn)單的指令集實(shí)現(xiàn)簡(jiǎn)單許多現(xiàn)代計(jì)算機(jī)也有簡(jiǎn)單指令集例如:ARM系列計(jì)算機(jī)(RSIC)§2.1IntroductionChapter2—Instructions:LanguageoftheComputer—6MIPS指令集用于編寫(xiě)書(shū)中的例子使用的是MIPS語(yǔ)言斯坦福大學(xué)的MIPS來(lái)自MIPS公司()在嵌入式處理機(jī)市場(chǎng)中占有很大的份額廣泛地應(yīng)用在家用電器、網(wǎng)絡(luò)/存儲(chǔ)設(shè)備,照相機(jī),打印機(jī)…許多現(xiàn)代指令集的代表參見(jiàn)MIPS參考數(shù)據(jù)卡和附錄B和E。ThefinalISAshowdown:IsARM,x86,orMIPSintrinsicallymorepowerefficient?Chapter2—Instructions:LanguageoftheComputer—7MIPS操作數(shù)名字舉例寄存器號(hào)注釋32個(gè)寄存器$zero0常數(shù)0$at1匯編器保留$v0~$v12-3計(jì)算結(jié)果和表達(dá)式求值$a0~$a34-7參數(shù)$t0~$t78-15臨時(shí)變量$s0~$s716-23保留寄存器$t8~$t924-25更多臨時(shí)變量$k0~$k126-27操作系統(tǒng)保留$gp28全局指針$sp29棧指針$fp30幀指針$ra31返回地址230

個(gè)存儲(chǔ)器字Memory[0],Memory[4],…,Memory[4294976292]Chapter2—Instructions:LanguageoftheComputer—8Chapter2—Instructions:LanguageoftheComputer—9算術(shù)運(yùn)算操作加法和減法,都是三操作數(shù)兩個(gè)源操作數(shù),一個(gè)目的操作數(shù) adda,b,c#a=b+c注釋用#開(kāi)頭所有的算術(shù)運(yùn)算都是這樣的形式設(shè)計(jì)原則一:簡(jiǎn)單源于規(guī)整規(guī)整使實(shí)現(xiàn)簡(jiǎn)單簡(jiǎn)單能獲得低成本高性能§2.2OperationsoftheComputerHardware類別指令I(lǐng)nstruction示例含義注釋算術(shù)加法addadd$s1,$s2,$s3$s1=$s2+$s3三個(gè)寄存器操作數(shù)減法subtractsub$s1,$s2,$s3$s1=$s2-$s3三個(gè)寄存器操作數(shù)立即數(shù)加法addimmediateaddi$s1,$s2,20$s1=$s2+20加常數(shù)Chapter2—Instructions:LanguageoftheComputer—10算術(shù)操作例子C語(yǔ)言的語(yǔ)句: f=(g+h)-(i+j);編譯成MIPS代碼: addt0,g,h#臨時(shí)變量t0=g+h

addt1,i,j#臨時(shí)變量t1=i+j

subf,t0,t1#f=t0-t1Chapter2—Instructions:LanguageoftheComputer—11寄存器操作數(shù)算術(shù)運(yùn)算指令使用寄存器操作MIPS有32個(gè)32位寄存器用于存儲(chǔ)頻繁使用的數(shù)據(jù)編號(hào)0到3132位數(shù)碼稱為一個(gè)字編譯時(shí)名稱的約定$t0,$t1,…,$t9表示臨時(shí)寄存器$s0,$s1,…,$s7用于存儲(chǔ)變量設(shè)計(jì)原則二:越少越快對(duì)照主存:數(shù)以百萬(wàn)計(jì)的存儲(chǔ)位置§2.3OperandsoftheComputerHardware舉例寄存器號(hào)注釋$zero0常數(shù)0$at1匯編器保留$v0~$v12-3計(jì)算結(jié)果和表達(dá)式求值$a0~$a34-7參數(shù)$t0~$t78-15臨時(shí)變量$s0~$s716-23保留寄存器$t8~$t924-25更多臨時(shí)變量$k0~$k126-27操作系統(tǒng)保留$gp28全局指針$sp29棧指針$fp30幀指針$ra31返回地址Chapter2—Instructions:LanguageoftheComputer—12寄存器操作數(shù)舉例C語(yǔ)言編寫(xiě)的代碼: f=(g+h)-(i+j);f,…,jin$s0,…,$s4編譯成MIPS代碼: add$t0,$s1,$s2

add$t1,$s3,$s4

sub$s0,$t0,$t1Chapter2—Instructions:LanguageoftheComputer—13存儲(chǔ)器操作數(shù)主存可以存儲(chǔ)復(fù)雜數(shù)據(jù)數(shù)組,結(jié)構(gòu),動(dòng)態(tài)數(shù)據(jù)使用算術(shù)運(yùn)算操作數(shù)從主存把數(shù)讀入到寄存器把結(jié)果從寄存器存儲(chǔ)到主存存儲(chǔ)器按字節(jié)編址每個(gè)地址表示一個(gè)8位字節(jié)按字存放在內(nèi)存每個(gè)地址必須是4個(gè)字節(jié)MIPS按大端編址高位存放在低地址對(duì)照小端模式:低位放到低地址地址偏移大端模式小端模式0x0012(OP0)34(OP1)0x0134(OP1)12(OP0)如果將一個(gè)16位的整數(shù)0x1234存放到一個(gè)短整型變量(short)中。這個(gè)短整型變量在內(nèi)存中的存儲(chǔ)在大小端模式由下表所示。Chapter2—Instructions:LanguageoftheComputer—14類別指令I(lǐng)nstruction示例含義注釋取數(shù)

取字loadwordlw$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存字寄存器取半字loadhalflh$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存半字寄存器取無(wú)符號(hào)半字loadhalfunsignedlhu$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存半字寄存器取字節(jié)loadbytelb$s1,20($s2)$s1=Memory[$s2+20]內(nèi)存字節(jié)寄存器取鏈接字loadlinkedwordll$s1,20($s2)$s1=Memory[$s2+20]取字作為原子交換的前半部取立即數(shù)的高位loadupperimmediatelui$s1,20$s1=20×216取常數(shù)并放到高16位存數(shù)存字storewordsw$s1,20($s2)Memory[$s2+20]=$s1寄存器字內(nèi)存存半字storehalfsh$s1,20($s2)Memory[$s2+20]=$s1寄存器半字內(nèi)存存字節(jié)storebytesb$s1,20($s2)Memory[$s2+20]=$s1寄存器字節(jié)內(nèi)存存條件字storeconditionwordsc$s1,20($s3)Memory[$s2+20]=$s1

$s1=0or1存字作為原子交換的后半部Chapter2—Instructions:LanguageoftheComputer—15存儲(chǔ)器操作數(shù)舉例1Ccode: g=h+A[8];g在$s1,h在$s2,A的基址在$s3編譯成MIPS代碼:小標(biāo)8(數(shù)組第8個(gè)分量)需要32的偏移每個(gè)字對(duì)應(yīng)4個(gè)字節(jié) lw$t0,32($s3)#loadword

add$s1,$s2,$t0偏移量offset基址寄存器BaseregisterChapter2—Instructions:LanguageoftheComputer—16存儲(chǔ)器操作數(shù)舉例2Ccode: A[12]=h+A[8];hin$s2,baseaddressofAin$s3CompiledMIPScode:Index8requiresoffsetof32 lw$t0,32($s3)#loadword

add$t0,$s2,$t0

sw$t0,48($s3)#storewordChapter2—Instructions:LanguageoftheComputer—17寄存器和主存儲(chǔ)器寄存器的訪問(wèn)速度比主存快得多對(duì)主存儲(chǔ)器數(shù)據(jù)的操作要用取數(shù)指令lw(loadword)存數(shù)指令sw(storeword)。需要執(zhí)行更多的指令編譯器必須盡量使用寄存器訪問(wèn)變量?jī)H當(dāng)寄存器不夠用時(shí)才把不經(jīng)常使用的變量放到內(nèi)存;寄存器的高效利用對(duì)系統(tǒng)優(yōu)化非常重要。Chapter2—Instructions:LanguageoftheComputer—18常數(shù)或立即數(shù)操作數(shù)指令中使用常數(shù) addi$s3,$s3,4(immediate)沒(méi)有減去立即數(shù)的減法指令可以使用負(fù)常數(shù),即“加負(fù)數(shù)”實(shí)現(xiàn)減法 addi$s2,$s1,-1設(shè)計(jì)規(guī)則三:加速執(zhí)行常用操作小常數(shù)操作出現(xiàn)的頻率高立即數(shù)操作不用到內(nèi)存取數(shù)Chapter2—Instructions:LanguageoftheComputer—19常數(shù)零MIPS寄存器0($zero)表示常數(shù)0不能被改寫(xiě)在常用的操作中,很有用例如,可在寄存器之間傳送數(shù)據(jù)

add$t2,$s1,$zeroChapter2—Instructions:LanguageoftheComputer—20二進(jìn)制無(wú)符號(hào)整數(shù)給定一個(gè)n位數(shù)范圍:0to+2n–1舉例000000000000000000000000000010112

=0+…+1×23+0×22+1×21+1×20

=0+…+8+0+2+1=111032位數(shù)0to+4,294,967,295§2.4SignedandUnsignedNumbersChapter2—Instructions:LanguageoftheComputer—21二進(jìn)制補(bǔ)碼表示有符號(hào)整數(shù)x是一個(gè)n位數(shù)范圍:–2n–1to+2n–1–1舉例111111111111111111111111111111002

=–1×231+1×230+…+1×22+0×21+0×20

=–2,147,483,648+2,147,483,644=–41032位數(shù)–2,147,483,648to+2,147,483,647Chapter2—Instructions:LanguageoftheComputer—22二進(jìn)制補(bǔ)碼表示有符號(hào)整數(shù)31位是符號(hào)位1表示負(fù)數(shù)0表示非負(fù)–(–2n–1)不能表示非負(fù)數(shù)的無(wú)符號(hào)數(shù)和二進(jìn)制補(bǔ)碼是相同的一些特殊的數(shù)0: 00000000…0000–1: 11111111…1111絕對(duì)值最大負(fù)數(shù): 10000000…0000最大正數(shù): 01111111…1111Chapter2—Instructions:LanguageoftheComputer—23有符號(hào)數(shù)(二進(jìn)制補(bǔ)碼)的取反取反加1取反的含義1→0,0→1舉例:對(duì)+2的求反+2=00000000…00102–2=11111111…11012+1

=11111111…11102Chapter2—Instructions:LanguageoftheComputer—24符號(hào)擴(kuò)展使用更多的位表示一個(gè)數(shù)數(shù)值保持不變?cè)贛IPS指令集中addi:extendimmediatevalue擴(kuò)展到立即數(shù)lb,lh:extendloadedbyte/halfword擴(kuò)展到取字節(jié)/半字beq,bne:擴(kuò)展到跳轉(zhuǎn)后的位置extendthedisplacement相等/不相等跳轉(zhuǎn)復(fù)制符號(hào)位到左側(cè)對(duì)照無(wú)符號(hào)數(shù):用0擴(kuò)充舉例:8-bitto16-bit+2:00000010=>0000000000000010–2:11111110=>1111111111111110Chapter2—Instructions:LanguageoftheComputer—25指令表示指令用二進(jìn)制編碼稱為機(jī)器代碼MIPS指令32位指令字編碼指令格式中若干字段分別用于表示操作碼,寄存器編號(hào),…非常規(guī)整寄存器編號(hào)【參考教材71頁(yè)圖2-14】$t0–$t7arereg’s8–15$t8–$t9arereg’s24–25$s0–$s7arereg’s16–23§2.5RepresentingInstructionsintheComputer指令格式的演變肆地址指令;三地址指令;二地址指令;一地址指令;零地址指令。地址的顯式和隱含式Chapter2—Instructions:LanguageoftheComputer—27MIPS中寄存器指令指令字段op:操作碼(opcode)rs:第一個(gè)源寄存器編號(hào)rt:第二個(gè)源寄存器編號(hào)rd:目的寄存器編號(hào)shamt:移位位數(shù)(00000表示不移位)funct:功能碼(擴(kuò)展操作碼)(extendsopcode)oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—28R-型(寄存器)操作舉例 add$t0,$s1,$s2special$s1$s2$t00add01718803200000010001100100100000000100000000000100011001001000000001000002=0232402016oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—29十六進(jìn)制基底是16二進(jìn)制串的壓縮表示(使用16進(jìn)制的原因)四位二進(jìn)制組成一個(gè)十六進(jìn)制數(shù)000004010081000c1100100015010191001d11012001060110a1010e11103001170111b1011f1111Example:eca8642011101100101010000110010000100000Chapter2—Instructions:LanguageoftheComputer—30MIPSI型(立即數(shù)指令)立即數(shù)的算術(shù)和讀數(shù)/存數(shù)指令rt:目的或源寄存器編號(hào)常數(shù)的取值范圍:–215to+215

–1地址:偏移加上rs中的基址設(shè)計(jì)原則4:優(yōu)秀的設(shè)計(jì)需要適宜的折中方案不同類型指令采用不同的解碼方式,但都是32位相同的指令長(zhǎng)度盡可能保持相似的指令格式oprsrtconstantoraddress6bits5bits5bits16bits指令格式舉例1如果數(shù)組A的基址放在$t1中,h存放在$s2中,這C語(yǔ)言寫(xiě)的語(yǔ)句:A[300]=h+A[300]編譯成匯編語(yǔ)言,則為:lw$t0,1200($t1)#$t0=A[300]Add$t0,$s2,$t0#$t0=h+A[300]Sw$t0,1200($t1)#把h+A[300]存到原來(lái)A[300]所在的單元。指令格式舉例1-2oprsrtrdAddress/shamdfunct359812000188803243981200匯編語(yǔ)言編寫(xiě)的程序:lw$t0,1200($t1)

Add$t0,$s2,$t0Sw$t0,1200($t1)變成機(jī)器語(yǔ)言,如下:寄存器編號(hào)$t0–$t7arereg’s8–15$t8–$t9arereg’s24–25$s0–$s7arereg’s16–23指令格式舉例1-3oprsrtrdAddress/shamdfunct359812000188803243981200存在存儲(chǔ)器中的形式為上表的2進(jìn)制:oprsrtrdAddress/shamdfunct100011010010100000000100101100000000001001001000010000000010000010101101001010000000010010110000匯編語(yǔ)言編寫(xiě)的程序:lw$t0,1200($t1)

Add$t0,$s2,$t0Sw$t0,1200($t1)Chapter2—Instructions:LanguageoftheComputer—34存儲(chǔ)程序指令用二進(jìn)制表示,像數(shù)一樣指令和數(shù)據(jù)存儲(chǔ)在存儲(chǔ)器中程序可以被其他程序操作例如,編譯,連接,…“二進(jìn)制兼容”可以讓編譯后的程序運(yùn)行在不同的計(jì)算機(jī)上標(biāo)準(zhǔn)的ISAs(軟件編程的標(biāo)準(zhǔn))TheBIGPictureChapter2—Instructions:LanguageoftheComputer—35邏輯操作對(duì)位進(jìn)行處理的指令邏輯操作CJavaMIPS左移<<<<sll右移>>>>>srl按位與&&and,andi按位或||or,ori按位取反~~nor用于對(duì)字中的若干“位”打包和拆包的操作§2.6LogicalOperationsChapter2—Instructions:LanguageoftheComputer—36移位操作shamt:移多少位邏輯左移sll左移空位填0邏輯左移i位相當(dāng)于乘2i邏輯右移srl邏輯右移空位填0邏輯右移i位相當(dāng)于除2i(僅對(duì)無(wú)符號(hào)數(shù))oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—37“與”操作可用于一個(gè)字中的掩碼操作選擇某些位,其他位清零 and$t0,$t1,$t20000000000000000000011011100000000000000000000000011110000000000$t2$t100000000000000000000110000000000$t0Chapter2—Instructions:LanguageoftheComputer—38“或”操作用于把包含字中的一些位置1,其他位不變

or$t0,$t1,$t20000000000000000000011011100000000000000000000000011110000000000$t2$t100000000000000000011110111000000$t0Chapter2—Instructions:LanguageoftheComputer—39按位“取反”操作用于改變字中的一些位0變成1,1變成0MIPS3-操作數(shù)指令NORaNORb==NOT(aORb)“或非” nor$t0,$t1,$zero00000000000000000011110000000000$t111111111111111111100001111111111$t0Register0:alwaysreadaszeroChapter2—Instructions:LanguageoftheComputer—40決策指令如果條件為真,跳轉(zhuǎn)到被標(biāo)簽的指令執(zhí)行否則,繼續(xù)執(zhí)行beqrs,rt,L1if(rs==rt)轉(zhuǎn)到標(biāo)簽為L(zhǎng)1的指令執(zhí)行bners,rt,L1if(rs!=rt)轉(zhuǎn)到標(biāo)簽為L(zhǎng)1的指令執(zhí)行;jL1無(wú)條件跳轉(zhuǎn)到標(biāo)簽為L(zhǎng)1的指令執(zhí)行§2.7InstructionsforMakingDecisionsChapter2—Instructions:LanguageoftheComputer—41編譯IF語(yǔ)句Ccode: if(i==j)f=g+h;

elsef=g-h;f,g,…in$s0,$s1,…編譯成MIPS代碼: bne$s3,$s4,Else

add$s0,$s1,$s2

jExit

Else:sub$s0,$s1,$s2

Exit:…AssemblercalculatesaddressesChapter2—Instructions:LanguageoftheComputer—42編譯循環(huán)語(yǔ)句Ccode:

while(save[i]==k)i+=1;iin$s3,kin$s5,addressofsavein$s6CompiledMIPScode:

Loop:sll$t1,$s3,2

add$t1,$t1,$s6

lw$t0,0($t1)

bne$t0,$s5,Exit

addi$s3,$s3,1

jLoop

Exit:…Chapter2—Instructions:LanguageoftheComputer—43基本塊一個(gè)基本塊是一個(gè)指令序列,其中內(nèi)部沒(méi)有跳出的指令(結(jié)束指令除外)也沒(méi)有被跳轉(zhuǎn)到的指令(開(kāi)始指令除外)編譯器標(biāo)識(shí)基本快用于優(yōu)化高級(jí)處理機(jī)能夠加速基本塊的執(zhí)行Chapter2—Instructions:LanguageoftheComputer—44更多的條件操作如果條件為真置1,否則置0sltrd,rs,rt;小于則置位if(rs<rt)rd=1;elserd=0;sltirt,rs,constantif(rs<constant)rt=1;elsert=0;beq,bne可以和其他指令結(jié)合使用 slt$t0,$s1,$s2#if($s1<$s2)$t0=1;

bne$t0,$zero,L#$t0notequaltozerobranchtoLChapter2—Instructions:LanguageoftheComputer—45分支指令設(shè)計(jì)為什么沒(méi)有blt,bge等指令?硬件執(zhí)行<,≥,…比=,≠慢指令中結(jié)合分支指令包含更多工作,需要更慢的時(shí)鐘所有指令都受到了影響B(tài)eq和bne是較常用的這是一個(gè)很好的設(shè)計(jì)折中方案Chapter2—Instructions:LanguageoftheComputer—46有符號(hào)數(shù)和無(wú)符號(hào)數(shù)對(duì)比有符號(hào)數(shù)比較:slt,slti無(wú)符號(hào)數(shù)比較:sltu,sltui舉例$s0=11111111111111111111111111111111$s1=00000000000000000000000000000001slt$t0,$s0,$s1#signed–1<+1$t0=1sltu$t0,$s0,$s1#unsigned+4,294,967,295>+1$t0=0Chapter2—Instructions:LanguageoftheComputer—47過(guò)程調(diào)用遵循步驟將參數(shù)放在過(guò)程可以訪問(wèn)的寄存器里將控制轉(zhuǎn)移給過(guò)程獲得過(guò)程所需要的存儲(chǔ)資源執(zhí)行過(guò)程的操作(請(qǐng)求的任務(wù))將結(jié)果的值放在調(diào)用程序可以訪問(wèn)到的寄存器將控制返回到調(diào)用點(diǎn)§2.8SupportingProceduresinComputerHardwareChapter2—Instructions:LanguageoftheComputer—48寄存器的使用$a0–$a3:傳遞參數(shù)(reg’s4–7)$v0,$v1:返回結(jié)果值(reg’s2and3)$t0–$t9:臨時(shí)寄存器可以被調(diào)用者改寫(xiě)$s0–$s7:保存參數(shù)必須被調(diào)用者保存和恢復(fù)$gp:靜態(tài)數(shù)據(jù)的全局指針寄存器(reg28)globalpointerforstaticdata(reg28)$sp:堆棧指針寄存器stackpointer(reg29)$fp:幀指針寄存器(framepointer),保存過(guò)程幀的第一個(gè)字(reg30)$ra:返回地址寄存器returnaddress(reg31)Chapter2—Instructions:LanguageoftheComputer—49過(guò)程調(diào)用指令過(guò)程調(diào)用:跳轉(zhuǎn)和鏈接 jalProcedureLabel下一條指令的地址在寄存器$ra中跳轉(zhuǎn)到目標(biāo)地址過(guò)程返回:寄存器跳轉(zhuǎn)jumpregister jr$ra拷貝$ra到程序計(jì)數(shù)器也被用于運(yùn)算后跳轉(zhuǎn)例如用于case/switcg分支語(yǔ)句e.gChapter2—Instructions:LanguageoftheComputer—50不調(diào)用其他過(guò)程(葉過(guò)程)例子Ccode: intleaf_example(intg,h,i,j)

{intf;

f=(g+h)-(i+j);

returnf;

}參數(shù)g,…,j在$a0,…,$a3中f在$s0(因此,需要存儲(chǔ)$s0到堆棧)結(jié)果在$v0Chapter2—Instructions:LanguageoftheComputer—51不調(diào)用其他過(guò)程的例子MIPScode: leaf_example:

addi$sp,$sp,-4

sw$s0,0($sp)

add$t0,$a0,$a1

add$t1,$a2,$a3

sub$s0,$t0,$t1

add$v0,$s0,$zero

lw$s0,0($sp)

addi$sp,$sp,4

jr$ra存儲(chǔ)$s0到堆棧i+j---t1

過(guò)程體(g+h)-(i+j)恢復(fù)$s0結(jié)果(s0----v0)返回參數(shù)g,…,j在$a0,…,$a3中;f在$s0(因此,需要存儲(chǔ)$s0到堆棧);結(jié)果在$v0g+h----t0Chapter2—Instructions:LanguageoftheComputer—52嵌套過(guò)程—非葉過(guò)程(Non-LeafProcedures)過(guò)程調(diào)用其他過(guò)程對(duì)于嵌套調(diào)用,調(diào)用者需要存儲(chǔ)到堆棧的信息:它的返回地址調(diào)用后還需要用的任何參數(shù)寄存器和臨時(shí)寄存器調(diào)用后返回,寄存器會(huì)從堆棧中恢復(fù)Chapter2—Instructions:LanguageoftheComputer—53嵌套過(guò)程舉例Non-LeafProcedureExampleCcode: intfact(intn)

{

if(n<1)returnf;

elsereturnn*fact(n-1);

}參數(shù)n放在

$a0結(jié)果放在$v0Chapter2—Instructions:LanguageoftheComputer—54嵌套過(guò)程舉例Non-LeafProcedureExampleMIPScode: fact:

addi$sp,$sp,-8#adjuststackfor2items

sw$ra,4($sp)#savereturnaddress

sw$a0,0($sp)#saveargument(存參數(shù))

slti$t0,$a0,1#testforn<1

beq$t0,$zero,L1

addi$v0,$zero,1#ifso,resultis1

addi$sp,$sp,8#pop2itemsfromstack

jr$ra#andreturn

L1:addi$a0,$a0,-1#elsedecrementn

jalfact#recursivecall(遞歸調(diào)用)

lw$a0,0($sp)#restoreoriginaln

lw$ra,4($sp)#andreturnaddress

addi$sp,$sp,8#pop2itemsfromstack

mul$v0,$a0,$v0#multiplytogetresult

jr$ra#andreturnChapter2—Instructions:LanguageoftheComputer—55堆棧中的局部數(shù)據(jù)LocalDataontheStack局部數(shù)據(jù)有調(diào)用者分配e.g.,C自動(dòng)分配變量過(guò)程幀(活動(dòng)記錄)被一些編譯器使用控制堆棧存儲(chǔ)Chapter2—Instructions:LanguageoftheComputer—56內(nèi)存布局MemoryLayout正文:程序代碼靜態(tài)數(shù)據(jù):全局變量e.g.,C語(yǔ)言靜態(tài)變量,常數(shù)數(shù)組和字符串$gp初始化地址,允許段內(nèi)的±偏移動(dòng)態(tài)數(shù)據(jù):堆堆棧:自動(dòng)存儲(chǔ)Chapter2—Instructions:LanguageoftheComputer—57字符數(shù)據(jù)(包括漢字)字節(jié)編碼的字符集ASCII:128個(gè)95graphic,33controlLatin-1:256個(gè)ASCII,+96moregraphiccharactersUnicode:32位字符集UsedinJava,C++widecharacters,…寬字符世界上大多數(shù)字母表UTF-8,UTF-16:可變長(zhǎng)度編碼§2.9CommunicatingwithPeopleChapter2—Instructions:LanguageoftheComputer—58字節(jié)/半字操作Byte/HalfwordOperations使用位操作MIPS字節(jié)/半字讀取/存儲(chǔ)字符串處理是較常用的方式lbrt,offset(rs)lhrt,offset(rs)Signextendto32bitsinrtlburt,offset(rs)lhurt,offset(rs)Zeroextendto32bitsinrtsbrt,offset(rs)shrt,offset(rs)存儲(chǔ)恰恰是字節(jié)或半子的形式Chapter2—Instructions:LanguageoftheComputer—59字符串拷貝舉例StringCopyExampleCcode(na?ve):非終止字符串Null-terminatedstring

voidstrcpy(charx[],chary[])

{inti;

i=0;

while((x[i]=y[i])!=‘\0’)

i+=1;

}假定x,y基地址在$a0,$a1中;i在$s0中。Chapter2—Instructions:LanguageoftheComputer—60字符串拷貝StringCopyExampleMIPScode: strcpy:

addi$sp,$sp,-4#為保存i調(diào)整堆棧指針,

sw$s0,0($sp)#把i送棧中【i在$s0中】add$s0,$zero,$zero#將i置“0”,【i=0+0】

L1:add$t1,$s0,$a1#addrofy[i]in$t1

lbu$t2,0($t1)#$t2=y[i]

add$t3,$s0,$a0#addrofx[i]in$t3

sb$t2,0($t3)#x[i]=y[i]

beq$t2,$zero,L2#exitloopify[i]==0

addi$s0,$s0,1#i=i+1

jL1#nextiterationofloop

L2:lw$s0,0($sp)#restoresaved$s0

addi$sp,$sp,4#pop1itemfromstack

jr$ra#andreturn假定x,y基地址在$a0,$a1中,i在$s0中Chapter2—Instructions:LanguageoftheComputer—610000000000111101000000000000000032位常數(shù)32-bitConstants大部分常數(shù)都比較小,16位表示立即數(shù)足夠了,偶爾使用32位常數(shù)。

luirt,constant取立即數(shù)并放到高16位lui$s0,

6100000000011111010000100100000000ori$s0,$s0,2304§2.10MIPSAddressingfor32-BitImmediatesandAddressesOri立即數(shù)或,$s0與常數(shù)2304“或”,結(jié)果放在$s0形成一個(gè)32位的常數(shù)Chapter2—Instructions:LanguageoftheComputer—62分支地址BranchAddressing分支指令說(shuō)明操作嗎,兩個(gè)寄存器,兩個(gè)地址大多數(shù)跳轉(zhuǎn)目標(biāo)離跳出的位置較近向前或向后oprsrtconstantoraddress6bits5bits5bits16bitsPC相對(duì)尋址目標(biāo)地址=PC+offset×4此時(shí)PC的增加量是4的倍數(shù)PC作為增加地址的寄存器原因Chapter2—Instructions:LanguageoftheComputer—63Chapter2—Instructions:LanguageoftheComputer—64跳轉(zhuǎn)地址JumpAddressing跳轉(zhuǎn)(j和jal)的目標(biāo)地址可以在代碼段的任何位置指令除op外,指令其它字段都是地址opaddress6bits26bits直接跳轉(zhuǎn)到地址Targetaddress=PC31…28:(address×4)28位4位Chapter2—Instructions:LanguageoftheComputer—65目標(biāo)地址TargetAddressingExample早期例子的循環(huán)代碼設(shè)循環(huán)的起始地址是8000Loop:sll$t1,$s3,2800000019920add$t1,$t1,$s68000409229032lw$t0,0($t1)8000835980bne$t0,$s5,Exit8001258212addi$s3,$s3,180016819191jLoop80020220000Exit:…80024Chapter2—Instructions:LanguageoftheComputer—66遠(yuǎn)程分支BranchingFarAway如果跳轉(zhuǎn)對(duì)象地址太大無(wú)法用16位的偏移表示,匯編將重寫(xiě)代碼【把短跳轉(zhuǎn)(216范圍)變成長(zhǎng)跳轉(zhuǎn)(226

范圍)】Example beq$s0,$s1,L1 ↓

bne$s0,$s1,L2

jL1

L2: …常用的尋址方式寄存器型:直接、間接;存儲(chǔ)器型:直接、間接;計(jì)算型:相對(duì)、基址、變址;立即數(shù)型;Chapter2—Instructions:LanguageoftheComputer—68地址模式總結(jié)AddressingModeSummaryChapter2—Instructions:LanguageoftheComputer—692.11并行與指令:同步處理器共享存儲(chǔ)器同一區(qū)域P1寫(xiě),P2讀(任務(wù)1寫(xiě)的結(jié)果是任務(wù)2要讀取得值)如果P1和P2不同步,將發(fā)生數(shù)據(jù)競(jìng)爭(zhēng)結(jié)果由訪問(wèn)次序決定依賴硬件提供同步指令(例如:lock和unlock指令,控制一個(gè)“互斥區(qū)”)多核處理器的情況下:任務(wù)1Sw$t0,0($s0)任務(wù)2Lw$t1,0($s0)此時(shí),任務(wù)2和任務(wù)1必須同步,否則,無(wú)法判斷$t1中讀取的是$t0,還是0($s0)單元以前的數(shù)值?!?.11ParallelismandInstructions:SynchronizationChapter2—Instructions:LanguageoftheComputer—702.11并行與指令:同步原子讀/寫(xiě)內(nèi)存操作在讀和寫(xiě)之間,不再允許對(duì)該空間的其他操作可以是單一的指令例如寄存器和內(nèi)存之間的原子交換或者指令的原子配對(duì)§2.11ParallelismandInstructions:SynchronizationChapter2—Instructions:LanguageoftheComputer—71MIPS中的同步SynchronizationinMIPS

鏈接取數(shù)(Loadlinked)ll

rt,offset(rs)條件存數(shù)(Storeconditional)scrt,offset(rs)如果ll指令沒(méi)改變?cè)摰刂穬?nèi)容則成功,rt返回1;如果被改變了,則失敗,rt返回0;例如:atomicswap(檢測(cè)和設(shè)置鎖變量)try:add$t0,$zero,$s4;copyexchangevaluell$t1,0($s1);loadlinkedsc$t0,0($s1);storeconditionalbeq$t0,$zero,try;branchstorefailsadd$s4,$zero,$t1;putloadvaluein$s4Chapter2—Instructions:LanguageoftheComputer—72編譯并執(zhí)行程序TranslationandStartup許多編譯器直接產(chǎn)生目標(biāo)模塊靜態(tài)鏈接§2.12TranslatingandStartingaProgramChapter2—Instructions:LanguageoftheComputer—73匯編偽指令A(yù)ssemblerPseudoInstructions大多數(shù)匯編指令和機(jī)器指令是一對(duì)一的特殊的是偽指令偽指令:匯編指令的變種move$t0,$t1 → add$t0,$zero,$t1

blt$t0,$t1,L → slt$at,$t0,$t1

bne$at,$zero,L$at(register1):

匯編程序的臨時(shí)寄存器(使用匯編語(yǔ)言時(shí)候的硬件額外的開(kāi)銷)Chapter2—Instructions:LanguageoftheComputer—74生成目標(biāo)模塊ProducinganObjectModule匯編器(或編譯器)把程序翻譯成機(jī)器語(yǔ)言提供從部分構(gòu)建完整程序的信息

目標(biāo)文件頭:描述目標(biāo)文件其他部分的大小和位置正文段:翻譯后的指令,包含機(jī)器語(yǔ)言代碼靜態(tài)數(shù)據(jù)段:包含在程序生命周期內(nèi)分配的數(shù)據(jù)重定位信息,標(biāo)記了一些程序加載進(jìn)內(nèi)存時(shí)依賴于絕對(duì)地址的指令和數(shù)據(jù)符號(hào)表,全局定義和外部引用調(diào)試信息:用于關(guān)聯(lián)源文件Chapter2—Instructions:LanguageoftheComputer—75鏈接目標(biāo)模塊LinkingObjectModules產(chǎn)生一個(gè)可執(zhí)行的映像1.

合并段(代碼和數(shù)據(jù)數(shù)據(jù)庫(kù)象征性放入內(nèi)存)2.

決定數(shù)據(jù)和指令標(biāo)簽的地址3.

修補(bǔ)引用(內(nèi)部和外部引用)可以留下依靠重定位程序修復(fù)的部分但虛擬內(nèi)存,不需要做這些虛擬內(nèi)存空間,程序必須以絕對(duì)地址裝入Chapter2—Instructions:LanguageoftheComputer—76加載程序LoadingaProgram把待執(zhí)行的程序從硬盤(pán)的鏡像文件讀入內(nèi)存1.

讀取可執(zhí)行文件頭來(lái)確定正文段和數(shù)據(jù)段的大小2.為正文和數(shù)據(jù)創(chuàng)建一個(gè)足夠大的地址空間3.

把指令和初始數(shù)據(jù)拷貝到內(nèi)存或者設(shè)置頁(yè)表項(xiàng),使它們可用4.

把主程序的參數(shù)復(fù)制到棧頂5.

初始化寄存器(包括堆棧指針$sp,幀指針$fp,全局指針$gp)6.

跳轉(zhuǎn)到啟動(dòng)進(jìn)程復(fù)制參數(shù)到寄存器并調(diào)用主函數(shù)main主函數(shù)返回時(shí),通過(guò)系統(tǒng)調(diào)用exit終止程序Chapter2—Instructions:LanguageoftheComputer—77動(dòng)態(tài)鏈接庫(kù)DynamicLinking調(diào)用時(shí),只是連接或裝入庫(kù)文件過(guò)程代碼重定位;避免所有程序中出現(xiàn)的鏈接庫(kù);但是這些庫(kù)的信息是一次性代入內(nèi)存,占用內(nèi)存空間。只是在用到的時(shí)候才鏈接該庫(kù);自動(dòng)裝入最新的編譯器中的版本的動(dòng)態(tài)庫(kù)。Chapter2—Instructions:LanguageoftheComputer—78晚過(guò)程連接LazyLinkage

(只是在用到的時(shí)候才鏈接該庫(kù))IndirectiontableStub:LoadsroutineID,

Jumptolinker/loaderLinker/loadercodeDynamically

mappedcodeChapter2—Instructions:LanguageoftheComputer—79啟動(dòng)一個(gè)Java程序StartingJavaApplicationsSimpleportableinstructionsetfortheJVMInterpretsbytecodesCompilesbytecodesof“hot”methodsintonativecodeforhostmachineChapter2—Instructions:LanguageoftheComputer—80CSortExample使用匯編指令的冒泡排序(交換內(nèi)存中兩個(gè)位置所存的值)Swapprocedure(leaf) voidswap(intv[],intk)

{

inttemp;

temp=v[k];

v[k]=v[k+1];

v[k+1]=temp;

}vin$a0,kin$a1,tempin$t0§2.13ACSortExampletoPutItAllTogetherChapter2—Instructions:LanguageoftheComputer—81Swap過(guò)程TheProcedureSwapswap:sll$t1,$a1,2#$t1=k*4(按照字節(jié)編址)add$t1,$a0,$t1#$t1=v+(k*4)#(addressofv[k])lw$t0,0($t1)#$t0(temp)=v[k]lw$t2,4($t1)#$t2=v[k+1]sw$t2,0($t1)#v[k]=$t2(v[k+1])sw$t0,4($t1)#v[k+1]=$t0(temp)jr$ra#returntocallingroutineC代碼(按照字編址)MIPS代碼(按照字節(jié)編址)1、為程序變量分配寄存器;【vin$a0,kin$a1,tempin$t0】2、為過(guò)程體生成匯編代碼;3、保存過(guò)程調(diào)用間的寄存器(本例中沒(méi)有用到,因?yàn)楸纠且粋€(gè)葉過(guò)程);Chapter2—Instructions:LanguageoftheComputer—82編譯優(yōu)化的影響EffectofCompilerOptimization1、編譯時(shí)間2、指令數(shù);3、時(shí)鐘周期4、CPI5、算法執(zhí)行時(shí)間是準(zhǔn)確衡量程序性能的唯一標(biāo)準(zhǔn)Chapter2—Instructions:LanguageoftheComputer—83經(jīng)驗(yàn)教訓(xùn)LessonsLearnt單獨(dú)的指令數(shù)或CPI不能很好的描述性能編譯器優(yōu)化對(duì)算法敏感對(duì)比Java虛擬機(jī)解釋Java/JIT編譯代碼已經(jīng)足夠快了某些情況要對(duì)編譯完C進(jìn)行優(yōu)化沒(méi)什么能修復(fù)一個(gè)垃圾算法Chapter2—Instructions:LanguageoftheComputer—84數(shù)組和指針【簡(jiǎn)單介紹】數(shù)組下標(biāo)計(jì)算包括下標(biāo)乘以元素長(zhǎng)度加上數(shù)組基址指針直接對(duì)應(yīng)內(nèi)存能避免下標(biāo)計(jì)算的麻煩§2.14ArraysversusPointersChapter2—Instructions:LanguageoftheComputer—85例子:數(shù)組和指針實(shí)現(xiàn)ClearingExample:ClearingandArrayclear1(intarray[],intsize)【使用下標(biāo)】{inti;for(i=0;i<size;i+=1)array[i]=0;}clear2(int*array,intsize)【使用指針】{int*p;for(p=&array[0];p<&array[size];p=p+1)*p=0;}move$t0,$zero#i=0loop1:sll$t1,$t0,2#$t1=i*4add$t2,$a0,$t1#$t2=#&array[i]sw$zero,0($t2)#array[i]=0addi$t0,$t0,1#i=i+1slt$t3,$t0,$a1#$t3=#(i<size)bne$t3,$zero,loop1#if(…)

#gotoloop1move$t0,$a0

#p=&array[0]sll$t1,$a1,2#$t1=size*4add$t2,$a0,$t1#$t2=#&array[size]loop2:sw$zero,0($t0)#Memory[p]=0addi$t0,$t0,4#p=p+4slt$t3,$t0,$t2#$t3=#(p<&array[size])bne$t3,$zero,loop2#if(…)#gotoloop2Chapter2—Instructions:LanguageoftheComputer—86數(shù)組與指針的比較

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論