**
一、指令格式
**
- 一条指令由操作码(opcode)和操作数(operand)构成。操作数可以是1个,也可以是多个,甚至可以没有。操作码则是每一条指令都必须有;
- 操作码:指令的具体操作 (指令的唯一标识) ,例如跳转,加减;
- 操作数:表示操作对象,该操作数可以由多种来源,例如寄存器,存储器或者立即数
- 每一条指令(指的是机器码)一般对应一条汇编语句,也有一条汇编语句对应多条指令的情况,在编译时,汇编器会将该汇编语句转化成对应的多条指令;
二、操作码分类
-
固定长度
所有指令操作码的长度相等 例如:某计算机共有64条指令,采用固定长度操作码,需要6位编码,从000000~111111 2的6次方为64 优点:编码方法简单,便于指令的译码 缺点:不方便指令系统中增加新的指令(扩展不方便)
-
可变长度
操作码长度不固定,四位是基本的操作码,还可以扩充; 但是指令的字数不变,就是说把不用的地址码部分可以做操作码用。
三、操作数
指令中用于指出操作数的字段。一条指令中一般有多个操作数,即多个地址码,地址码长度相等;
一个地址码可能是立即数,寄存器编号、直接内存地址、间接地址、I/O端口号、形式地址等;
操作码字段 地址码
操作码 A1 A2 A3 三地址指令,指令编码中有3个地址,两个操作数的存储位置和一个结果的存储位置
操作码 A1 A2 二地址指令,指令编码中有2个地址,两个操作数的存储位置和一个结果的存储位置
操作码 A1 一地址指令,令编码中只有一个地址码,一个操作数的存储位置
操作码 零地址指令,只有操作码,没有地址码(空操作 停止等)
四、指令字
- 指令字长度:一个指令字中包含二进制代码的位数,为简化指令访存的操作,一般指令字长为计算机字长的整数倍
- 机器字长:计算机能同时处理的二进制数据的位数
- 单字长指令:指令字长等于机器字长
- 双字长指令:指令字长等于两个机器字长
缺点:必须两次访问内存以取出一整条指令,降低了CPU的运算速度,又占用了更多的存储空间
五、寻址方式:
- 定义:在程序执行过程中,需要取指令和操作数,CPU寻找指令和操作数的方式称为寻址方式,具体细分为指令寻址方式和数据寻址方式
- 指令寻址
2.1. 顺序寻址方式,
顺序寻址通过程序计数器PC加1,自动形成下一条指令的地址,即内存中的地址;
2.2 跳跃寻址方式
跳跃寻址通过转移指令实现,跳转的地址由本条指令给出,程序跳跃后,按新的指令地址开始顺序执行
如果程序的首选地址为0,则先将0送至程序计数器PC中,启动运行,程序便按0、1、2…顺序执行。其中0、1、2地址由PC自动形成,因3号地址为跳转指令,故执行完3后,便将7送至PC,接着顺序执行7、8、9等指令。
3. 数据寻址:
在执行每一条指令时,对指令里面操作数的寻址为数据寻址;
立即数寻址
指令的地址字段指出的不是操作数的地址,而是操作数本身,例【ADD R1,#21】,表示reg(R1)=reg(R1)+21;
特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间;
直接寻址(内存寻址)
在指令格式的地址字段中直接指出操作数在内存的地址;
寄存器寻址
指令中给出的操作数地址不是内存的地址,而是通用寄存器地址,例 【ADD R1,R2】,表示reg(R1)=reg(R1)+reg(R2);
寄存器间接寻址
指令中的寄存器内容不是操作数,而是操作数在内存的地址 例 【ADD R1,(R2)】,表示reg(R1)=reg(R1)+mem[reg(R2)];
偏移量寻址
例【ADD R1,100(R2)】,表示reg(R1)=reg(R1)+mem[100+reg(R2)];
六、常见概念术语
堆栈(Stack):
- 堆栈是一块特殊的存储区,主要用来在程序切换时保存各种信息;
- 采用“先进后出”的方式进行访问,栈底固定不动,栈顶浮动,用一个专门的寄存器(SP)来作为栈顶指针;
- 从堆栈生长的方向来分,有“自顶向下”和“自底向上”两种堆栈。
- 从堆栈的位置来分,有硬堆栈和软堆栈。硬堆栈的堆栈区由寄存器实现,软堆栈的堆栈区由内存区实现。
堆栈指针(Stack Pointer, SP):
是一个特殊的地址寄存器,用来存放堆栈的栈顶指针。如果是硬堆栈的话,栈顶指针是栈顶寄存器的编号; 如果是软堆栈的话,栈顶指针是栈顶内存单元的地址。
程序计数器(Program Counter,PC):
是一个特殊的地址寄存器,专门用来存放当前指令的地址,也称为指令指针寄存器。
相对转移(Relative jump):
转移目标地址通过PC的值加上偏移量形成。所以,转移到的目的地和当前指令的位置有关。
绝对转移(Absolute jump):
转移目标地址由指令指定的一个绝对地址确定,而与当前指令的位置没有关系。
双目运算(two-operand operate):
需要两个操作数才能进行的运算。如:加、减、乘、除、与、或等算术或逻辑运算都是双目运算。
单目运算(one-operand operate):
只需要一个操作数就能进行的运算。如:取负、取反等算术或逻辑运算都是单目运算。
大端次序(Big Endian Ordering):
- 操作数在内存存放时,指令给出地址所指定的内存单元中,存放的是操作数最高位的一个字节(MSB);
- 例如,假设一个32位数据“12345678H”的地址为100#,则大端存放次序为:100#:12H,101#:34H,102#:56H,103#:78H。IBM S/370,Motorola 680x0等是大端序机器。
小端次序(Little Endian Ordering):
- 操作数在内存存放时,指令给出地址所指定的内存单元内存放的是操作数最低位的一个字节(LSB)。
- 例如,假设一个32位数据“12345678H”的地址为100#,则小端存放次序为:100#:78H,101#:56H,102#:34H,103#:12H。Intel 80x86等是小端序机器。