目录
1.指令格式
1.1.指令的基本格式
1.操作码:干什么;地址码:对象
2.零地址指令:没有操作数或者操作数隐含
3.一地址指令:单操作数或者双操作数中一个隐含一个给出
4. 二三地址指令:区别在于运算的结果写入位置
5.四地址指令:除最后一步需要跳转指令地址外,跟三地址指令相同
7.在指令总长度不变的情况下,地址码个数越多,寻址能力越差(每个地址码的个数更少)
1.1.2.按指令长度分类
指令字长可能会发成变化,但是机器字长、存储字长不变
1.1.3.按操作码长度分类
1.1.4.按操作类型分类
转移类指令将会导致PC(下一跳指令的地址)的值发生改变
1.2.扩展操作码指令格式
扩展操作码指令格式:定长指令字结构 + 可变长操作码(不同地址数的指令使用不同长度的操作码)
设地址长度为n,上一层留出m种状态,下一层可以扩展出m * 2 ^ n种状态
该扩展操作码方法下,每个地址/操作数都需要保留某些特定二进制数用于CPU判断是哪一种指令
①15条三地址指令,至少需要4位表示,使用0000 - 1110,剩余1111
②12条二地址指令,至少需要4位表示,使用0000 - 1011,剩余1100、1101、1110、1111
③62条一地址指令,至少需要6位表示,但是加上②中所剩余的四个地址,4 * 4位的方式可以表示64条指令,剩余1110 - 1111
④32条零地址指令,至少需要5位表示,但是加上③中所剩余的两个地址,2 * 4位的方式可以表示32条指令
CPU会读入这16位指令(0-15位):
①判断0-3位是否为全1,非全1则是三地址指令,全1则进行②
②判断4-5位是否为全1,非全1则是二地址指令,全1则进行③
③判断6-10位是否为全1,非全1则是一地址指令,全1则为零地址指令
2.指令的寻址方式
2.1.指令寻址
PC:指明下一条指令的存放地址
2.1.1.顺序寻址
下一条指令的地址:(PC)+ “1”→PC(1为指令字长)
1.当前指令被取出时,PC进行+1操作
2.PC+1操作是根据不同的场合加不同的1(定长指令):
①设字长为16位,按字编址时,每个字都刚好存放一个指令,因此,PC + 1
②设字长为16位,按字节编址时,每两个字节存放一个地址,因此,PC + 2
3.变长指令:无法预估指令长度,可能需要多次访存,每次读入一个字
设字长为16位,按字节编址
①读入一个完整的字,根据操作码判断这条指令的总字节数 n
②若这条指令的长度>字长,则读入剩余指令,并且PC + n
③若这条指令的长度 = 字长,则PC + 2
2.1.2.跳跃寻址
由转移指令给出
1.当取出转移指令后,PC还是会先进行 PC + 1的操作
2.当执行转移指令时,PC的内容将会被转移指令所改变
2.2.数据寻址
2.2.1.六种寻址
1.确定本条指令的地址码指明的真实地址
2.指令增加寻址特征位,用于判断该如何解读形式地址(A)的含义,从而得到有效地址(EA)
①直接寻址:
Ⅰ访存:取指令1次,取A中的地址1次
Ⅱ缺点:寻址范围不能扩展(形式地址位数有限);当操作数的地址发生改变时,指令失效(仍然指向改变前的地址)
②间接寻址:
Ⅰ访存:取指令1次,取A中EA的地址1次,找到EA中的地址1次(一次间接两次寻址)
可以进行多次间接寻址,当开头第一位为1时,说明该地址存储的地址仍然不是最终的有效地址;当开头第一位为0时,说明该地址存储的地址为最终的有效地址
Ⅱ优点:主存中EA的位数可以远大于形式地址的长度;函数之间可以相互调用,方便返回
Ⅲ缺点:多次访存导致效率降低
③寄存器寻址:
Ⅰ访存:取指令1次,执行指令时,访问的是寄存器
Ⅱ优点:速度快(执行指令无需再次访存)、指令短(寄存器个数少)
④寄存器间接寻址:
Ⅰ访存:取指令1次,取出寄存器存放的主存地址EA 0次,取出主存EA中存放的地址1次
Ⅱ优点:比一般间接寻址快(EA存放在寄存器中,取出无需访存)
⑤隐含寻址:
⑥立即寻址: 访存:仅取指令一次,无需再次访存寄存器/主存
2.2.2.偏移寻址
1.偏移寻址包括基址寻址、变址寻址和相对寻址
2.三者都是经过偏移量寻址,区别在于起点的不同
3.都仅需访存一次
①基址寻址(基址寄存器(BR)Base Address Register)):EA = (BR)+ A(多道程序)
1.基址寄存器中存放的是当前程序的首地址(基地址,运行中基址寄存器中的内容不变,形式地址作为偏移量可变)
2.基址寄存器可以是专用,也可以是指定一个通用寄存器(需要在指令中指明是哪个通用寄存器)
3.便于程序浮动(整段程序在内存中的浮动),多道程序并发运行(仅需修改基址寄存器的内容实现正确寻址,相较于直接寻址,直接寻址需要修改每条指令的地址);可以增加寻址范围(基址寄存器的位数大于形式地址位数,但由于形式地址决定偏移量,因此偏移量有限)
4.基址寄存器面向操作系统(用户可以决定使用哪个基址寄存器,但内容由操作系统决定)
②变址寻址(IX——index register):EA = (IX)+ A(数组、循环程序)
1.变址寄存器中的内容(可变)作为偏移量,形式地址A(不变)作为基地址(与基址寻址刚好相反):可以通过不断的改变变址寄存器中的内容,访问数组中的元素,因此适合循环程序
2.变址寄存器可以是专用,也可以是指定一个通用寄存器(需要在指令中指明是哪个通用寄存器)
3.变址寄存器面向用户(用户可以修改变址寄存器的内容)
4.变址寄存器的作用:
采用直接寻址的方式:每进行一轮循环都需要一条相应的直接寻址指令
采用变址寻址的方式:通过改变IX的内容(用比较的IX内容的方式)循环执行程序
③相对寻址(转移指令)
1.PC的内容加上指令中形式地址A形成操作数的有效地址,即EA = (PC)+ A(A为相对于PC的偏移量,正负都可,用补码表示)
2.PC在取出使用相对寻址的指令时,就会进行+ “1”操作,即相对寻址是相对于下一条指令的存放地址的偏移量
3.优点:无论代码被放在什么位置,都不用更改跳转指令的地址码(若使用直接寻址的方式,则每次都需要更改)便于程序浮动(一段代码在程序内部浮动),广泛被用于转移类指令
2.2.3.堆栈寻址
1.操作数存放在堆栈中,隐含使用堆栈指针(SP:Stack Pointer)作为操作数地址
2.堆栈指针存在专门的寄存器中,其指向栈顶元素
3.堆栈两种实现方式:
①专用寄存器:不同情况下对SP的操作顺序和操作方式不同(参考数据结构栈),取指令需访存,执行指令无需访存
②主存中开辟堆栈空间:每次操作都需要进行访存
3.CISC/RISC
1.C(complex复杂):
①一条指令完成一个复杂的基本功能
②除了极复杂的某些指令不设计单独电路外,每条的指令都可以由一个单独的电路完成(电路设计复杂)
③复杂的指令通过多个电路配合存储部件实现——微程序
④指令长度不固定
2.R(Reduced精简)
①一条指令完成一个基本动作;多个指令组合成一个复杂的功能
②一条指令一个电路,但由于只提供基本操作,因此电路设计简单
③每条指令的执行时间都差不多——方便实现并行、流水线
④指令长度定长
4.程序的机器级代码表示
4.1.常用汇编指令介绍
1.中括号内指明的是内存地址,常与读写长度结合使用,表示以该地址为首地址的多少空间内(dword ptr双字32bit,word ptr单字15bit,byte ptr字节8bit)
2.h代表的是十六进制
3.操作数若是二进制/十六进制数,则采用的是立即寻址
4.目的操作数d——destination,源操作数s——sourse
5.寄存器的种类:
①每个寄存器都为32bit
②EAX、EBX、ECX、EDX为通用寄存器:可以存放任何数据
可以只使用低16bit(AX、BX、CX、DX);也可以指定使用低16bit的高8bit和低8bit(AH、AL;BH、BL;CH、CL;DH、DL)
③EBP指向栈底,ESP指向栈顶
6.更多汇编指令示例:
①寄存器间接寻址:ebx存放的是源操作数的主存地址
②寄存器间接寻址:ebx存放的是目的操作数的主存地址
③寄存器间接寻址:ebx存放的是源操作数的主存地址,取8bit
④未指明操作数大小的情况下,默认是32bit
⑤间接寻址:主存地址af996中存放的是目的操作数的主存地址,h表示af996是十六进制
⑥寄存器间接寻址:+8为偏移量,源操作数的主存地址为ebx寄存器中存放的地址 + 8
⑦间接寻址:-12位偏移量,h表示af996为十六进制,源操作数的主存地址为主存地址af996 - 12
4.2.常用的x86汇编指令
执行操作后,需要将结果放回目的操作数的地址中,因此,目的操作数不可以为常量
①算术运算指令
1.i表示有符号数的操作
2.除法指令中s为除数,被除数默认已经被放入edx和eax中(除法开始之前需要对被除数进行位扩展)
②逻辑运算指令
4.3.AT&T格式和INTER格式
①AT&T格式左边为源操作数,右边为目的操作数(与INTER格式相反)
②AT&T格式寄存器前需要加%(INTER格式不需要)
③AT&T格式立即数前加$(INTER格式直接给出立即数)
④AT&T格式主存地址为小括号(INTER格式主存地址为中括号)
⑤AT&T格式指令后增加b、w、l表示读/写的长度(分别对应INTER格式的dworld、word、btye)
⑥AT&T格式偏移量写在括号外(INTER格式偏移量写在括号内)
4.4.选择语句的机器级表示
1.无条件转移指令jmp:
①通过修改PC的内容改变下一条执行的指令
②通过标号跳转(jump NEXT)
2.条件转移指令:满足条件时才进行跳转
cmp实际上是做a - b(减法运算),通过标志位CF、ZF、OF、SF等标志位判断
4.5. 循环语句的机器级表示
1.通过条件转移指令(标号)实现循环
②循环开始前判断是否能跳过循环
③每轮循环结束判断是否需要继续循环
2.通过loop指令实现循环
①选定一个寄存器为循环计数器
②每轮循环自动进行自减操作