复习参考版计算机原理standard第2章3讲_第1页
复习参考版计算机原理standard第2章3讲_第2页
复习参考版计算机原理standard第2章3讲_第3页
复习参考版计算机原理standard第2章3讲_第4页
复习参考版计算机原理standard第2章3讲_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

重点内容本节概要第二章指令:计算机的语言

2.4程序的机器级表示MIPS指令系统MIPS汇编语言形式机器语言的解码(反汇编)计算机硬件支持的过程转换和启动一个程序基本要求掌握MIPS指令格式及其应用了解计算机中程序的转换和启动回顾内容2.2指令格式操作码结构操作码的编码方式定长操作码扩展操作码地址码结构堆栈结构:零地址指令累加器结构:一地址指令通用寄存器结构:二、三地址指令2.3寻址方式基本寻址方式立即/直接/间接/寄存器/寄存器间接/偏移/堆栈复杂寻址方式指令设计风格:CISC和RISC上节回顾

《ComputerOrganizationandDesign》

P1962.18.2、2.18.5、P2032.24.1、P2052.25.6、2.26.1、2.26.2题补充题

《ComputerOrganizationandDesign》第2章第5~12节相关资料

基于MIPS指令的程序机器级表示及应用其它指令系统:X86指令、ARM指令

拓展阅读作业2.4程序的机器级表示存储器大小:32字 (可扩充到8K字)机器字长:32位提供6条指令:jumploadaccumulatorsubtractstoreaccumulatortestforzerostop1944年哈佛大学,MarkI

——世界最早的通用机之一 (长15米,高2.4米)MIPS指令格式R-类型/I-类型/J-类型MIPS寄存器长度/个数/功能分配MIPS操作数寄存器操作数/存储器操作数/立即数/文本/位MIPS指令寻址方式立即数/寄存器/相对/伪直接/偏移五种寻址MIPS指令类型算术/逻辑/数据传送/条件分支/无条件转移

MIPS汇编语言形式操作码的表示/寄存器的表示/存储器数据表示高级语言、汇编语言、机器语言之间的转换过程调用与堆/栈2.4程序的机器级表示MIPS指令格式所有指令都是32位宽,按字地址对齐三种指令格式R-Type两个操作数都是寄存器的运算指令。如:subrd,rs,rtI-Type运算指令:一个寄存器、一个立即数。如:orirt,rs,imm16Load和Store指令。如:lwrt,rs,imm16条件分支指令。如:beqrs,rt,imm16J-Type无条件跳转指令。如:jtargetoprsrtrdshamtfunct0611162126316bits6bits5bits5bits5bits5bits

oprsrtimmediate0162126316bits16bits5bits5bits

optargetaddress026316bits26bits

MIPS指令字段含义OP:操作码rs:第一个源操作数寄存器rt:第二个源操作数寄存器rd:结果寄存器shamt:移位指令 的位移量func:R-Type指令的OP字段特定为“000000”,具体操作由func字段给定。如:func=“100000”表示“加法”运算。immediate:立即数或load/store指令或分支指令的偏移地址targetaddress:无条件转移地址低26位。将PC高4位拼上26位直接地址,最后添2个“0”就是32位目标地址。为什么要添“0”?oprsrtrdshamtfunct0611162126316bits6bits5bits5bits5bits5bitsR-Type指令oprsrtimmediate0162126316bits16bits5bits5bitsI-Type指令optargetaddress026316bits26bitsJ-Type指令操作码的不同编码定义了不同的含义,若操作码相同时,再用不同编码的功能码来定义不同的含义!MIPS寻址方式R-format:I-format:I-format:I-format:J-format:举例:汇编指令与机器指令的对应例1:若MIPSAssemblyInstruction:

add$t0,$s1,$s2则对应MIPS的机器指令是什么?oprsrtrd

funcsmt655565017188320655565Decimalrepresentaton:$s1$s2$t0R-TypeaddNoshiftBinaryrepresentaton:00000010001100100100010000000000655565这个过程称为“汇编”,所有汇编源程序都必须汇编成二进制机器代码问题:如何知道是R型指令?汇编器?根据汇编指令中的操作码助记符查表知道是何格式!从助记符表中查到add是R型指令,即:例2:若从存储器取出的一条指令是00AF8020H,则对应的汇编指令是什么?指令的前6位为000000,根据指令解码表知,是一条R-Type指令,按照R-Type指令的格式:

得到:rs=00101,rt=01111,rd=10000,shamt=0,funct=100000(1)根据R-Type指令解码表,知是“add”操作(非移位操作)(2)rs、rt、rd的十进制值分别为5、15、16,从MIPS寄存器功能表知:

rs、rt、rd分别为:$a1、$t7、$s0故对应的汇编形式为:

add$s0,$a1,$t7举例:汇编指令与机器指令的对应oprsrtrdshamtfunct0611162126316bits6bits5bits5bits5bits5bits00000000101011111000000000100000这个过程称为“反汇编”,可用来破解二进制代码(可执行程序)32位指令代码:00000000101011111000000000100000功能:$a1+$t7→$s0MIPSCircuitsforR-TypeInstructionsMIPS指令中寄存器数据和存储器数据的指定寄存器数据指定

31×32-bitGPRs(r0=0)寄存器编号占5bit32×32-bitFPregs(f0-f31,pairedDP) HI,LO,PC:特殊寄存器

寄存器功能和2种汇编表示方式存储器数据指定

32-bitmachine→可访问空间:232bytesBigEndian(大端方式)只能通过Load/Store指令访问存储器数据数据地址通过一个32位寄存器内容加16位偏移量得到16位偏移量是有符号整数数据要求按边界对齐0r0r1...r31PClohiMIPS寄存器功能定义和两种汇编表示

NamenumberUsageReservedoncall?zero0constantvalue=0(恒为0)n.a.at1reservedforassemblern.a.v0–v12–3valuesforresults(过程调用返回值)noa0–a34–7Arguments(过程调用参数)yest0–t78–15Temporaries(临时变量)nos0–s716–23Saved(保存)yest8–t924–25moretemporaries(其他临时变量)nok0–k126–27reservedforkernel(为OS保留)n.a.gp28globalpointer(全局指针)yessp29stackpointer(栈指针)yesfp30framepointer(帧指针)yesra31returnaddress(过程调用返回地址)yeszerov0-v1a0-a3t0-t7s0-s7t8-t9gpspfpraat02-34-78---1516---2324-2528293031k0-k1126-27Registers用数字表示—$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操作数长度的不同是由不同的操作码指定。问题:为什么需要不同长度的操作数?

高级语言中的数据类型有char、short、int、long等,故需要存取不同长度的操作数;操作数长度和指令长度没有关系MIPS的call/return/jump/branch和compare指令Instruction 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

按补码比较问题:指令中立即数是多少?100=0064H问题:指令中立即数是多少?25=0019HMethodsofTestingCondition(条件测试方式)条件转移指令通常根据ConditionCodes(条件码/状态位/标志位)进行转移

通过执行算术指令或显式地由比较和测试指令来设置

例: sub

r1,r2,r3;r2和r3相减结果存r1中,生成标志位ZF/CF bzlabel; 标志位ZF=1时,转移到label处执行常用的标志有四种: NF(SF):negative VF(OF):overflow CF:carry ZF:zero标志位可存放在标志(Flag)寄存器(条件码CC寄存器/状态Status寄存器/标志寄存器/程序状态字PSW寄存器)中,也可由指定的通用寄存器来存放状态位

例: cmpr1,r2,r3;比较r2和r3,标志位存储在r1中 bgt

r1,label; 判断r1是否大于0,是则转移到label处可以将两条指令合成一条指令,即:计算并转移

例: bgtr1,r2,label;根据r1和r2比较结果,决定是否转移不同处理器,对标志位的处理不同!§2.2计算机硬件的操作(OperationsoftheComputerHardware)指令设计遵循的四个基本原则中的第一原则——简单源自规整将C语言赋值语句编译成MIPS例:C赋值语句:f=(g+h)-(i+j);C编译器将产生什么样的MIPS汇编语言代码?

addt0,g,h #t0=g+h addt1,i,j #t1=i+j subf,t0,t1 #f=t0-t1§2.3计算机硬件的操作数(OperandsoftheComputerHardware)算术运算指令的操作数是受限制的,必须直接取自寄存器寄存器是计算机构成的基本元素MIPS寄存器宽度:32位——字数量:32个指令设计遵循的四个基本原则中的第二原则 ——越少越快寄存器太多,硬件实现复杂,时钟周期变长§2.3计算机硬件的操作数使用寄存器编译C赋值语句例:C赋值语句:f=(g+h)-(i+j);通过C编译器将寄存器和程序变量对应起来。变量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)寄存器资源是由编译器分配!通常将简单变量尽量分配在寄存器中,为什么?存储器操作数(MemoryOperands)MIPS必须具有在存储器和寄存器之间传送数据的指令——数据传送指令取数指令(load)——把数据从存储器拷贝到寄存器的数据传送指令:lw寄存器号,存储器地址存数指令(store)——把数据从寄存器拷贝到存储器的数据传送指令:sw寄存器号,存储器地址程序的变量个数要比机器的寄存器个数多得多。怎么办?编译器尽量将最常用的变量保存在寄存器中,而将其它变量保存在存储器中寄存器换出:将不常用的变量从寄存器读出存入存储器的过程存储器操作数当操作数在存储器时,用存取指令编译C赋值语句例:假设变量h存放在寄存器$s2中,数组A的基址存放在$s3中。C赋值语句:A[12]=h+A[8];C编译器将产生什么样的MIPS汇编语言代码?

lw $t0,32($s3) #$t0←A[8] add $t0,$s2,$t0 #$t0←h+A[8] sw $t0,48($s3) #A[12]←$t0问题:如果在一个循环体内执行:g=h+A[i]

,能否用基址寻址方式?不行,因为循环体内指令不能变,故首地址A不变,只能把下标i放在变址寄存器中,每循环一次下标加1,所以,不能用基址方式而用变址方式。offsetordisplacement(偏移量)baseregister(基址寄存器)常数或者立即数操作数(ConstantorImmediateOperands)把常数作为算术运算指令的操作数提供常数操作数的快速运算指令——立即数操作指令指令设计遵循的四个基本原则中的第三原则——加速常用操作例:addi $s3,$s3,4 #$s3=$s3+4§2.5计算机中指令的表示(RepresentingInstructionsintheComputer)指令以一系列高低电平信号形式保存在计算机中,并以数字形式表示把指令的数字形式称为机器语言,这样的指令序列叫做机器代码MIPS指令格式指令设计遵循的四个基本原则中的第四原则——均衡设计§2.5计算机中指令的表示将MIPS汇编语言翻译成机器语言例:假设数组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指令的机器代码又是什么呢?§2.6逻辑运算(LogicalOperations)能够对“位”进行操作的指令——逻辑操作C和Java中的逻辑操作与MIPS指令的对应关系移位(shift)指令shamt:用作移位量位操作指令AND:按位“与”操作OR:按位“或”操作NOT(一个操作数):按位“非”操作NOR(双个操作数):按位“或非”操作§2.7分支指令(InstructionforMakingDecisioos)计算机与计算器不同在于前者具有决策能力根据不同的输入数据或者中间计算结果执行不同的指令如,用if语句表示分支:二者选一MIPS汇编语言条件分支指令beqregister1,register2,L1bneregister1,register2,L1无条件分支指令jL1§2.7分支指令将if-then-else语句编译成条件分支指令 例:假设从f到j的五个变量分别对应于从$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)Exit:§2.7分支指令循环(Loops)程序用于重复计算编译一个C语言while循环例:C语句:while(save[i]==k)i+=1;假设i和k分别对应于$s3和$s5的寄存器,数组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:汇编程序使编译器和汇编语言程序员不必计算分支指令地址,只要用标号即可!由汇编器完成地址计算§2.8计算机硬件支持的过程(SupportingProceduresinComputerHardware)过程或函数是C或Java程序员进行结构化编程的手段,有助于提高程序可读性和代码可重用性过程允许程序员使用参数将过程与其余的程序和数据分离,只允许传值和返回结果MIPS软件为过程调用分配32位寄存器$a0~$a3:四个参数寄存器,用于传递参数$v0~$v1:两个储值寄存器,用于保存返回值$ra:一个返回地址寄存器,用于保存返回起始点MIPS汇编语言包含一个过程指令:跳转到某个地址的同时将下一条指令的地址保存在寄存器$ra跳转—链接指令:jal ProcedureAddress过程调用举例例: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是调用过程sub是被调用过程i是全局静态变量array数组是局部变量问题:过程调用对应的机器代码如何表示?需要解决:如何从调用程序把参数传递到被调用程序?如何从调用程序转入被调用程序执行?如何从被调用程序返回调用程序执行?如何保证调用程序中寄存器内容不被破坏?set_array是调用过程compare是被调用过程ProcedureCallandStack(过程调用和栈)过程调用的执行步骤(假定过程P调用过程Q):将参数放到Q能访问到的地方将P中的返回地址存到特定的地方,控制转入过程Q为Q的局部变量分配空间(局部变量临时保存在栈中)执行过程Q将Q执行的返回结果放到P能访问到的地方从$ra取出返回地址,控制转入P,即返回到P中执行MIPS规定少量过程调用信息用寄存器传递若过程中用的参数超过4个,返回值超过2个,怎么办?更多的参数和返回值要保存到存储器的特殊区域中这个特殊区域是:栈(Stack)一般用“栈”来传递参数、保存返回地址、临时存放过程的局部变量等。为什么?在被调用过程Q中完成便于递归调用!调用过程P中完成叶过程:没有调用其他过程的过程非叶过程:过程调用其他过程递归过程甚至调用的是自身的“克隆”一个C的变量就是一个存储位置,取决于其类型和存储方式类型:整型、字符型存储方式:动态(动态变量位于过程中,当过程退出时失效)、静态(静态变量在进入和退出过程时始终存在。在所有过程之外声明的C变量及声明使用关键字static的变量都视作静态)嵌套过程(NestedProcedures)栈中为新数据分配空间(AllocatingSpaceforNewDataontheStack)栈需要保存一些局部变量过程帧(活动记录):栈中包含过程保存的寄存器和局部变量的段过程调用之前、中间和之后的栈的状态MIPS程序和数据的内存分配堆中为新数据分配空间(AllocatingSpaceforNewDataontheHeap)C程序员需要在内存中留有静态变量和动态数据结构的空间静态数据段:用于存储常量和其他静态变量的空间。数组通常具有固定长度,与静态数据段很好匹配类似链表的数据结构,通常会随着生命期增长和缩短,动态数据结构对应的段称为堆(heap)。向上增长至栈C语言通过显式的函数调用在堆上分配和释放空间malloc():在堆上分配空间并返回指向它的指针free():释放指针指向的栈空间内存分配由C程序控制,可能导致的问题有:内存泄漏:忘记释放空间,逐渐消耗内存使操作系统崩溃指针悬浮:忘记初始化指针或过早释放空间,造成指针指向程序从未访问的位置§2.10对32位立即数的MIPS编址和寻址(MIPSAddressingfor32-BitImmediateandAddresses)32位立即数指令loadupperimmediate(lui)专用于给寄存器中的常量设置高16位,允许后续指令设定常量的低16位分支和跳转中的寻址MIPS跳转指令条件分支指令——指定两个操作数和分支地址PC相对寻址对32位立即数的MIPS编址和寻址举例例:描述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 #gotoLoopExit:编译器将C程序转换成一种机器能理解的符号形式的汇编语言程序。不同的高级语言有不同的编译器,但在同台机器生成的汇编语言一样每台机器的汇编程序的功能一样,与高级语言无关。汇编程序经过汇编处理后生成目标文件。目标程序文件就是编译程序和汇编程序对高级语言源程序进行翻译处理所得到的机器语言程序(指令、数据及链接说明信息)把所有独立汇编好的机器语言程序(包括库例程)的目标文件“拼接”在一起生成一个可执行文件从磁盘中读取可执行文件到存储器,启动执行如何链接?如何分配代码和数据地址?可执行程序文件是通过装入程序直接装入存储器执行的文件

。它要说明代码和数据区多大,并给出每条指令的

温馨提示

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

评论

0/150

提交评论