1.大纲要求
1.1.指令格式
1.一条指令由操作码和若干操作数组成:
①操作码:这条指令的动作(加/减/乘/除/移位等等)
②操作数:该动作的参数(寻址方式位 + 形式地址)
2.扩展操作码:短操作码不能是长操作码的前缀(类似DS的哈夫曼树,CN的变长子网划分)
1.2.寻址方式
1.有效地址:即最终要访问的虚拟地址(PC→虚拟地址,MAR→物理地址)
2.①操作数在指令中以形式地址的方式给出
②CPU根据寻址方式将形式地址转换为有效地址(虚拟地址,存放在PC)
③通过TLB/页表将虚拟地址转换为物理地址(存放在MAR)
④通过Cache/内存访问物理地址
3.①隐含寻址:操作数默认在某个寄存器中或在栈顶,即无需指明操作数在何处(POP指令)
②立即寻址:指令中给出立即数,例如OP 10086,即对10086进行某种操作
③直接寻址:操作数给出的地址就是最终的有效地址(例:OP 指针,对某数据进行某种操作,并给出该数据的指针)
④一次间接寻址:OP 指针的指针,根据指针A找到该操作数的指针B,再通过该指针B找到操作数
⑤寄存器寻址:
⑥寄存器间接寻址:相当于指针存在寄存器中
⑦相对寻址:转移指令,EA = (PC)+ A
1.PC的内容加上指令中形式地址A形成操作数的有效地址,即EA = (PC)+ A(A为相对于PC的偏移量,正负都可,用补码表示)
2.PC在取出使用相对寻址的指令时,就会进行+ “1”操作,即相对寻址是相对于下一条指令的存放地址的偏移量("1"的大小取决于当前正在执行指令的指令字长)
3.优点:无论代码被放在什么位置,都不用更改跳转指令的地址码(若使用直接寻址的方式,则每次都需要更改)便于程序浮动(一段代码在程序内部浮动),广泛被用于转移类指令
⑧基址寻址:
1.基址寄存器中存放的是当前程序的首地址(基地址,运行中基址寄存器中的内容不变,形式地址作为偏移量可变)
2.基址寄存器可以是专用,也可以是指定一个通用寄存器(需要在指令中指明是哪个通用寄存器)
3.便于程序浮动(整段程序在内存中的浮动),多道程序并发运行(仅需修改基址寄存器的内容实现不同程序的正确寻址,相较于直接寻址,直接寻址需要修改每条指令的地址;OS动态分配中,每个程序占有连续的内存空间,可以通过基址寄存器记录每个程序在内存中的起始地址,通过偏移量的改变得到正确的地址);可以增加寻址范围(基址寄存器的位数大于形式地址位数,但由于形式地址决定偏移量,因此偏移量有限)
4.基址寄存器面向操作系统(用户可以决定使用哪个基址寄存器,但内容由操作系统决定)
⑨变址寻址:
1.变址寄存器中的内容(可变)作为偏移量,形式地址A(不变)作为基地址(与基址寻址刚好相反):可以通过不断的改变变址寄存器中的内容,访问数组中的元素,因此适合循环程序
2.变址寄存器可以是专用,也可以是指定一个通用寄存器(需要在指令中指明是哪个通用寄存器)
3.变址寄存器面向用户(用户可以修改变址寄存器的内容)
⑩堆栈寻址:
1.操作数存放在堆栈中,隐含使用堆栈指针(SP:Stack Pointer)作为操作数地址
2.堆栈指针存在专门的寄存器中,其指向栈顶元素
①专用寄存器:不同情况下对SP的操作顺序和操作方式不同(参考数据结构栈),取指令需访存,执行指令无需访存
②主存中开辟堆栈空间:每次操作都需要进行访存
1.3.数据对齐和大小端存放方式
1.4.CISC和RISC
判断是CISC/RISC:①指令字长是定长→RISC ②有除LOAD/STORE外指令访存→CISC
1.5.高级语言程序与机器级代码间对应
1.高级语言(C)经过编译器的编译后形成汇编语言
2.汇编语言和机器语言指令一一对应:一条汇编语言对应一条机器语言指令
3.汇编语言经过汇编器的编译后形成机器语言(010101)
4.链接器:把各个机器语言指令的模块(主函数和库函数)连接起来形成一个完整的地址空间
5.机器级代码:
①if - else、switch(条件转移指令):cmp a,b; jxxx(je、jle、jg、jge) xxxx
②goto(无条件转移指令):jump xxxx