指令(Instruction):
|
是计算机硬件能够识别并直接执行的操作命令。用二进制序列表示,由操作码和地址码两部分组成。 |
指令系统(Instruction
Set):
操作码(Operate
Code):
|
指令中用于指出操作性质的字段。一般分为定长操作码和扩展操作码。定长操作码是指机器中所有指令的操作码字段位数相同。扩展操作码是指机器中指令的操作码字段位数不是都相同,也称为不定长操作码。 |
地址码(Address
Code):
|
指令中用于指出操作数地址的字段。一条指令中一般有多个地址码字段。地址码字段的个数与许多因素有关。一个地址码字段可能是一个立即数;可能是一个直接内存地址;可能是一个间接地址;可能是寄存器编号;可能是I/O端口号;可能是一个形式地址等等。 |
定长指令(Fixed
Length Instruction):
|
指令系统中所有指令具有相同的长度,称为规整型指令,目前定长指令字大多是32位指令字。 |
变长指令(Variable
Length Instruction):
|
指令系统中的指令具有不同的长度,有长有短,但每条指令的长度一般都是8的倍数。 |
程序计数器(Program
Counter,PC):
|
是一个特殊的地址寄存器,专门用来存放下一条要执行指令的地址,称为程序计数器PC或指令指针IP。本身它是个寄存器,所以也称为指令指针寄存器。
|
指令指针(Instruction
Pointer):
|
是一个特殊的地址寄存器,专门用来存放下一条要执行指令的地址,称为程序计数器PC或指令指针IP。本身它是个寄存器,所以也称为指令指针寄存器。
|
累加器(Accumulator):
|
在CPU中,累加器(accumulator 简称 ACC)
是一种暂存器,用来储存计算所产生的中间结果。如果没有像累加器这样的暂存器,那么在每次计算后就必须要把结果写回到内存,然后可能还要再读回来。这样,就会增加访问内存的次数,降低程序运行的效率。典型的例子就是把一列数字加起来。一开始累加器设定为零,每个数字依序被加到累加器中,当所有数字都被加入后,结果才写回到主内存中。 |
通用寄存器(General Purpose Register, GPR):
|
一般把用户可访问寄存器称为通用寄存器(GPR)。这些寄存器都有一个编号,在指令中用编号标识寄存器。所以执行指令时,指令中的寄存器编号要送到一个地址译码器进行译码,然后才能选中某个寄存器进行读写。通用寄存器可以用来存放操作数或运算结果,或作为地址指针寄存器、变址寄存器、基址寄存器等。 |
程序状态字(Program
Status Word,PSW):
|
表示程序运行状态的一个二进制位序列。一般包含一些反映指令执行结果的标志信息(如:进位标志、溢出标志、符号标志等)和设定的一些状态信息(如:中断允许/禁止状态、管理程序/用户程序状态等)。
|
程序状态字寄存器(Program
Status Word Register, PSWR):
标志寄存器(Flags
Register):
|
80x86体系结构中用来表示程序状态和标志的寄存器。
|
堆栈(Stack):
|
堆栈是一块特殊的存储区。采用“先进后出”的方式进行访问。主要用来在程序切换时保存各种信息。栈底固定不动,栈顶浮动,用一个专门的寄存器(SP)来作为栈顶指针。从堆栈生长的方向来分,有“自顶向下”和“自底向上”两种堆栈。从堆栈的位置来分,有硬堆栈和软堆栈。硬堆栈的堆栈区由寄存器实现,软堆栈的堆栈区由内存区实现。
|
堆栈指针(Stack
Pointer,SP):
|
是一个特殊的地址寄存器,用来存放堆栈的栈顶指针。如果是硬堆栈的话,栈顶指针是栈顶寄存器的编号;如果是软堆栈的话,栈顶指针是栈顶内存单元的地址。
|
最高有效字节(Most
Significant Byte,MSB):
最高有效位(Most
Significant Bit,MSB):
最低有效字节(Least
Significant Byte, LSB):
最低有效位(Least
Significant Bit, LSB):
大端次序(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等是小端序机器。
|
字地址(Word address):
| 每个内存单元都有一个地址,假定机器中一个字为32位,按字节编址,那么字地址就是指具有4的倍数的那些地址,如:0、4、8、12、…等地址;对应的还有半字地址(2的倍数,如:0、2、4、6、…等)、双字地址(8的倍数,如:0、8、16、…等)。
|
边界对齐(Boundary alignment):
| 有些机器在操作数存放到内存单元时,要求按照相应的地址边界进行对齐。如:假定机器中一个字为32位,按字节编址,那么一个32位的数据(如:一个float型的变量或32位的int型整数变量等)就必须存放在字地址上;一个16位的数(如:16位short型的短整数等)就必须放在半字地址上;而8位的数据(如:char型字符)就可以放在任何边界地址上而不需对齐。
|
双目运算(two-operand
operate):
|
需要两个操作数才能进行的运算。如:加、减、乘、除、与、或等算术或逻辑运算都是双目运算。
|
单目运算(one-operand
operate):
|
只需要一个操作数就能进行的运算。如:取负、取反等算术或逻辑运算都是单目运算。
|
寻址方式(Addressing
Mode):
|
在程序执行过程中,需要取指令和操作数,确定指令和操作数的存放位置的方式称为寻址方式。确定指令存放位置的过程称为指令寻址,确定操作数存放位置的过程称为数据寻址。
|
有效地址(Effective
Address):
|
操作数所在实际位置的地址。若操作数在寄存器中,则有效地址是寄存器的编号;若操作数在内存单元中,则有效地址是内存单元的地址;若操作数在I/O端口中,则有效地址是I/O端口的编号。
|
立即寻址(Immediate
Addressing):
直接寻址(Direct
Addressing):
|
指令中的地址码给出的是操作数所在的内存单元地址,称为直接地址。
|
间接寻址(Indirect
Addressing):
|
指令中的地址码给出的是操作数所在的内存单元地址所在的内存单元地址,称为间接地址。
|
寄存器寻址(Register
Addressing):
寄存器间接寻址(Register
indirect Addressing):
|
指令中的地址码给出的是操作数所在的内存单元的地址所存放的寄存器的编号。
|
偏移寻址(Displacement
Addressing):
|
指令通过某种方式给出一个形式地址和一个基地址(往往在某个寄存器中),经过相应的计算(基地址加形式地址)得到操作数所在的内存单元地址。具体的偏移寻址方式有:变址寻址、相对寻址和基址寻址。
|
变址寻址(Indexing):
|
变址寻址方式下,指令中的地址码给出一个形式地址,并且隐含或明显地指定一个寄存器作为变址寄存器,变址寄存器的内容(变址值)和形式地址相加,得到操作数的有效地址,根据有效地址到内存访问,去取操作数或写运算结果。
|
变址寄存器(index
register):
|
是一个特殊的地址寄存器,用来存放变址寻址方式下的变址值,通常是数组元素的下标值等。
|
相对寻址(Relative
Addressing):
|
相对寻址方式下,指令中的形式地址给出一个位移量D,而基准地址由程序计数器PC提供。即:有效地址EA=(PC)+
D。位移量给出的是相对于当前指令所在内存单元的距离,位移量可正、可负。也就是说,要找的可以在当前指令前D个单元处的信息,也可以是当前指令后D个单元处的信息。
|
基址寻址(Base-Register
Addressing):
|
基址寻址方式下,指令中的地址码给出一个形式地址,作为位移量,并且隐含或明显地指定一个寄存器作为基址寄存器,基址寄存器的内容和形式地址相加,得到操作数的有效地址,根据有效地址到内存访问,去取操作数或写运算结果。
|
基址寄存器(Base-Register):
|
是一个特殊的地址寄存器,用来存放基址寻址方式下的基准地址。通常是一个用户程序在内存的首地址,或一块存储区的首地址。
|
堆栈寻址(Stack
Addressing):
|
堆栈寻址方式下,操作数被指定在堆栈中。堆栈寻址总是从栈顶取操作数,运算后的结果自动放到栈顶。栈顶的位置由一个专门的堆栈指针SP来指示。所以,指令中不需给出操作数地址,是一种零地址指令。与堆栈有关的操作有:入栈(PUSH)、出栈(POP)和运算类操作。
|
R-R型指令(Register-Register
type Instruction):
R-S型指令(Register-Storage
type Instruction):
|
一个操作数在寄存器中,另一个操作数在主存单元中的指令。
|
S-S型指令(Storage-Storage
type Instruction):
数据传送指令(Data transfer instruction):
| 将数据在寄存器和寄存器之间、存储器单元和寄存器之间进行传送的指令。
|
取数指令(Load):
存数指令(Store):
相对转移(Relative
jump):
|
转移目标地址通过PC的值加上一个偏移量形成。所以,转移到的目的地和当前指令的位置有关。
|
绝对转移(Absolute
jump):
|
转移目标地址由指令指定的一个绝对地址确定,而与当前指令的位置没有关系。
|
条件转移(Conditional
jump, Branch):
|
是一种分支指令,根据前面指令或本条指令执行的结果确定是跳转到转移目标地址处执行,还是顺序执行。
|
无条件转移(Unconditional
jump):
|
是一种直接跳转指令,执行完本条指令后,无条件地跳转到目标转移地址处执行。
|
过程(Procedure):
| 构造过程或子程序是程序员进行模块化程序设计的一种手段,通常程序员把一个大的任务分解成一些子任务,每个子任务用一个过程来实现,这样做,一方面使得程序容易理解,另一方面也使过程可以被多个程序使用,即可重用代码。
|
过程调用(Procedure
call):
| 一个过程调用包括将数据(以过程参数和返回值的形式出现)和控制从一个程序传递到另一个程序。此外,在进入过程时,必须为过程的局部变量分配空间,并在退出过程时释放这些空间。
|
跳转链接指令(Jump
and Link instruction):
| 用于将控制从调用程序转移到被调用程序的指令。在MIPS指令系统中称为跳转链接指令jal。在有些机器的指令系统中也被称为过程调用指令(Call
instruction)或转子指令(意思为转移到子程序),如在X86体系结构中的Call指令。这类调用指令中需要给出被调用程序的首地址。其操作过程主要包括:保存返回地址到特定的寄存器并跳转到被调用程序。
|
返回地址(Return
address):
| 跳转链接指令(调用指令)后面一条指令的地址。也即被调用程序执行完后必须返回的返回点。
|
返回指令(Return
instruction):
| 用于从被调用程序控制转回到调用程序的指令。该指令从某个特定的寄存器取得返回地址,并按返回地址进行跳转。
|
调用程序(Caller):
| 在过程调用中,通过过程调用指令调用一个过程或子程序的程序。有时也称为主程序。
|
被调用程序(Callee):
| 用过程调用指令(或称为跳转链接指令)所要调用的程序。被调用程序最后必须用返回指令返回到调用程序中调用指令后面的那条指令继续执行。
|
叶过程(Leaf
procedure):
过程帧(Procedure
frame):
| 大多数机器只提供简单的过程调用指令和返回指令。一个过程调用中的参数传递、被调用过程中的局部变量的分配和释放等还需要另外的机制来实现。主要是通过堆栈(Stack)来实现,栈用来传递过程参数、存储返回信息、保存寄存器和过程局部变量等。为单个过程分配的那部分堆栈称为过程帧,也称为堆栈帧(Stack
frame)。
|
帧指针fp(Frame
pointer):
| 在程序运行过程中,可能会有多个过程嵌套调用,每个未返回的过程都有一个过程帧,当前正在执行的过程的过程帧称为当前帧。它有两个指针定界,一个是指示当前帧底部的帧指针fp,一个是指示当前帧顶部的栈指针sp。
|
源程序文件(Source
program file):
|
复杂指令系统计算机。早期的计算机为了增加功能和更好地支持高级语言而不断地增加新的指令类型,使系统可以实现复杂的操作。这种指令系统功能复杂,寻址方式多,指令长度可变,指令格式多样。因而采用这种指令系统的计算机被称为复杂指令系统计算机。
|
汇编语言程序文件(Assemble
language source file):
| 用某种汇编语言书写的源程序文件。如:UNIX系统中的汇编语言源程序文件*.s,或MS-Windows中的*.asm文件等。
|
目标程序文件(Object/Target
program file):
| 编译程序和汇编程序对源程序进行翻译处理所得到的机器语言程序称为目标程序文件,是由机器指令组成的二进制代码。如:UNIX系统中的*.o文件,或MS-Windows系统中的*.obj文件等。
一般而言,目标程序文件中包含目标文件头、文本段(机器代码)、数据段、重定位信息、符号表、调试信息等。因为目标文件是可重定位的,所以也称为可重定位目标文件。
|
可执行程序文件(Executable
program file):
| 通过装入程序能被直接装入存储器执行的文件。一般而言,可执行程序文件除了它不包含未确定的调用信息、重定位信息、符号表和调试信息外,它与目标程序文件有相同的格式。可执行程序文件中的模块可以调用其他动态链接库中的函数。
|
链接程序(Linker
/ Link editor):
| 把编译或汇编好的多个目标程序文件和一些库函数目标文件链接生成一个可执行程序文件的工具软件。
|
装入程序(Loader):
| 也称为加载器或加载程序。用于将可执行程序文件读入存储器并启动执行的工具软件。一般来说,可执行文件的装入是由操作系统内核来实现的,因此加载程序属于操作系统的一部分。
|
全局指针寄存器(Global
pointer):
| 操作系统通过执行装载程序把一个可执行文件装入内存时,必须按照一定的规律使用内存。基于MIPS处理器的系统通常将内存分为三个部分,第一部分是从0x00400000开始的正文段,用于存放程序代码;第二部分是数据段,分成静态数据段和动态数据段两部分,静态数据段从0x10000000开始,其上是动态数据段,随着程序的执行进行动态分配,向上扩展(从低地址向高地址增长);第三部分是程序的堆栈段,处于地址空间的最上端,从地址0x7FFFFFFF开始向下扩展(从高地址向低地址增长)。MIPS处理器为了方便地实现对静态数据区的访问,把地址0x10008000放在一个专门的寄存器$gp中,将其作为指向静态数据段的全局指针。这样在load和Store指令中用16位偏移量就可以对静态数据段的前64KB的区域进行方便存取。
|
伪指令(Pseudoinstruction):
|
复杂指令系统计算机。早期的计算机为了增加功能和更好地支持高级语言而不断地增加新的指令类型,使系统可以实现复杂的操作。这种指令系统功能复杂,寻址方式多,指令长度可变,指令格式多样。因而采用这种指令系统的计算机被称为复杂指令系统计算机。
|
CISC(Complex
Instruction Set Computer):
|
复杂指令系统计算机。早期的计算机为了增加功能和更好地支持高级语言而不断地增加新的指令类型,使系统可以实现复杂的操作。这种指令系统功能复杂,寻址方式多,指令长度可变,指令格式多样。因而采用这种指令系统的计算机被称为复杂指令系统计算机。
|
RISC(Reduced
Instruction Set Computer):
|
精简指令系统计算机。这种计算机采用简化的指令系统,指令集中只包含程序中常用的指令,运算类指令只能是R-R型,提供大量通用寄存器以减少访存次数,采用流水线方式执行指令,控制器用硬连阵列逻辑实现,并采用优化的编译技术。
|
|