您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 第二章 指令:计算机的语言
第二章指令:计算机的语言第二章指令:计算机的语言2.1引言2.2计算机硬件的操作2.3计算机硬件的操作数2.4有符号和无符号数2.5计算机中指令的表示2.7决策指令2.8计算机硬件对过程的支持2.9人机交互2.10MIPS中32位立即数和地址的寻址2.11并行与指令:同步2.12翻译并执行程序2.13以一个C排序程序为例2.14数组与指针2.15高级内容:编译C语言和解释JAVA语言2.16实例:ARM指令集2.17实例:X86指令集2.18谬误与陷阱2.19本章小结2.1引言一台计算机的全部指令称为该计算机的指令集计算机设计者的目标:找到一种语言,可方便硬件和编译器的设计性能最佳、成本和功耗最低MIPS指令集ARM和X86指令集:CISC和RISC2.2计算机硬件的操作一条指令的例子:adda,b,c操作数和操作码:寄存器和存储器MIPS指令类别(P44):简单源于规整算术数据传输逻辑条件分支无条件跳转一个例子:P45高级语言和汇编语言例1:a=b+c编译结果:adda,b,c例2:f=(g+h)-(i+j);编译结果:addt0,g,h#temporaryvariablet0containsg+haddt1,i,j#temporaryvariablet1containsi+jsubf,t0,t1#fgetst0-t1,whichis(g+h)-(i+j)2.3计算机硬件的操作数寄存器:字(MIPS32位)设计原则:越少越快将程序变量和寄存器对应起来是编译器的工作例:f=(g+h)-(i+j);变量fghij依次分配给寄存器$s0,$s1,$s2,$s3,$s4,求编译后的MIPS代码add$t0,$s1,$s2#register$t0containsg+hadd$t1,$s3,$s4#register$t1containsi+jsub$s0,$t0,$t1#fgets$t0-$t1,whichis(g+h)-(i+j)2.3.1存储器操作数复杂数据结构放在存储器中数据传送指令:存储器寄存器取数指令:lw;存数指令:sw例:g=h+A[8]lw$t0,8($s3)#temporaryreg$t0getsA[8]add$s1,$s2,$t0#g=h+A[8]8为偏移量,$s3为基址寄存器存储器操作数(续)编译器在存储器中为数组和结构数据分配位置字节地址VS字地址对齐限制:字的地址必须为4的倍数大端(bigend)和小端(littleend)例(略,p48)编译器尽量将常用的变量保持在寄存器中,其他的变量放在存储器中。将不常使用的变量存回到存储器中的过程叫“溢出”。编译器必须高效使用寄存器:高性能和节省功耗2.3.2常数或立即操作数其中一个操作数是常数的算术运算指令addi$s3,$s3,4加速执行常用操作:速度快,能耗低常数0可以简化指令集:数据传送指令MIPS将寄存器$zero恒置为0讨论:寄存器数目随时间如何变化?好像摩尔定律?2.4有符号和无符号数二进制、字、最低有效位、最高有效位讨论:如何表示符号?补码:求补码的方法:按位取反,末位+1-00000000000000101111111111111101111111111111111100000000000000010的补码?2.5计算机中指令的表示计算机中指令和数都是二进制代码指令格式:指令布局MIPS指令32位,与数据字的位数相等指令的数字形式:机器语言…000001000000000100100000100100000011010000001001…MIPS指令字段取字指令:需要两个寄存器和一个常数,因此限制了操作数的范围。——优秀的设计需要适宜的折中方案I型指令R型指令:用于寄存器;I型指令:用于立即数和数据传送指令lw$t0,32($s3)#temporaryreg$t0getsA[8]198MIPS汇编中,$s0-$s7映射到寄存器16-23$t0-$t7映射到8-15MIPS指令编码如何判断指令是哪种格式?计算机中指令的表示—重点指令用数的形式表示和数一样,程序存储在存储器中,并且可以读写存储程序概念“二进制兼容”2.6逻辑操作对字中的若干位打包或拆包的操作移位:左移(sll)、右移(srl)左移相当于乘2sll$t2,$s0,4#reg$t2=reg$s04bits按位与:可将源操作数中某些位置0,“掩码”and$s0,$t1,$t2#&按位或:任意一个操作数为1,则结果为1or$s0,$t1,$t2#|按位取反:nor$s0,$t1,$t2#~00161040oprsrtrdshamtfunct2.7决策指令beqregister1,register2,L1#如果相等则分支bneregister1,register2,L1#如果不相等则分支例:将if-then-else语句编译成条件分支指令if(i==j)f=g+h;elsef=g-h#fghij依次对应$s0-$s4的寄存器bne$s3,$s4,Else#gotoElseifi≠jadd$s0,$s1,$s2#f=g+h(skippedifi≠j)jExit#gotoExit,无条件分支Else:sub$s0,$s1,$s2#f=g-h(skippedifi=j)Exit:汇编器完成分支指令的地址计算,编译器创建标签2.7.1循环例:编译C语言while循环语句while(save[i]==k)#save的基址在$s6i+=1#i,k放在$s3和$s5中解答:1.Loop:sll$t1,$s3,2#tempreg$t1=i*42.add$t1,$t1,$s6#t1=addressofsave[i]3.lw$t0,0($t1)#tempreg$t0=save[i]4.bne$t0,$s5,exit5.addi$s3,$s3,16.jLoop7.Exit:基本块:没有分支且没有分支目标/分支标签的指令序列编译的最初任务之一就是把程序分解为基本块其他决策指令slt$t0,$s3,$s4#$t0=1if$s3$s4slti$t0,$s2,10#$t0=1if$s210sltu,sltiu:无符号数,将有符号数作为无符号数来处理,是一种检验0=xy的低开销方法,常用于检查数据的下标是否越界Sltu$t0,$s1,$t2#$t0=0if$s1=lengthor$s10Beq$t0,$zero,IndexOutofBounds#ifbad,gotoerror负数的补码在无符号数中看起来是一个很大的数2.7.2case/switch语句转移地址表:由代码中标签所对应的地址构成的数组表中的项首先加载到寄存器中jr:寄存器跳转指令2.8计算机硬件对过程的支持过程运行期间,程序遵循6个步骤将参数放在过程可以访问到的位置将控制转移给过程获得过程需要的存储资源执行请求的任务将结果的值放在调用程序可以访问到的位置将控制返回初始点,一个过程可能由多个点调用MIPS在为过程分配寄存器时遵循以下约定$a0-$a3:用于传递参数的4个寄存器$v0-$v1:用于返回值的2个寄存器$ra:用于返回起始点的返回地址寄存器跳转链接指令跳转链接指令:跳转到某个地址时同时保存下一条指令的地址到$rajalProcedureAddress#指向调用点的地址调用者将参数值放在$a0-$a3;使用jalX跳转到过程X;被调用者执行运算,结果放在$v0和$v1;使用jr$ra指令将控制返回给调用者。PC:程序计数器。jal将PC+4保存在$ra中。程序计数器的作用?2.8.1使用更多的寄存器调用者使用的任何寄存器必须恢复到过程调用前的值栈:换出寄存器使用的数据结构栈指针:$sp栈操作:压栈、出栈栈“增长”方向:地址从高到底例:编译一个C过程intleaf_example(intg,inth,inti,intj){intf;f=(g+h)-(i+j);returnf;}解答(p67,图2-10)参数变量ghij对应参数寄存器$a0-$a3,f对应$s0.编译结果:Leaf_example:addi$sp,$sp,-12#adjuststacktomakeroomfor3itemssw$t1,8($sp)#saveregister$t1foruseafterwardssw$t0,4($sp)#saveregister$t0foruseafterwardssw$s0,0($sp)#saveregister$s0foruseafterwardsadd$t0,$a0,$a1#register$t0containsg+hadd$t1,$a2,$a3#register$t1containsi+jsub$s0,$t0,$t1#f=$t0-$t1,whichis(g+h)-(i+j)add$v0,$s0,$zero#returnsf($v0=$s0+0)lw$s0,0($sp)#restoreregister$s0forcallerlw$t0,4($sp)#restoreregister$t0forcallerlw$t1,8($sp)#restoreregister$t1forcalleraddi$sp,$sp,12#adjuststacktodelete3itemsjr$ra#jumpbacktocallingroutine压栈出栈执行过程返回临时寄存器和保留寄存器为避免保存和恢复一个其值未被使用过的寄存器$t0-$t9:10个临时寄存器,过程调用中不必保存;$s0-$s7:8个保留寄存器,过程调用中必须保存2.8.2嵌套过程(略)静态变量和动态变量C语言中一个变量对应内存中的一个位置:类型和存储方式动态:过程中的变量,只在过程中有效静态:过程内外,始终存在。全局和static声明的变量MIPS全局指针:$gp保留不保留保存寄存器:$s0-$s7临时寄存器:$t0-$t9栈指针寄存器:$sp参数寄存器:$a0-$a3返回地址寄存器:$ra返回值寄存器:$v0-$v1栈指针以上的栈栈指针以下的栈2.8.3在栈中为新数据分配空间栈还保存过程中的局部变量:局部数据、结构体过程帧(或活动记录)栈中包含过程所保存的寄存器和局部变量的片段帧指针:$fp2.8.4在堆中为新数据分配空间MIPS分配内存的约定栈由内存高端开始并向下生长堆:在栈之下反方向生长静态数据段:常量和其他静态数据正文:机器代码的第一部分保留段C语言通过显式的函数调用在堆上分配和释放空间:malloc(),free()MIPS汇编语言寄存器约定(p71)2.9人机交互ASCII码讨论:如何表示十进制数?MIPS字节传输指令:lb、sb、lbu、sbu字符串:字符串复制过程的编译(略)2.10MIPS中32位立即数和地址的寻址指令长度32,如何加载32位常量?lui:设置寄存器中常数的高16位加载32位常量00000000001111010000100100000000•lui$s0,61#61是高16位•ori$s0,2304#2304是低16位2.10.132位立即数问题:指令中的立即数放在哪里?2.10.2分支和跳转中的寻址J型指令:除了6位操作码,其他都是地址字段j10000#gotolocation10000分支寻址:只有16位用于指定分支地址,则程序不能大于216?程序计数器=寄存器+分支地址PC相对寻址:由于条件分支的跳转目标很可能靠近其分支地址2100006位26位2.10.3MIPS寻址方式总结MIPS的寻址模式(p79.图2-18)立即数寻址:操作数是位于指令中的常数寄存器寻址:操作数在寄存器中基址或偏移寻址:操作数在内存中,其地址是指令中基址寄存器和常数的和PC相对寻址:地址是PC和
本文标题:第二章 指令:计算机的语言
链接地址:https://www.777doc.com/doc-5159509 .html