《计算机组成原理》第2章 计算机语言_第1页
《计算机组成原理》第2章 计算机语言_第2页
《计算机组成原理》第2章 计算机语言_第3页
《计算机组成原理》第2章 计算机语言_第4页
《计算机组成原理》第2章 计算机语言_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目前使用或曾经使用本教材国内高校浙江大学、武汉大学、东华理工大学、北京大学、上海交通大学、电子科技大学、吉林大学、北京师范大学、中央财经大学、华东师范大学、中国地质大学、哈尔滨工业大学、合肥工业大学、中山大学、重庆大学、太原科技大学、北京科技大学、西北工业大学

等Chapter2指令:计算机的语言本章概要计算机硬件的操作计算机硬件的操作数有符号和无符号数计算机中指令的表示逻辑操作决策指令计算机硬件对过程的支持人机交互MIPS中32位立即数和地址的寻址并行与指令:同步翻译并执行程序以一个C排序程序为例数组与指针Chapter2—Instructions:LanguageoftheComputer—3类别指令Instruction示例含义注释算术加法addadd$s1,$s2,$s3$s1=$s2+$s3三个寄存器操作数减法subtractsub$s1,$s2,$s3$s1=$s2-$s3三个寄存器操作数立即数加法addimmediateaddi$s1,$s2,20$s1=$s2+20加常数类别指令Instruction示例含义注释取数

取字loadwordlw$s1,20($s2)$s1=Memory[$s2+20]内存字寄存器取半字loadhalflh$s1,20($s2)$s1=Memory[$s2+20]内存半字寄存器取无符号半字loadhalfunsignedlhu$s1,20($s2)$s1=Memory[$s2+20]内存半字寄存器取字节loadbytelb$s1,20($s2)$s1=Memory[$s2+20]内存字节寄存器取链接字loadlinkedwordll$s1,20($s2)$s1=Memory[$s2+20]取字作为原子交换的前半部取立即数的高位loadupperimmediatelui$s1,20$s1=20×216取常数并放到高16位存数存字storewordsw$s1,20($s2)Memory[$s2+20]=$s1寄存器字内存存半字storehalfsh$s1,20($s2)Memory[$s2+20]=$s1寄存器半字内存存字节storebytesb$s1,20($s2)Memory[$s2+20]=$s1寄存器字节内存存条件字storeconditionwordsc$s1,20($s3)Memory[$s2+20]=$s1

$s1=0or1存字作为原子交换的后半部类别指令Instruction示例含义注释逻辑与andand$s1,$s2,$s3$s1=$s2&$s3三个寄存器操作数按位与或oror$s1,$s2,$s3$s1=$s2|$s3三个寄存器操作数按位或或非nornor$s1,$s2,$s3$s1=~($s2|$s3)三个寄存器操作数按位或非立即数与andimmediateand$s1,$s2,20$s1=$s2&20和常数按位与立即数或orimmediateor$s1,$s2,20$s1=$s2|20和常数按位或逻辑左移shiftleftlogicalsll$s1,$s2,10$s1=$s2<<10根据常数左移相应位逻辑右移shiftrightlogicalsrl$s1,$s2,10$s1=$s2>>10根据常数右移相应位类别指令Instruction示例含义注释条件分支相等时跳转branchonequalbeq$s1,$s2,25if($s1=$s2)gotoPC+4+100相等检测;

和PC相关的跳转不相等时跳转branchonnotequalbne$s1,$s2,25if($s1!=$s2)gotoPC+4+100不相等检测;

和PC相关的跳转小于时置位setonlessthanslt$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比较是否小于:无符号数比较小于时置位setonlessthanunsignedsltu$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比较是否小于无符号数无符号数比较小于立即数时置位setlessthanimmediateslti$s1,$s2,20if($s2<20)$s1=1else$s1=0比较是否小于常数无符号数比较小于无符号立即数时置位setlessthanimmediateunsignedsltiu$s1,$s2,20if($s2<20)$s1=1else$s1=0比较是否小于无符号常数Chapter2—Instructions:LanguageoftheComputer—4类别指令Instruction示例含义注释算术加法addadd$s1,$s2,$s3$s1=$s2+$s3减法subtractsub$s1,$s2,$s3$s1=$s2-$s3三个寄存器操作数立即数加法addimmediateaddi$s1,$s2,20$s1=$s2+20加常数取数

取字loadwordlw$s1,20($s2)$s1=Memory[$s2+20]内存字寄存器取半字loadhalflh$s1,20($s2)$s1=Memory[$s2+20]内存半字寄存器取无符号半字loadhalfunsignedlhu$s1,20($s2)$s1=Memory[$s2+20]内存半字寄存器取字节loadbytelb$s1,20($s2)$s1=Memory[$s2+20]内存字节寄存器取链接字loadlinkedwordll$s1,20($s2)$s1=Memory[$s2+20]取字作为原子交换的前半部取立即数的高位loadupperimmediatelui$s1,20$s1=20×216取常数并放到高16位存数存字storewordsw$s1,20($s2)Memory[$s2+20]=$s1寄存器字内存存半字storehalfsh$s1,20($s2)Memory[$s2+20]=$s1寄存器半字内存存字节storebytesb$s1,20($s2)Memory[$s2+20]=$s1寄存器字节内存存条件字storeconditionwordsc$s1,20($s3)Memory[$s2+20]=$s1

$s1=0or1存字作为原子交换的后半部逻辑与andand$s1,$s2,$s3$s1=$s2&$s3三个寄存器操作数按位与或oror$s1,$s2,$s3$s1=$s2|$s3三个寄存器操作数按位或或非nornor$s1,$s2,$s3$s1=~($s2|$s3)三个寄存器操作数按位或非立即数与andimmediateand$s1,$s2,20$s1=$s2&20和常数按位与立即数或orimmediateor$s1,$s2,20$s1=$s2|20和常数按位或逻辑左移shiftleftlogicalsll$s1,$s2,10$s1=$s2<<10根据常数左移相应位逻辑右移shiftrightlogicalsrl$s1,$s2,10$s1=$s2>>10根据常数右移相应位条件分支相等时跳转branchonequalbeq$s1,$s2,25if($s1=$s2)gotoPC+4+100相等检测;

和PC相关的跳转不相等时跳转branchonnotequalbne$s1,$s2,25if($s1!=$s2)gotoPC+4+100不相等检测;

和PC相关的跳转小于时置位setonlessthanslt$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比较是否小于:无符号数比较小于时置位setonlessthanunsignedsltu$s1,$s2,$s3if($s2<$s3)$s1=1else$s1=0比较是否小于无符号数无符号数比较小于立即数时置位setlessthanimmediateslti$s1,$s2,20if($s2<20)$s1=1else$s1=0比较是否小于常数无符号数比较小于无符号立即数时置位setlessthanimmediateunsignedsltiu$s1,$s2,20if($s2<20)$s1=1else$s1=0比较是否小于无符号常数无条件跳转跳转jumpj2500goto10000跳转到目标地址跳转至寄存器所指位置jumpregisterjr$ragoto$ra用于switch语句,以及过程调用跳转并链接jumpandlinkjal2500$ra=PC+4;goto10000用于过程调用Chapter2—Instructions:LanguageoftheComputer—5指令集一台计算机的全部指令不同计算机有不同的指令集但有许多共同的方面指令集目标方便硬件、编译器的设计性能最佳、成本和功耗最低早期计算机有很简单的指令集实现简单许多现代计算机也有简单指令集例如:ARM系列计算机(RSIC)§2.1IntroductionChapter2—Instructions:LanguageoftheComputer—6MIPS指令集用于编写书中的例子使用的是MIPS语言斯坦福大学的MIPS来自MIPS公司()在嵌入式处理机市场中占有很大的份额广泛地应用在家用电器、网络/存储设备,照相机,打印机…许多现代指令集的代表参见MIPS参考数据卡和附录B和E。ThefinalISAshowdown:IsARM,x86,orMIPSintrinsicallymorepowerefficient?Chapter2—Instructions:LanguageoftheComputer—7MIPS操作数名字举例寄存器号注释32个寄存器$zero0常数0$at1汇编器保留$v0~$v12-3计算结果和表达式求值$a0~$a34-7参数$t0~$t78-15临时变量$s0~$s716-23保留寄存器$t8~$t924-25更多临时变量$k0~$k126-27操作系统保留$gp28全局指针$sp29栈指针$fp30帧指针$ra31返回地址230

个存储器字Memory[0],Memory[4],…,Memory[4294976292]Chapter2—Instructions:LanguageoftheComputer—8Chapter2—Instructions:LanguageoftheComputer—9算术运算操作加法和减法,都是三操作数两个源操作数,一个目的操作数 adda,b,c#a=b+c注释用#开头所有的算术运算都是这样的形式设计原则一:简单源于规整规整使实现简单简单能获得低成本高性能§2.2OperationsoftheComputerHardware类别指令Instruction示例含义注释算术加法addadd$s1,$s2,$s3$s1=$s2+$s3三个寄存器操作数减法subtractsub$s1,$s2,$s3$s1=$s2-$s3三个寄存器操作数立即数加法addimmediateaddi$s1,$s2,20$s1=$s2+20加常数Chapter2—Instructions:LanguageoftheComputer—10算术操作例子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寄存器操作数算术运算指令使用寄存器操作MIPS有32个32位寄存器用于存储频繁使用的数据编号0到3132位数码称为一个字编译时名称的约定$t0,$t1,…,$t9表示临时寄存器$s0,$s1,…,$s7用于存储变量设计原则二:越少越快对照主存:数以百万计的存储位置§2.3OperandsoftheComputerHardware举例寄存器号注释$zero0常数0$at1汇编器保留$v0~$v12-3计算结果和表达式求值$a0~$a34-7参数$t0~$t78-15临时变量$s0~$s716-23保留寄存器$t8~$t924-25更多临时变量$k0~$k126-27操作系统保留$gp28全局指针$sp29栈指针$fp30帧指针$ra31返回地址Chapter2—Instructions:LanguageoftheComputer—12寄存器操作数举例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存储器操作数主存可以存储复杂数据数组,结构,动态数据使用算术运算操作数从主存把数读入到寄存器把结果从寄存器存储到主存存储器按字节编址每个地址表示一个8位字节按字存放在内存每个地址必须是4个字节MIPS按大端编址高位存放在低地址对照小端模式:低位放到低地址地址偏移大端模式小端模式0x0012(OP0)34(OP1)0x0134(OP1)12(OP0)如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。Chapter2—Instructions:LanguageoftheComputer—14类别指令Instruction示例含义注释取数

取字loadwordlw$s1,20($s2)$s1=Memory[$s2+20]内存字寄存器取半字loadhalflh$s1,20($s2)$s1=Memory[$s2+20]内存半字寄存器取无符号半字loadhalfunsignedlhu$s1,20($s2)$s1=Memory[$s2+20]内存半字寄存器取字节loadbytelb$s1,20($s2)$s1=Memory[$s2+20]内存字节寄存器取链接字loadlinkedwordll$s1,20($s2)$s1=Memory[$s2+20]取字作为原子交换的前半部取立即数的高位loadupperimmediatelui$s1,20$s1=20×216取常数并放到高16位存数存字storewordsw$s1,20($s2)Memory[$s2+20]=$s1寄存器字内存存半字storehalfsh$s1,20($s2)Memory[$s2+20]=$s1寄存器半字内存存字节storebytesb$s1,20($s2)Memory[$s2+20]=$s1寄存器字节内存存条件字storeconditionwordsc$s1,20($s3)Memory[$s2+20]=$s1

$s1=0or1存字作为原子交换的后半部Chapter2—Instructions:LanguageoftheComputer—15存储器操作数举例1Ccode: g=h+A[8];g在$s1,h在$s2,A的基址在$s3编译成MIPS代码:小标8(数组第8个分量)需要32的偏移每个字对应4个字节 lw$t0,32($s3)#loadword

add$s1,$s2,$t0偏移量offset基址寄存器BaseregisterChapter2—Instructions:LanguageoftheComputer—16存储器操作数举例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寄存器和主存储器寄存器的访问速度比主存快得多对主存储器数据的操作要用取数指令lw(loadword)存数指令sw(storeword)。需要执行更多的指令编译器必须尽量使用寄存器访问变量仅当寄存器不够用时才把不经常使用的变量放到内存;寄存器的高效利用对系统优化非常重要。Chapter2—Instructions:LanguageoftheComputer—18常数或立即数操作数指令中使用常数 addi$s3,$s3,4(immediate)没有减去立即数的减法指令可以使用负常数,即“加负数”实现减法 addi$s2,$s1,-1设计规则三:加速执行常用操作小常数操作出现的频率高立即数操作不用到内存取数Chapter2—Instructions:LanguageoftheComputer—19常数零MIPS寄存器0($zero)表示常数0不能被改写在常用的操作中,很有用例如,可在寄存器之间传送数据

add$t2,$s1,$zeroChapter2—Instructions:LanguageoftheComputer—20二进制无符号整数给定一个n位数范围:0to+2n–1举例000000000000000000000000000010112

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

=0+…+8+0+2+1=111032位数0to+4,294,967,295§2.4SignedandUnsignedNumbersChapter2—Instructions:LanguageoftheComputer—21二进制补码表示有符号整数x是一个n位数范围:–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位数–2,147,483,648to+2,147,483,647Chapter2—Instructions:LanguageoftheComputer—22二进制补码表示有符号整数31位是符号位1表示负数0表示非负–(–2n–1)不能表示非负数的无符号数和二进制补码是相同的一些特殊的数0: 00000000…0000–1: 11111111…1111绝对值最大负数: 10000000…0000最大正数: 01111111…1111Chapter2—Instructions:LanguageoftheComputer—23有符号数(二进制补码)的取反取反加1取反的含义1→0,0→1举例:对+2的求反+2=00000000…00102–2=11111111…11012+1

=11111111…11102Chapter2—Instructions:LanguageoftheComputer—24符号扩展使用更多的位表示一个数数值保持不变在MIPS指令集中addi:extendimmediatevalue扩展到立即数lb,lh:extendloadedbyte/halfword扩展到取字节/半字beq,bne:扩展到跳转后的位置extendthedisplacement相等/不相等跳转复制符号位到左侧对照无符号数:用0扩充举例:8-bitto16-bit+2:00000010=>0000000000000010–2:11111110=>1111111111111110Chapter2—Instructions:LanguageoftheComputer—25指令表示指令用二进制编码称为机器代码MIPS指令32位指令字编码指令格式中若干字段分别用于表示操作码,寄存器编号,…非常规整寄存器编号【参考教材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:移位位数(00000表示不移位)funct:功能码(扩展操作码)(extendsopcode)oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—28R-型(寄存器)操作举例 add$t0,$s1,$s2special$s1$s2$t00add01718803200000010001100100100000000100000000000100011001001000000001000002=0232402016oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—29十六进制基底是16二进制串的压缩表示(使用16进制的原因)四位二进制组成一个十六进制数000004010081000c1100100015010191001d11012001060110a1010e11103001170111b1011f1111Example:eca8642011101100101010000110010000100000Chapter2—Instructions:LanguageoftheComputer—30MIPSI型(立即数指令)立即数的算术和读数/存数指令rt:目的或源寄存器编号常数的取值范围:–215to+215

–1地址:偏移加上rs中的基址设计原则4:优秀的设计需要适宜的折中方案不同类型指令采用不同的解码方式,但都是32位相同的指令长度尽可能保持相似的指令格式oprsrtconstantoraddress6bits5bits5bits16bits指令格式举例1如果数组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存储程序指令用二进制表示,像数一样指令和数据存储在存储器中程序可以被其他程序操作例如,编译,连接,…“二进制兼容”可以让编译后的程序运行在不同的计算机上标准的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(仅对无符号数)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-操作数指令NORaNORb==NOT(aORb)“或非” nor$t0,$t1,$zero00000000000000000011110000000000$t111111111111111111100001111111111$t0Register0:alwaysreadaszeroChapter2—Instructions:LanguageoftheComputer—40决策指令如果条件为真,跳转到被标签的指令执行否则,继续执行beqrs,rt,L1if(rs==rt)转到标签为L1的指令执行bners,rt,L1if(rs!=rt)转到标签为L1的指令执行;jL1无条件跳转到标签为L1的指令执行§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编译循环语句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基本块一个基本块是一个指令序列,其中内部没有跳出的指令(结束指令除外)也没有被跳转到的指令(开始指令除外)编译器标识基本快用于优化高级处理机能够加速基本块的执行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可以和其他指令结合使用 slt$t0,$s1,$s2#if($s1<$s2)$t0=1;

bne$t0,$zero,L#$t0notequaltozerobranchtoLChapter2—Instructions:LanguageoftheComputer—45分支指令设计为什么没有blt,bge等指令?硬件执行<,≥,…比=,≠慢指令中结合分支指令包含更多工作,需要更慢的时钟所有指令都受到了影响Beq和bne是较常用的这是一个很好的设计折中方案Chapter2—Instructions:LanguageoftheComputer—46有符号数和无符号数对比有符号数比较:slt,slti无符号数比较: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过程调用遵循步骤将参数放在过程可以访问的寄存器里将控制转移给过程获得过程所需要的存储资源执行过程的操作(请求的任务)将结果的值放在调用程序可以访问到的寄存器将控制返回到调用点§2.8SupportingProceduresinComputerHardwareChapter2—Instructions:LanguageoftheComputer—48寄存器的使用$a0–$a3:传递参数(reg’s4–7)$v0,$v1:返回结果值(reg’s2and3)$t0–$t9:临时寄存器可以被调用者改写$s0–$s7:保存参数必须被调用者保存和恢复$gp:静态数据的全局指针寄存器(reg28)globalpointerforstaticdata(reg28)$sp:堆栈指针寄存器stackpointer(reg29)$fp:帧指针寄存器(framepointer),保存过程帧的第一个字(reg30)$ra:返回地址寄存器returnaddress(reg31)Chapter2—Instructions:LanguageoftheComputer—49过程调用指令过程调用:跳转和链接 jalProcedureLabel下一条指令的地址在寄存器$ra中跳转到目标地址过程返回:寄存器跳转jumpregister jr$ra拷贝$ra到程序计数器也被用于运算后跳转例如用于case/switcg分支语句e.gChapter2—Instructions:LanguageoftheComputer—50不调用其他过程(叶过程)例子Ccode: intleaf_example(intg,h,i,j)

{intf;

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

returnf;

}参数g,…,j在$a0,…,$a3中f在$s0(因此,需要存储$s0到堆栈)结果在$v0Chapter2—Instructions:LanguageoftheComputer—51不调用其他过程的例子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结果(s0----v0)返回参数g,…,j在$a0,…,$a3中;f在$s0(因此,需要存储$s0到堆栈);结果在$v0g+h----t0Chapter2—Instructions:LanguageoftheComputer—52嵌套过程—非叶过程(Non-LeafProcedures)过程调用其他过程对于嵌套调用,调用者需要存储到堆栈的信息:它的返回地址调用后还需要用的任何参数寄存器和临时寄存器调用后返回,寄存器会从堆栈中恢复Chapter2—Instructions:LanguageoftheComputer—53嵌套过程举例Non-LeafProcedureExampleCcode: intfact(intn)

{

if(n<1)returnf;

elsereturnn*fact(n-1);

}参数n放在

$a0结果放在$v0Chapter2—Instructions:LanguageoftheComputer—54嵌套过程举例Non-LeafProcedureExampleMIPScode: fact:

addi$sp,$sp,-8#adjuststackfor2items

sw$ra,4($sp)#savereturnaddress

sw$a0,0($sp)#saveargument(存参数)

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(递归调用)

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堆栈中的局部数据LocalDataontheStack局部数据有调用者分配e.g.,C自动分配变量过程帧(活动记录)被一些编译器使用控制堆栈存储Chapter2—Instructions:LanguageoftheComputer—56内存布局MemoryLayout正文:程序代码静态数据:全局变量e.g.,C语言静态变量,常数数组和字符串$gp初始化地址,允许段内的±偏移动态数据:堆堆栈:自动存储Chapter2—Instructions:LanguageoftheComputer—57字符数据(包括汉字)字节编码的字符集ASCII:128个95graphic,33controlLatin-1:256个ASCII,+96moregraphiccharactersUnicode:32位字符集UsedinJava,C++widecharacters,…宽字符世界上大多数字母表UTF-8,UTF-16:可变长度编码§2.9CommunicatingwithPeopleChapter2—Instructions:LanguageoftheComputer—58字节/半字操作Byte/HalfwordOperations使用位操作MIPS字节/半字读取/存储字符串处理是较常用的方式lbrt,offset(rs)lhrt,offset(rs)Signextendto32bitsinrtlburt,offset(rs)lhurt,offset(rs)Zeroextendto32bitsinrtsbrt,offset(rs)shrt,offset(rs)存储恰恰是字节或半子的形式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调整堆栈指针,

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位常数32-bitConstants大部分常数都比较小,16位表示立即数足够了,偶尔使用32位常数。

luirt,constant取立即数并放到高16位lui$s0,

6100000000011111010000100100000000ori$s0,$s0,2304§2.10MIPSAddressingfor32-BitImmediatesandAddressesOri立即数或,$s0与常数2304“或”,结果放在$s0形成一个32位的常数Chapter2—Instructions:LanguageoftheComputer—62分支地址BranchAddressing分支指令说明操作吗,两个寄存器,两个地址大多数跳转目标离跳出的位置较近向前或向后oprsrtconstantoraddress6bits5bits5bits16bitsPC相对寻址目标地址=PC+offset×4此时PC的增加量是4的倍数PC作为增加地址的寄存器原因Chapter2—Instructions:LanguageoftheComputer—63Chapter2—Instructions:LanguageoftheComputer—64跳转地址JumpAddressing跳转(j和jal)的目标地址可以在代码段的任何位置指令除op外,指令其它字段都是地址opaddress6bits26bits直接跳转到地址Targetaddress=PC31…28:(address×4)28位4位Chapter2—Instructions:LanguageoftheComputer—65目标地址TargetAddressingExample早期例子的循环代码设循环的起始地址是8000Loop:sll$t1,$s3,2800000019920add$t1,$t1,$s68000409229032lw$t0,0($t1)8000835980bne$t0,$s5,Exit8001258212addi$s3,$s3,180016819191jLoop80020220000Exit:…80024Chapter2—Instructions:LanguageoftheComputer—66远程分支BranchingFarAway如果跳转对象地址太大无法用16位的偏移表示,汇编将重写代码【把短跳转(216范围)变成长跳转(226

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

bne$s0,$s1,L2

jL1

L2: …常用的寻址方式寄存器型:直接、间接;存储器型:直接、间接;计算型:相对、基址、变址;立即数型;Chapter2—Instructions:LanguageoftheComputer—68地址模式总结AddressingModeSummaryChapter2—Instructions:LanguageoftheComputer—692.11并行与指令:同步处理器共享存储器同一区域P1写,P2读(任务1写的结果是任务2要读取得值)如果P1和P2不同步,将发生数据竞争结果由访问次序决定依赖硬件提供同步指令(例如:lock和unlock指令,控制一个“互斥区”)多核处理器的情况下:任务1Sw$t0,0($s0)任务2Lw$t1,0($s0)此时,任务2和任务1必须同步,否则,无法判断$t1中读取的是$t0,还是0($s0)单元以前的数值。§2.11ParallelismandInstructions:SynchronizationChapter2—Instructions:LanguageoftheComputer—702.11并行与指令:同步原子读/写内存操作在读和写之间,不再允许对该空间的其他操作可以是单一的指令例如寄存器和内存之间的原子交换或者指令的原子配对§2.11ParallelismandInstructions:SynchronizationChapter2—Instructions:LanguageoftheComputer—71MIPS中的同步SynchronizationinMIPS

链接取数(Loadlinked)ll

rt,offset(rs)条件存数(Storeconditional)scrt,offset(rs)如果ll指令没改变该地址内容则成功,rt返回1;如果被改变了,则失败,rt返回0;例如:atomicswap(检测和设置锁变量)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编译并执行程序TranslationandStartup许多编译器直接产生目标模块静态链接§2.12TranslatingandStartingaProgramChapter2—Instructions:LanguageoftheComputer—73汇编伪指令AssemblerPseudoInstructions大多数汇编指令和机器指令是一对一的特殊的是伪指令伪指令:汇编指令的变种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汇编器(或编译器)把程序翻译成机器语言提供从部分构建完整程序的信息

目标文件头:描述目标文件其他部分的大小和位置正文段:翻译后的指令,包含机器语言代码静态数据段:包含在程序生命周期内分配的数据重定位信息,标记了一些程序加载进内存时依赖于绝对地址的指令和数据符号表,全局定义和外部引用调试信息:用于关联源文件Chapter2—Instructions:LanguageoftheComputer—75链接目标模块LinkingObjectModules产生一个可执行的映像1.

合并段(代码和数据数据库象征性放入内存)2.

决定数据和指令标签的地址3.

修补引用(内部和外部引用)可以留下依靠重定位程序修复的部分但虚拟内存,不需要做这些虚拟内存空间,程序必须以绝对地址装入Chapter2—Instructions:LanguageoftheComputer—76加载程序LoadingaProgram把待执行的程序从硬盘的镜像文件读入内存1.

读取可执行文件头来确定正文段和数据段的大小2.为正文和数据创建一个足够大的地址空间3.

把指令和初始数据拷贝到内存或者设置页表项,使它们可用4.

把主程序的参数复制到栈顶5.

初始化寄存器(包括堆栈指针$sp,帧指针$fp,全局指针$gp)6.

跳转到启动进程复制参数到寄存器并调用主函数main主函数返回时,通过系统调用exit终止程序Chapter2—Instructions:LanguageoftheComputer—77动态链接库DynamicLinking调用时,只是连接或装入库文件过程代码重定位;避免所有程序中出现的链接库;但是这些库的信息是一次性代入内存,占用内存空间。只是在用到的时候才链接该库;自动装入最新的编译器中的版本的动态库。Chapter2—Instructions:LanguageoftheComputer—78晚过程连接LazyLinkage

(只是在用到的时候才链接该库)IndirectiontableStub:LoadsroutineID,

Jumptolinker/loaderLinker/loadercodeDynamically

mappedcodeChapter2—Instructions:LanguageoftheComputer—79启动一个Java程序StartingJavaApplicationsSimpleportableinstructionsetfortheJVMInterpretsbytecodesCompilesbytecodesof“hot”methodsintonativecodeforhostmachineChapter2—Instructions:LanguageoftheComputer—80CSortExample使用汇编指令的冒泡排序(交换内存中两个位置所存的值)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(按照字节编址)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代码(按照字节编址)1、为程序变量分配寄存器;【vin$a0,kin$a1,tempin$t0】2、为过程体生成汇编代码;3、保存过程调用间的寄存器(本例中没有用到,因为本例是一个叶过程);Chapter2—Instructions:LanguageoftheComputer—82编译优化的影响EffectofCompilerOptimization1、编译时间2、指令数;3、时钟周期4、CPI5、算法执行时间是准确衡量程序性能的唯一标准Chapter2—Instructions:LanguageoftheComputer—83经验教训LessonsLearnt单独的指令数或CPI不能很好的描述性能编译器优化对算法敏感对比Java虚拟机解释Java/JIT编译代码已经足够快了某些情况要对编译完C进行优化没什么能修复一个垃圾算法Chapter2—Instructions:LanguageoftheComputer—84数组和指针【简单介绍】数组下标计算包括下标乘以元素长度加上数组基址指针直接对应内存能避免下标计算的麻烦§2.14ArraysversusPointersChapter2—Instructions:LanguageoftheComputer—85例子:数组和指针实现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数组与指针的比较

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论