復(fù)習(xí)參考版計(jì)算機(jī)原理standard第2章3講_第1頁(yè)
復(fù)習(xí)參考版計(jì)算機(jī)原理standard第2章3講_第2頁(yè)
復(fù)習(xí)參考版計(jì)算機(jī)原理standard第2章3講_第3頁(yè)
復(fù)習(xí)參考版計(jì)算機(jī)原理standard第2章3講_第4頁(yè)
復(fù)習(xí)參考版計(jì)算機(jī)原理standard第2章3講_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

重點(diǎn)內(nèi)容本節(jié)概要第二章指令:計(jì)算機(jī)的語言

2.4程序的機(jī)器級(jí)表示MIPS指令系統(tǒng)MIPS匯編語言形式機(jī)器語言的解碼(反匯編)計(jì)算機(jī)硬件支持的過程轉(zhuǎn)換和啟動(dòng)一個(gè)程序基本要求掌握MIPS指令格式及其應(yīng)用了解計(jì)算機(jī)中程序的轉(zhuǎn)換和啟動(dòng)回顧內(nèi)容2.2指令格式操作碼結(jié)構(gòu)操作碼的編碼方式定長(zhǎng)操作碼擴(kuò)展操作碼地址碼結(jié)構(gòu)堆棧結(jié)構(gòu):零地址指令累加器結(jié)構(gòu):一地址指令通用寄存器結(jié)構(gòu):二、三地址指令2.3尋址方式基本尋址方式立即/直接/間接/寄存器/寄存器間接/偏移/堆棧復(fù)雜尋址方式指令設(shè)計(jì)風(fēng)格:CISC和RISC上節(jié)回顧

《ComputerOrganizationandDesign》

P1962.18.2、2.18.5、P2032.24.1、P2052.25.6、2.26.1、2.26.2題補(bǔ)充題

《ComputerOrganizationandDesign》第2章第5~12節(jié)相關(guān)資料

基于MIPS指令的程序機(jī)器級(jí)表示及應(yīng)用其它指令系統(tǒng):X86指令、ARM指令

拓展閱讀作業(yè)2.4程序的機(jī)器級(jí)表示存儲(chǔ)器大?。?2字 (可擴(kuò)充到8K字)機(jī)器字長(zhǎng):32位提供6條指令:jumploadaccumulatorsubtractstoreaccumulatortestforzerostop1944年哈佛大學(xué),MarkI

——世界最早的通用機(jī)之一 (長(zhǎng)15米,高2.4米)MIPS指令格式R-類型/I-類型/J-類型MIPS寄存器長(zhǎng)度/個(gè)數(shù)/功能分配MIPS操作數(shù)寄存器操作數(shù)/存儲(chǔ)器操作數(shù)/立即數(shù)/文本/位MIPS指令尋址方式立即數(shù)/寄存器/相對(duì)/偽直接/偏移五種尋址MIPS指令類型算術(shù)/邏輯/數(shù)據(jù)傳送/條件分支/無條件轉(zhuǎn)移

MIPS匯編語言形式操作碼的表示/寄存器的表示/存儲(chǔ)器數(shù)據(jù)表示高級(jí)語言、匯編語言、機(jī)器語言之間的轉(zhuǎn)換過程調(diào)用與堆/棧2.4程序的機(jī)器級(jí)表示MIPS指令格式所有指令都是32位寬,按字地址對(duì)齊三種指令格式R-Type兩個(gè)操作數(shù)都是寄存器的運(yùn)算指令。如:subrd,rs,rtI-Type運(yùn)算指令:一個(gè)寄存器、一個(gè)立即數(shù)。如:orirt,rs,imm16Load和Store指令。如:lwrt,rs,imm16條件分支指令。如:beqrs,rt,imm16J-Type無條件跳轉(zhuǎn)指令。如:jtargetoprsrtrdshamtfunct0611162126316bits6bits5bits5bits5bits5bits

oprsrtimmediate0162126316bits16bits5bits5bits

optargetaddress026316bits26bits

MIPS指令字段含義OP:操作碼rs:第一個(gè)源操作數(shù)寄存器rt:第二個(gè)源操作數(shù)寄存器rd:結(jié)果寄存器shamt:移位指令 的位移量func:R-Type指令的OP字段特定為“000000”,具體操作由func字段給定。如:func=“100000”表示“加法”運(yùn)算。immediate:立即數(shù)或load/store指令或分支指令的偏移地址targetaddress:無條件轉(zhuǎn)移地址低26位。將PC高4位拼上26位直接地址,最后添2個(gè)“0”就是32位目標(biāo)地址。為什么要添“0”?oprsrtrdshamtfunct0611162126316bits6bits5bits5bits5bits5bitsR-Type指令oprsrtimmediate0162126316bits16bits5bits5bitsI-Type指令optargetaddress026316bits26bitsJ-Type指令操作碼的不同編碼定義了不同的含義,若操作碼相同時(shí),再用不同編碼的功能碼來定義不同的含義!MIPS尋址方式R-format:I-format:I-format:I-format:J-format:舉例:匯編指令與機(jī)器指令的對(duì)應(yīng)例1:若MIPSAssemblyInstruction:

add$t0,$s1,$s2則對(duì)應(yīng)MIPS的機(jī)器指令是什么?oprsrtrd

funcsmt655565017188320655565Decimalrepresentaton:$s1$s2$t0R-TypeaddNoshiftBinaryrepresentaton:00000010001100100100010000000000655565這個(gè)過程稱為“匯編”,所有匯編源程序都必須匯編成二進(jìn)制機(jī)器代碼問題:如何知道是R型指令?匯編器?根據(jù)匯編指令中的操作碼助記符查表知道是何格式!從助記符表中查到add是R型指令,即:例2:若從存儲(chǔ)器取出的一條指令是00AF8020H,則對(duì)應(yīng)的匯編指令是什么?指令的前6位為000000,根據(jù)指令解碼表知,是一條R-Type指令,按照R-Type指令的格式:

得到:rs=00101,rt=01111,rd=10000,shamt=0,funct=100000(1)根據(jù)R-Type指令解碼表,知是“add”操作(非移位操作)(2)rs、rt、rd的十進(jìn)制值分別為5、15、16,從MIPS寄存器功能表知:

rs、rt、rd分別為:$a1、$t7、$s0故對(duì)應(yīng)的匯編形式為:

add$s0,$a1,$t7舉例:匯編指令與機(jī)器指令的對(duì)應(yīng)oprsrtrdshamtfunct0611162126316bits6bits5bits5bits5bits5bits00000000101011111000000000100000這個(gè)過程稱為“反匯編”,可用來破解二進(jìn)制代碼(可執(zhí)行程序)32位指令代碼:00000000101011111000000000100000功能:$a1+$t7→$s0MIPSCircuitsforR-TypeInstructionsMIPS指令中寄存器數(shù)據(jù)和存儲(chǔ)器數(shù)據(jù)的指定寄存器數(shù)據(jù)指定

31×32-bitGPRs(r0=0)寄存器編號(hào)占5bit32×32-bitFPregs(f0-f31,pairedDP) HI,LO,PC:特殊寄存器

寄存器功能和2種匯編表示方式存儲(chǔ)器數(shù)據(jù)指定

32-bitmachine→可訪問空間:232bytesBigEndian(大端方式)只能通過Load/Store指令訪問存儲(chǔ)器數(shù)據(jù)數(shù)據(jù)地址通過一個(gè)32位寄存器內(nèi)容加16位偏移量得到16位偏移量是有符號(hào)整數(shù)數(shù)據(jù)要求按邊界對(duì)齊0r0r1...r31PClohiMIPS寄存器功能定義和兩種匯編表示

NamenumberUsageReservedoncall?zero0constantvalue=0(恒為0)n.a.at1reservedforassemblern.a.v0–v12–3valuesforresults(過程調(diào)用返回值)noa0–a34–7Arguments(過程調(diào)用參數(shù))yest0–t78–15Temporaries(臨時(shí)變量)nos0–s716–23Saved(保存)yest8–t924–25moretemporaries(其他臨時(shí)變量)nok0–k126–27reservedforkernel(為OS保留)n.a.gp28globalpointer(全局指針)yessp29stackpointer(棧指針)yesfp30framepointer(幀指針)yesra31returnaddress(過程調(diào)用返回地址)yeszerov0-v1a0-a3t0-t7s0-s7t8-t9gpspfpraat02-34-78---1516---2324-2528293031k0-k1126-27Registers用數(shù)字表示—$0…$31或用名稱表示—$t0,$s1…$raMIPSarithmeticandlogicinstructionsInstruction Example Meaning Commentsaddadd$1,$2,$3$1=$2+$3 3operands;exceptionpossiblesubtractsub$1,$2,$3$1=$2–$3 3operands;exceptionpossibleaddimmed.addi$1,$2,100$1=$2+100 +constant;exceptionpossiblemultiplymult$2,$3Hi,Lo=$2×$3 64-bitsignedproductdividediv$2,$3Lo=$2÷$3, Lo=quotient,Hi=remainder Hi=$2mod$3movefromHimfhi$1$1=Hi getacopyofHimovefromLomflo$1$1=loInstruction Example Meaning Commentsand and$1,$2,$3 $1=$2&$3 LogicalANDoror$1,$2,$3 $1=$2|$3 LogicalORxor xor$1,$2,$3 $1=$2∧$3 LogicalXORnor nor$1,$2,$3 $1=~($2|$3) LogicalNOR這里未全列出,還有其他指令,如addu(不帶溢出處理),addui等MIPSdatatransferinstructionsInstruction CommentMeaning

sw$3,500($4) Storeword$3→($4+500)

sh$3,502($2) StorehalfLowHalfof$3→($2+502)

sb$2,41($3) StorebyteLQof$2→($3+41)

lw$1,-30($2) Loadword($2-30)→$1lh$1,40($3) Loadhalf($3+40)→LHof$1lb$1,40($3) Loadbyte($3+40)→LQ

of$1操作數(shù)長(zhǎng)度的不同是由不同的操作碼指定。問題:為什么需要不同長(zhǎng)度的操作數(shù)?

高級(jí)語言中的數(shù)據(jù)類型有char、short、int、long等,故需要存取不同長(zhǎng)度的操作數(shù);操作數(shù)長(zhǎng)度和指令長(zhǎng)度沒有關(guān)系MIPS的call/return/jump/branch和compare指令I(lǐng)nstruction Example Meaning

jumpregister jr$31 goto$31

forswitch,procedurereturnjumpandlink jal10000 $31=PC+4;goto10000

forprocedurecalljump j10000 goto10000

jumptotargetaddressPseudoinstructionblt,ble,bgt,bgenotimplementedbyhardware,butsynthesizedbyassemblersetonlessthan slt$1,$2,$3 if($2<$3)$1=1;else$1=0setlessthanimm.slti$1,$2,100if($2<100)$1=1;else$1=0 branchonequal beq$1,$2,100if($1=$2)gotoPC+4+100 branchonnoteq.bne$1,$2,100if($1!=$2)gotoPC+4+100 call/return

按補(bǔ)碼比較問題:指令中立即數(shù)是多少?100=0064H問題:指令中立即數(shù)是多少?25=0019HMethodsofTestingCondition(條件測(cè)試方式)條件轉(zhuǎn)移指令通常根據(jù)ConditionCodes(條件碼/狀態(tài)位/標(biāo)志位)進(jìn)行轉(zhuǎn)移

通過執(zhí)行算術(shù)指令或顯式地由比較和測(cè)試指令來設(shè)置

例: sub

r1,r2,r3;r2和r3相減結(jié)果存r1中,生成標(biāo)志位ZF/CF bzlabel; 標(biāo)志位ZF=1時(shí),轉(zhuǎn)移到label處執(zhí)行常用的標(biāo)志有四種: NF(SF):negative VF(OF):overflow CF:carry ZF:zero標(biāo)志位可存放在標(biāo)志(Flag)寄存器(條件碼CC寄存器/狀態(tài)Status寄存器/標(biāo)志寄存器/程序狀態(tài)字PSW寄存器)中,也可由指定的通用寄存器來存放狀態(tài)位

例: cmpr1,r2,r3;比較r2和r3,標(biāo)志位存儲(chǔ)在r1中 bgt

r1,label; 判斷r1是否大于0,是則轉(zhuǎn)移到label處可以將兩條指令合成一條指令,即:計(jì)算并轉(zhuǎn)移

例: bgtr1,r2,label;根據(jù)r1和r2比較結(jié)果,決定是否轉(zhuǎn)移不同處理器,對(duì)標(biāo)志位的處理不同!§2.2計(jì)算機(jī)硬件的操作(OperationsoftheComputerHardware)指令設(shè)計(jì)遵循的四個(gè)基本原則中的第一原則——簡(jiǎn)單源自規(guī)整將C語言賦值語句編譯成MIPS例:C賦值語句:f=(g+h)-(i+j);C編譯器將產(chǎn)生什么樣的MIPS匯編語言代碼?

addt0,g,h #t0=g+h addt1,i,j #t1=i+j subf,t0,t1 #f=t0-t1§2.3計(jì)算機(jī)硬件的操作數(shù)(OperandsoftheComputerHardware)算術(shù)運(yùn)算指令的操作數(shù)是受限制的,必須直接取自寄存器寄存器是計(jì)算機(jī)構(gòu)成的基本元素MIPS寄存器寬度:32位——字?jǐn)?shù)量:32個(gè)指令設(shè)計(jì)遵循的四個(gè)基本原則中的第二原則 ——越少越快寄存器太多,硬件實(shí)現(xiàn)復(fù)雜,時(shí)鐘周期變長(zhǎng)§2.3計(jì)算機(jī)硬件的操作數(shù)使用寄存器編譯C賦值語句例:C賦值語句:f=(g+h)-(i+j);通過C編譯器將寄存器和程序變量對(duì)應(yīng)起來。變量f、g、h、i和j被分別分配給寄存器$s0、$s1、$s2、$s3和$s4。編譯后的MIPS代碼是什么樣的呢?

add$t0,$s1,$s2 #t0=g+h add$t1,$s3,$s4 #t1=i+j sub$s0,$t0,$t1 #s0=t0-t1=(g+h)-(i+j)寄存器資源是由編譯器分配!通常將簡(jiǎn)單變量盡量分配在寄存器中,為什么?存儲(chǔ)器操作數(shù)(MemoryOperands)MIPS必須具有在存儲(chǔ)器和寄存器之間傳送數(shù)據(jù)的指令——數(shù)據(jù)傳送指令取數(shù)指令(load)——把數(shù)據(jù)從存儲(chǔ)器拷貝到寄存器的數(shù)據(jù)傳送指令:lw寄存器號(hào),存儲(chǔ)器地址存數(shù)指令(store)——把數(shù)據(jù)從寄存器拷貝到存儲(chǔ)器的數(shù)據(jù)傳送指令:sw寄存器號(hào),存儲(chǔ)器地址程序的變量個(gè)數(shù)要比機(jī)器的寄存器個(gè)數(shù)多得多。怎么辦?編譯器盡量將最常用的變量保存在寄存器中,而將其它變量保存在存儲(chǔ)器中寄存器換出:將不常用的變量從寄存器讀出存入存儲(chǔ)器的過程存儲(chǔ)器操作數(shù)當(dāng)操作數(shù)在存儲(chǔ)器時(shí),用存取指令編譯C賦值語句例:假設(shè)變量h存放在寄存器$s2中,數(shù)組A的基址存放在$s3中。C賦值語句:A[12]=h+A[8];C編譯器將產(chǎn)生什么樣的MIPS匯編語言代碼?

lw $t0,32($s3) #$t0←A[8] add $t0,$s2,$t0 #$t0←h+A[8] sw $t0,48($s3) #A[12]←$t0問題:如果在一個(gè)循環(huán)體內(nèi)執(zhí)行:g=h+A[i]

,能否用基址尋址方式?不行,因?yàn)檠h(huán)體內(nèi)指令不能變,故首地址A不變,只能把下標(biāo)i放在變址寄存器中,每循環(huán)一次下標(biāo)加1,所以,不能用基址方式而用變址方式。offsetordisplacement(偏移量)baseregister(基址寄存器)常數(shù)或者立即數(shù)操作數(shù)(ConstantorImmediateOperands)把常數(shù)作為算術(shù)運(yùn)算指令的操作數(shù)提供常數(shù)操作數(shù)的快速運(yùn)算指令——立即數(shù)操作指令指令設(shè)計(jì)遵循的四個(gè)基本原則中的第三原則——加速常用操作例:addi $s3,$s3,4 #$s3=$s3+4§2.5計(jì)算機(jī)中指令的表示(RepresentingInstructionsintheComputer)指令以一系列高低電平信號(hào)形式保存在計(jì)算機(jī)中,并以數(shù)字形式表示把指令的數(shù)字形式稱為機(jī)器語言,這樣的指令序列叫做機(jī)器代碼MIPS指令格式指令設(shè)計(jì)遵循的四個(gè)基本原則中的第四原則——均衡設(shè)計(jì)§2.5計(jì)算機(jī)中指令的表示將MIPS匯編語言翻譯成機(jī)器語言例:假設(shè)數(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) #A[300]←$t0這三條MIPS指令的機(jī)器代碼又是什么呢?§2.6邏輯運(yùn)算(LogicalOperations)能夠?qū)Α拔弧边M(jìn)行操作的指令——邏輯操作C和Java中的邏輯操作與MIPS指令的對(duì)應(yīng)關(guān)系移位(shift)指令shamt:用作移位量位操作指令A(yù)ND:按位“與”操作OR:按位“或”操作NOT(一個(gè)操作數(shù)):按位“非”操作NOR(雙個(gè)操作數(shù)):按位“或非”操作§2.7分支指令(InstructionforMakingDecisioos)計(jì)算機(jī)與計(jì)算器不同在于前者具有決策能力根據(jù)不同的輸入數(shù)據(jù)或者中間計(jì)算結(jié)果執(zhí)行不同的指令如,用if語句表示分支:二者選一MIPS匯編語言條件分支指令beqregister1,register2,L1bneregister1,register2,L1無條件分支指令jL1§2.7分支指令將if-then-else語句編譯成條件分支指令 例:假設(shè)從f到j(luò)的五個(gè)變量分別對(duì)應(yīng)于從$s0到$s4的寄存器,C語句:if(i==j)f=g+h;elsef=g-h;編譯后形成的MIPS代碼是怎樣的?

bne $s3,$s4,Else #gotoElseifi≠j add $s0,$s1,$s2 #f←g+h(skippedifi≠j) j Exit #gotoExitElse:sub $s0,$s1,$s2 #f←g–h(skippedifi=j(luò))Exit:§2.7分支指令循環(huán)(Loops)程序用于重復(fù)計(jì)算編譯一個(gè)C語言while循環(huán)例:C語句:while(save[i]==k)i+=1;假設(shè)i和k分別對(duì)應(yīng)于$s3和$s5的寄存器,數(shù)組save的基址存放在$s6中。編譯后形成的MIPS代碼是怎樣的?Loop: sll $t1,$s3,2 #$t1=4*i add $t1,$t1,$s6 #$t1=addressofsave[i] lw $t0,0($t1) #$t0=save[i] bne $t0,$s5,Exit #gotoExitifsave[i]≠k) addi $s3,$s3,1 #i=i+1 j Loop

#

goto

LoopExit:匯編程序使編譯器和匯編語言程序員不必計(jì)算分支指令地址,只要用標(biāo)號(hào)即可!由匯編器完成地址計(jì)算§2.8計(jì)算機(jī)硬件支持的過程(SupportingProceduresinComputerHardware)過程或函數(shù)是C或Java程序員進(jìn)行結(jié)構(gòu)化編程的手段,有助于提高程序可讀性和代碼可重用性過程允許程序員使用參數(shù)將過程與其余的程序和數(shù)據(jù)分離,只允許傳值和返回結(jié)果MIPS軟件為過程調(diào)用分配32位寄存器$a0~$a3:四個(gè)參數(shù)寄存器,用于傳遞參數(shù)$v0~$v1:兩個(gè)儲(chǔ)值寄存器,用于保存返回值$ra:一個(gè)返回地址寄存器,用于保存返回起始點(diǎn)MIPS匯編語言包含一個(gè)過程指令:跳轉(zhuǎn)到某個(gè)地址的同時(shí)將下一條指令的地址保存在寄存器$ra跳轉(zhuǎn)—鏈接指令:jal ProcedureAddress過程調(diào)用舉例例:int

i;voidset_array(intnum){intarray[10];for(i=0;i<10;i++){ arrar[i]=compare(num,i);} }intcompare(inta,intb){ if(sub(a,b)>=0) return1;else return0;}intsub(inta,intb){returna-b;}compare是調(diào)用過程sub是被調(diào)用過程i是全局靜態(tài)變量array數(shù)組是局部變量問題:過程調(diào)用對(duì)應(yīng)的機(jī)器代碼如何表示?需要解決:如何從調(diào)用程序把參數(shù)傳遞到被調(diào)用程序?如何從調(diào)用程序轉(zhuǎn)入被調(diào)用程序執(zhí)行?如何從被調(diào)用程序返回調(diào)用程序執(zhí)行?如何保證調(diào)用程序中寄存器內(nèi)容不被破壞?set_array是調(diào)用過程compare是被調(diào)用過程ProcedureCallandStack(過程調(diào)用和棧)過程調(diào)用的執(zhí)行步驟(假定過程P調(diào)用過程Q):將參數(shù)放到Q能訪問到的地方將P中的返回地址存到特定的地方,控制轉(zhuǎn)入過程Q為Q的局部變量分配空間(局部變量臨時(shí)保存在棧中)執(zhí)行過程Q將Q執(zhí)行的返回結(jié)果放到P能訪問到的地方從$ra取出返回地址,控制轉(zhuǎn)入P,即返回到P中執(zhí)行MIPS規(guī)定少量過程調(diào)用信息用寄存器傳遞若過程中用的參數(shù)超過4個(gè),返回值超過2個(gè),怎么辦?更多的參數(shù)和返回值要保存到存儲(chǔ)器的特殊區(qū)域中這個(gè)特殊區(qū)域是:棧(Stack)一般用“?!眮韨鬟f參數(shù)、保存返回地址、臨時(shí)存放過程的局部變量等。為什么?在被調(diào)用過程Q中完成便于遞歸調(diào)用!調(diào)用過程P中完成葉過程:沒有調(diào)用其他過程的過程非葉過程:過程調(diào)用其他過程遞歸過程甚至調(diào)用的是自身的“克隆”一個(gè)C的變量就是一個(gè)存儲(chǔ)位置,取決于其類型和存儲(chǔ)方式類型:整型、字符型存儲(chǔ)方式:動(dòng)態(tài)(動(dòng)態(tài)變量位于過程中,當(dāng)過程退出時(shí)失效)、靜態(tài)(靜態(tài)變量在進(jìn)入和退出過程時(shí)始終存在。在所有過程之外聲明的C變量及聲明使用關(guān)鍵字static的變量都視作靜態(tài))嵌套過程(NestedProcedures)棧中為新數(shù)據(jù)分配空間(AllocatingSpaceforNewDataontheStack)棧需要保存一些局部變量過程幀(活動(dòng)記錄):棧中包含過程保存的寄存器和局部變量的段過程調(diào)用之前、中間和之后的棧的狀態(tài)MIPS程序和數(shù)據(jù)的內(nèi)存分配堆中為新數(shù)據(jù)分配空間(AllocatingSpaceforNewDataontheHeap)C程序員需要在內(nèi)存中留有靜態(tài)變量和動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)的空間靜態(tài)數(shù)據(jù)段:用于存儲(chǔ)常量和其他靜態(tài)變量的空間。數(shù)組通常具有固定長(zhǎng)度,與靜態(tài)數(shù)據(jù)段很好匹配類似鏈表的數(shù)據(jù)結(jié)構(gòu),通常會(huì)隨著生命期增長(zhǎng)和縮短,動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)的段稱為堆(heap)。向上增長(zhǎng)至棧C語言通過顯式的函數(shù)調(diào)用在堆上分配和釋放空間malloc():在堆上分配空間并返回指向它的指針free():釋放指針指向的棧空間內(nèi)存分配由C程序控制,可能導(dǎo)致的問題有:內(nèi)存泄漏:忘記釋放空間,逐漸消耗內(nèi)存使操作系統(tǒng)崩潰指針懸?。和洺跏蓟羔樆蜻^早釋放空間,造成指針指向程序從未訪問的位置§2.10對(duì)32位立即數(shù)的MIPS編址和尋址(MIPSAddressingfor32-BitImmediateandAddresses)32位立即數(shù)指令loadupperimmediate(lui)專用于給寄存器中的常量設(shè)置高16位,允許后續(xù)指令設(shè)定常量的低16位分支和跳轉(zhuǎn)中的尋址MIPS跳轉(zhuǎn)指令條件分支指令——指定兩個(gè)操作數(shù)和分支地址PC相對(duì)尋址對(duì)32位立即數(shù)的MIPS編址和尋址舉例例:描述MIPS機(jī)器語言中的分支偏移Loop: sll $t1,$s3,2 #$t1=4*i add $t1,$t1,$s6 #$t1=addressofsave[i] lw $t0,0($t1) #$t0=save[i] bne $t0,$s5,Exit #gotoExitifsave[i]≠k) addi $s3,$s3,1 #i=i+1 j Loop #gotoLoopExit:編譯器將C程序轉(zhuǎn)換成一種機(jī)器能理解的符號(hào)形式的匯編語言程序。不同的高級(jí)語言有不同的編譯器,但在同臺(tái)機(jī)器生成的匯編語言一樣每臺(tái)機(jī)器的匯編程序的功能一樣,與高級(jí)語言無關(guān)。匯編程序經(jīng)過匯編處理后生成目標(biāo)文件。目標(biāo)程序文件就是編譯程序和匯編程序?qū)Ω呒?jí)語言源程序進(jìn)行翻譯處理所得到的機(jī)器語言程序(指令、數(shù)據(jù)及鏈接說明信息)把所有獨(dú)立匯編好的機(jī)器語言程序(包括庫(kù)例程)的目標(biāo)文件“拼接”在一起生成一個(gè)可執(zhí)行文件從磁盤中讀取可執(zhí)行文件到存儲(chǔ)器,啟動(dòng)執(zhí)行如何鏈接?如何分配代碼和數(shù)據(jù)地址?可執(zhí)行程序文件是通過裝入程序直接裝入存儲(chǔ)器執(zhí)行的文件

。它要說明代碼和數(shù)據(jù)區(qū)多大,并給出每條指令的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論