存储程序概念:多种类型的指令和数据均以数字形式存储于存储器中。
1.简单源于规整
2.越小越快
3.加速大概率事件
4.优秀的设计需要适宜的折中方案
CISC即“复杂指令集”,从无到有,为新增功能设计新的指令。
RISC即“精简指令集”,用少数指令的组合来实现新增的功能。(等长规整、高频指令、积木模式)兼容性差
在指令系统上,CISC指令系统更加丰富,在处理特殊任务时效率更高;且RISC汇编语言程序代码规模庞大,严重依赖于编译器;但RISC在中断时可以在一条指令执行的适当位置响应中断,并且单元电路更少,功耗低。
MPIS算术运算指令操作数必须来自寄存器,MIPS体系结构中寄存器大小为32位,MIPS有32个寄存器。
字(WORD):计算机中的基本访问单位,通常是32位一组,在MIPS体系结构中与寄存器大小相同。
$s0~$s7寄存器用于保存变量,而$t0~$t9用于保存编译后所需的临时寄存器。
数据传送指令:在存储器和寄存器之间移动数据的命令。
因为MIPS是按字节编址的,所以字的起始地址必须是4的倍数。
基址:数组的起始地址,存放基址的寄存器就成为基址寄存器;偏移量:数据传送指令中的常量。
常数/立即数操作数:存储在存储器中,根据原则1设计addi指令;并且没有立即数的减法,编译器负责将addi转化成“subi”(取负)。
$zero寄存器恒置为0。
符号拓展:将最高有效位复制填充新的高位上。
$s0~$s7对应reg16~23,$t0~$t7对应reg8~15,$t8、9对应reg24、25。
机器语言:指令的数字形式,并且这样的指令序列成为机器码。
op:指令的基本操作,操作码(opcode)
rs:第一个源操作数寄存器
rt:第二个源操作数寄存器
rd:用于存放操作结果的目的寄存器
shamt:位移量
funt:功能,funtion code
1.指令用数的形式表示。
2.和数据一样,程序存储在存储器中,并且可以读写
add、sub、addi;
sll、srl、and、andi、or、ori、nor.
beq reg1,reg2,L
bne reg1,reg2,L
j Exit
为什么没有blt、bge这类指令?硬件实现的电路复杂,速度慢。
基本块:没有分支(可能出现在末尾)并且没有分支目标/标签(可能出现在开始)的指令序列。自己递归调用自己不是基本块
slt 小于则置位 R型
slti I型
$a0~$a3:用于传递参数的4个参数寄存器
$v0~$v1:用于返回值的两个值寄存器
$ra:用于返回起始点的返回地址寄存器
跳转和链接指令
jal ProcedureAddress 跳转到某个地址同时将下一条指令的地址保存到$ra
寄存器跳转指令
jr $ra
程序计数器:PC,包含在程序中正在被执行指令地址的寄存器。jal指令实际上将PC+4保存在$ra中,从而链接指向下一条指令。
在每次寄存器进行保存或恢复时,栈指针($sp)以字为单位进行调整。栈的增长是按照地址从高到低的顺序进行的,意味着压栈时栈指针的值减小;出栈时栈指针的值增大。
叶过程:不调用其他过程的过程
调用者将所有调用后还需要的参数寄存器($a0~3)和临时寄存器($t0~9)压栈,被调用者将返回地址$ra和被调用者使用的保存寄存器($s0~7)都压栈。
$gp全局指针:指向静态数据区的保留寄存器
32位立即数如何存储到寄存器?将大的常数分解为若干小的常数,利用lui设置高位,ori/addi设置低位,从而合并到一个寄存器中。
bne等条件跳转是按相对地址计算的
j、jr、jal无条件跳转以及程序跳转和返回的地址是按绝对地址计算的
PC相对寻址:将PC和指令中的常数相加作为寻址结果(实际是用PC+4,即下一条指令的地址)
因为MIPS指令都是四字节长,所以PC相对寻址时所加的地址不是字节地址而是字地址,所以16位的字地址实际跳转范围是18位的字节地址范围。
地址拼接:MIPS跳转指令仅仅代替PC的低28位,高4位保持不变。
(必考点)寻址模式:
条件跳转距离太远怎么办?编译器处理,插入一个跳转到分支目标的无条件跳转。并将条件取反以便于由分支决定是否跳过该无条件跳转指令。
伪指令:汇编语言指令的一个变种,简化了程序的转化和编程,通常被看作一条汇编指令。机器读不懂汇编指令,依赖汇编器转化成机器指令。MIPS汇编器使用十六进制,主要任务是将汇编成机器语言,将汇编语言程序转化成为目标文件,它包括机器语言指令、数据和指令正确放入内存所需要的信息。
符号表:用来匹配标记名和指令所在内存地址的列表。
链接器:是一个系统程序,把各个独立汇编的机器语言程序组合起来并且解决所以未定义的标记,最后生成可执行文件。
工作步骤:
核心:重新运算地址,重定位
静态链接发生在形成可执行程序前,即编译之后的链接阶段,此时目标文件会被导入可执行程序中,即目标文件和可执行程序合并为一个文件
动态链接发生在形成可执行程序后,即程序运行时,此时程序会根据需要从动态链接库中导入相应的目标文件,注意动态链接库并不作为程序的一部分,但每个动态链接的程序都需要一个动态链接库(DLL,在程序执行过程中才被链接的库例程)
可以通过晚链接方式链接动态链接库。
加载器:把目标程序装载到内存中以准备运行的系统程序