- 计算机系统:从应用程序到底层实现
- 赵欢 杨科华编著
- 1018字
- 2025-05-07 10:52:31
1.2.3 程序中每条指令的执行
每个可执行目标文件中都包含机器代码段,可执行文件的执行实际上是对应机器代码段的执行过程。机器代码段由一条一条的机器指令构成。指令(Instruction)是一串用0和1表示的序列,用来指示CPU完成一个特定的原子操作,例如,取数指令(Load Instruction)从存储单元中取出一个数据存放到CPU寄存器中,存数指令(Store Instruction)将CPU寄存器中的内容写入一个存储单元,ALU指令(ALU Instruction)将两个寄存器中的内容进行某种算术或逻辑运算后再将结果送入一个CPU寄存器中,输出指令(Output Instruction)将一个CPU寄存器的内容送到I/O模块的某个缓存器中,等等。
可以看出,上述hello程序的执行过程中,需要通过取数指令将字符串“hello,world\n”中的每个字符从存储器送到CPU寄存器中,然后,再通过输出指令将其从CPU寄存器送到显示适配器(也称显示控制器)中。
指令通常被划分为若干个字段,包括操作码字段、地址码字段和立即数字段等。操作码字段指出指令的操作类型,如加、减、传送、跳转等;地址码字段指出指令所处理的操作数的地址,如寄存器编号、内存单元地址等;立即数字段指出具体的一个操作数或偏移地址等。
图1-5给出了实现两个相邻数组元素交换功能的不同层次语言的描述。在高级语言源程序中,可直观地用三个赋值语句实现;在经编译后生成的汇编语言源程序中,可用4个汇编指令表示,其中,两条指令是取数指令1w(Load Word),后两条指令是存数指令sw(Store Word);在经汇编后生成的机器语言程序中,对应的机器指令是特定格式的二进制代码,例如,第一条lw指令对应的机器代码为“1000 1100 0100 1111 0000 0000 0000 0000”,这是一条MIPS体系结构中的指令,其中,高6位“100011”为操作码,随后5位“00010”为寄存器编号2,再后面5位“01111”为另一个寄存器编号,最后16位表示立即数0。CPU能够通过逻辑电路直接执行这种二进制表示的机器指令。指令执行时通过控制器对指令操作码进行译码,解释成控制信号(Control Signal)控制数据通路执行,例如,控制信号ALUop=add可以控制ALU进行加法操作,RegWr=1可以控制将结果写入寄存器。

图1-5 不同层次语言之间的等价转换
每条指令的执行过程包括:从存储器取指令并计算下一条指令的地址、对指令进行译码、取操作数、对操作数进行运算、将运算结果保存到存储器或寄存器。每次从存储器取指令都是将PC的值作为指令的地址,因此,计算出的下一条要执行指令的地址被送到PC,当前指令执行完后,根据PC的值到存储器中取下一条指令,从而能够周而复始地执行程序中的每条指令。指令的执行由时钟信号(Clock Signal)进行定时,一条指令的执行可能需要一个或多个时钟的时间。