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

下載本文檔

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

文檔簡介

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

等Chapter2指令:計算機的語言本章概要計算機硬件的操作計算機硬件的操作數(shù)有符號和無符號數(shù)計算機中指令的表示邏輯操作決策指令計算機硬件對過程的支持人機交互MIPS中32位立即數(shù)和地址的尋址并行與指令:同步翻譯并執(zhí)行程序以一個C排序程序為例數(shù)組與指針Chapter2—Instructions:LanguageoftheComputer—3類別指令I(lǐng)nstruction示例含義注釋算術(shù)加法addadd$s1,$s2,$s3$s1=$s2+$s3三個寄存器操作數(shù)減法subtractsub$s1,$s2,$s3$s1=$s2-$s3三個寄存器操作數(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)存半字寄存器取無符號半字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三個寄存器操作數(shù)按位與或oror$s1,$s2,$s3$s1=$s2|$s3三個寄存器操作數(shù)按位或或非nornor$s1,$s2,$s3$s1=~($s2|$s3)三個寄存器操作數(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ù)左移相應位邏輯右移shiftrightlogicalsrl$s1,$s2,10$s1=$s2>>10根據(jù)常數(shù)右移相應位類別指令I(lǐng)nstruction示例含義注釋條件分支相等時跳轉(zhuǎn)branchonequalbeq$s1,$s2,25if($s1=$s2)gotoPC+4+100相等檢測;

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

和PC相關(guān)的跳轉(zhuǎn)小于時置位setonlessthanslt$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比較是否小于:無符號數(shù)比較小于時置位setonlessthanunsignedsltu$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比較是否小于無符號數(shù)無符號數(shù)比較小于立即數(shù)時置位setlessthanimmediateslti$s1,$s2,20if($s2<20)$s1=1else$s1=0比較是否小于常數(shù)無符號數(shù)比較小于無符號立即數(shù)時置位setlessthanimmediateunsignedsltiu$s1,$s2,20if($s2<20)$s1=1else$s1=0比較是否小于無符號常數(shù)Chapter2—Instructions:LanguageoftheComputer—4類別指令I(lǐng)nstruction示例含義注釋算術(shù)加法addadd$s1,$s2,$s3$s1=$s2+$s3減法subtractsub$s1,$s2,$s3$s1=$s2-$s3三個寄存器操作數(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)存半字寄存器取無符號半字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三個寄存器操作數(shù)按位與或oror$s1,$s2,$s3$s1=$s2|$s3三個寄存器操作數(shù)按位或或非nornor$s1,$s2,$s3$s1=~($s2|$s3)三個寄存器操作數(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ù)左移相應位邏輯右移shiftrightlogicalsrl$s1,$s2,10$s1=$s2>>10根據(jù)常數(shù)右移相應位條件分支相等時跳轉(zhuǎn)branchonequalbeq$s1,$s2,25if($s1=$s2)gotoPC+4+100相等檢測;

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

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

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

addt1,i,j#臨時變量t1=i+j

subf,t0,t1#f=t0-t1Chapter2—Instructions:LanguageoftheComputer—11寄存器操作數(shù)算術(shù)運算指令使用寄存器操作MIPS有32個32位寄存器用于存儲頻繁使用的數(shù)據(jù)編號0到3132位數(shù)碼稱為一個字編譯時名稱的約定$t0,$t1,…,$t9表示臨時寄存器$s0,$s1,…,$s7用于存儲變量設(shè)計原則二:越少越快對照主存:數(shù)以百萬計的存儲位置§2.3OperandsoftheComputerHardware舉例寄存器號注釋$zero0常數(shù)0$at1匯編器保留$v0~$v12-3計算結(jié)果和表達式求值$a0~$a34-7參數(shù)$t0~$t78-15臨時變量$s0~$s716-23保留寄存器$t8~$t924-25更多臨時變量$k0~$k126-27操作系統(tǒng)保留$gp28全局指針$sp29棧指針$fp30幀指針$ra31返回地址Chapter2—Instructions:LanguageoftheComputer—12寄存器操作數(shù)舉例C語言編寫的代碼: 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存儲器操作數(shù)主存可以存儲復雜數(shù)據(jù)數(shù)組,結(jié)構(gòu),動態(tài)數(shù)據(jù)使用算術(shù)運算操作數(shù)從主存把數(shù)讀入到寄存器把結(jié)果從寄存器存儲到主存存儲器按字節(jié)編址每個地址表示一個8位字節(jié)按字存放在內(nèi)存每個地址必須是4個字節(jié)MIPS按大端編址高位存放在低地址對照小端模式:低位放到低地址地址偏移大端模式小端模式0x0012(OP0)34(OP1)0x0134(OP1)12(OP0)如果將一個16位的整數(shù)0x1234存放到一個短整型變量(short)中。這個短整型變量在內(nèi)存中的存儲在大小端模式由下表所示。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)存半字寄存器取無符號半字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存儲器操作數(shù)舉例1Ccode: g=h+A[8];g在$s1,h在$s2,A的基址在$s3編譯成MIPS代碼:小標8(數(shù)組第8個分量)需要32的偏移每個字對應4個字節(jié) lw$t0,32($s3)#loadword

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

add$t2,$s1,$zeroChapter2—Instructions:LanguageoftheComputer—20二進制無符號整數(shù)給定一個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二進制補碼表示有符號整數(shù)x是一個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二進制補碼表示有符號整數(shù)31位是符號位1表示負數(shù)0表示非負–(–2n–1)不能表示非負數(shù)的無符號數(shù)和二進制補碼是相同的一些特殊的數(shù)0: 00000000…0000–1: 11111111…1111絕對值最大負數(shù): 10000000…0000最大正數(shù): 01111111…1111Chapter2—Instructions:LanguageoftheComputer—23有符號數(shù)(二進制補碼)的取反取反加1取反的含義1→0,0→1舉例:對+2的求反+2=00000000…00102–2=11111111…11012+1

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

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

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

Add$t0,$s2,$t0Sw$t0,1200($t1)Chapter2—Instructions:LanguageoftheComputer—34存儲程序指令用二進制表示,像數(shù)一樣指令和數(shù)據(jù)存儲在存儲器中程序可以被其他程序操作例如,編譯,連接,…“二進制兼容”可以讓編譯后的程序運行在不同的計算機上標準的ISAs(軟件編程的標準)TheBIGPictureChapter2—Instructions:LanguageoftheComputer—35邏輯操作對位進行處理的指令邏輯操作CJavaMIPS左移<<<<sll右移>>>>>srl按位與&&and,andi按位或||or,ori按位取反~~nor用于對字中的若干“位”打包和拆包的操作§2.6LogicalOperationsChapter2—Instructions:LanguageoftheComputer—36移位操作shamt:移多少位邏輯左移sll左移空位填0邏輯左移i位相當于乘2i邏輯右移srl邏輯右移空位填0邏輯右移i位相當于除2i(僅對無符號數(shù))oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—37“與”操作可用于一個字中的掩碼操作選擇某些位,其他位清零 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)到被標簽的指令執(zhí)行否則,繼續(xù)執(zhí)行beqrs,rt,L1if(rs==rt)轉(zhuǎn)到標簽為L1的指令執(zhí)行bners,rt,L1if(rs!=rt)轉(zhuǎn)到標簽為L1的指令執(zhí)行;jL1無條件跳轉(zhuǎn)到標簽為L1的指令執(zhí)行§2.7InstructionsforMakingDecisionsChapter2—Instructions:LanguageoftheComputer—41編譯IF語句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)語句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基本塊一個基本塊是一個指令序列,其中內(nèi)部沒有跳出的指令(結(jié)束指令除外)也沒有被跳轉(zhuǎn)到的指令(開始指令除外)編譯器標識基本快用于優(yōu)化高級處理機能夠加速基本塊的執(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è)計為什么沒有blt,bge等指令?硬件執(zhí)行<,≥,…比=,≠慢指令中結(jié)合分支指令包含更多工作,需要更慢的時鐘所有指令都受到了影響B(tài)eq和bne是較常用的這是一個很好的設(shè)計折中方案Chapter2—Instructions:LanguageoftheComputer—46有符號數(shù)和無符號數(shù)對比有符號數(shù)比較:slt,slti無符號數(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過程調(diào)用遵循步驟將參數(shù)放在過程可以訪問的寄存器里將控制轉(zhuǎn)移給過程獲得過程所需要的存儲資源執(zhí)行過程的操作(請求的任務)將結(jié)果的值放在調(diào)用程序可以訪問到的寄存器將控制返回到調(diào)用點§2.8SupportingProceduresinComputerHardwareChapter2—Instructions:LanguageoftheComputer—48寄存器的使用$a0–$a3:傳遞參數(shù)(reg’s4–7)$v0,$v1:返回結(jié)果值(reg’s2and3)$t0–$t9:臨時寄存器可以被調(diào)用者改寫$s0–$s7:保存參數(shù)必須被調(diào)用者保存和恢復$gp:靜態(tài)數(shù)據(jù)的全局指針寄存器(reg28)globalpointerforstaticdata(reg28)$sp:堆棧指針寄存器stackpointer(reg29)$fp:幀指針寄存器(framepointer),保存過程幀的第一個字(reg30)$ra:返回地址寄存器returnaddress(reg31)Chapter2—Instructions:LanguageoftheComputer—49過程調(diào)用指令過程調(diào)用:跳轉(zhuǎn)和鏈接 jalProcedureLabel下一條指令的地址在寄存器$ra中跳轉(zhuǎn)到目標地址過程返回:寄存器跳轉(zhuǎn)jumpregister jr$ra拷貝$ra到程序計數(shù)器也被用于運算后跳轉(zhuǎn)例如用于case/switcg分支語句e.gChapter2—Instructions:LanguageoftheComputer—50不調(diào)用其他過程(葉過程)例子Ccode: intleaf_example(intg,h,i,j)

{intf;

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

returnf;

}參數(shù)g,…,j在$a0,…,$a3中f在$s0(因此,需要存儲$s0到堆棧)結(jié)果在$v0Chapter2—Instructions:LanguageoftheComputer—51不調(diào)用其他過程的例子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存儲$s0到堆棧i+j---t1

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

{

if(n<1)returnf;

elsereturnn*fact(n-1);

}參數(shù)n放在

$a0結(jié)果放在$v0Chapter2—Instructions:LanguageoftheComputer—54嵌套過程舉例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自動分配變量過程幀(活動記錄)被一些編譯器使用控制堆棧存儲Chapter2—Instructions:LanguageoftheComputer—56內(nèi)存布局MemoryLayout正文:程序代碼靜態(tài)數(shù)據(jù):全局變量e.g.,C語言靜態(tài)變量,常數(shù)數(shù)組和字符串$gp初始化地址,允許段內(nèi)的±偏移動態(tài)數(shù)據(jù):堆堆棧:自動存儲Chapter2—Instructions:LanguageoftheComputer—57字符數(shù)據(jù)(包括漢字)字節(jié)編碼的字符集ASCII:128個95graphic,33controlLatin-1:256個ASCII,+96moregraphiccharactersUnicode:32位字符集UsedinJava,C++widecharacters,…寬字符世界上大多數(shù)字母表UTF-8,UTF-16:可變長度編碼§2.9CommunicatingwithPeopleChapter2—Instructions:LanguageoftheComputer—58字節(jié)/半字操作Byte/HalfwordOperations使用位操作MIPS字節(jié)/半字讀取/存儲字符串處理是較常用的方式lbrt,offset(rs)lhrt,offset(rs)Signextendto32bitsinrtlburt,offset(rs)lhurt,offset(rs)Zeroextendto32bitsinrtsbrt,offset(rs)shrt,offset(rs)存儲恰恰是字節(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形成一個32位的常數(shù)Chapter2—Instructions:LanguageoftheComputer—62分支地址BranchAddressing分支指令說明操作嗎,兩個寄存器,兩個地址大多數(shù)跳轉(zhuǎn)目標離跳出的位置較近向前或向后oprsrtconstantoraddress6bits5bits5bits16bitsPC相對尋址目標地址=PC+offset×4此時PC的增加量是4的倍數(shù)PC作為增加地址的寄存器原因Chapter2—Instructions:LanguageoftheComputer—63Chapter2—Instructions:LanguageoftheComputer—64跳轉(zhuǎn)地址JumpAddressing跳轉(zhuǎn)(j和jal)的目標地址可以在代碼段的任何位置指令除op外,指令其它字段都是地址opaddress6bits26bits直接跳轉(zhuǎn)到地址Targetaddress=PC31…28:(address×4)28位4位Chapter2—Instructions:LanguageoftheComputer—65目標地址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遠程分支BranchingFarAway如果跳轉(zhuǎn)對象地址太大無法用16位的偏移表示,匯編將重寫代碼【把短跳轉(zhuǎn)(216范圍)變成長跳轉(zhuǎn)(226

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

bne$s0,$s1,L2

jL1

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

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

rt,offset(rs)條件存數(shù)(Storeconditional)scrt,offset(rs)如果ll指令沒改變該地址內(nèi)容則成功,rt返回1;如果被改變了,則失敗,rt返回0;例如:atomicswap(檢測和設(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)生目標模塊靜態(tài)鏈接§2.12TranslatingandStartingaProgramChapter2—Instructions:LanguageoftheComputer—73匯編偽指令AssemblerPseudoInstructions大多數(shù)匯編指令和機器指令是一對一的特殊的是偽指令偽指令:匯編指令的變種move$t0,$t1 → add$t0,$zero,$t1

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

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

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

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

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

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

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

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

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

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

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

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

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

Jumptolinker/loaderLinker/loadercodeDynamically

mappedcodeChapter2—Instructions:LanguageoftheComputer—79啟動一個Java程序StartingJavaApplicationsSimpleportableinstructionsetfortheJVMInterpretsbytecodesCompilesbytecodesof“hot”methodsintonativecodeforhostmachineChapter2—Instructions:LanguageoftheComputer—80CSortExample使用匯編指令的冒泡排序(交換內(nèi)存中兩個位置所存的值)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過程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、為過程體生成匯編代碼;3、保存過程調(diào)用間的寄存器(本例中沒有用到,因為本例是一個葉過程);Chapter2—Instructions:LanguageoftheComputer—82編譯優(yōu)化的影響EffectofCompilerOptimization1、編譯時間2、指令數(shù);3、時鐘周期4、CPI5、算法執(zhí)行時間是準確衡量程序性能的唯一標準Chapter2—Instructions:LanguageoftheComputer—83經(jīng)驗教訓LessonsLearnt單獨的指令數(shù)或CPI不能很好的描述性能編譯器優(yōu)化對算法敏感對比Java虛擬機解釋Java/JIT編譯代碼已經(jīng)足夠快了某些情況要對編譯完C進行優(yōu)化沒什么能修復一個垃圾算法Chapter2—Instructions:LanguageoftheComputer—84數(shù)組和指針【簡單介紹】數(shù)組下標計算包括下標乘以元素長度加上數(shù)組基址指針直接對應內(nèi)存能避免下標計算的麻煩§2.14ArraysversusPointersChapter2—Instructions:LanguageoftheComputer—85例子:數(shù)組和指針實現(xiàn)ClearingExample:ClearingandArrayclear1(intarray[],intsize)【使用下標】{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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論