开门见山,这篇博客主要讲下不同地址数据指令的访存次数是怎么计算的,其实是计算机系统结构课的第三次homework。
三地址双操作数指令有3个显地址,其中,有两个源操作数地址,一个目标地址。指令执行后,不会破坏任一个操作数。
执行一条三地址的加法指令需要访问4次主存。第一次从主存中取指令,第二、三次从主存中取操作数,第四次将结果保存到主存单元中。
课本源码分析
MUL A, B, X
ADD X, C, X
SUB X, D, X
ADD E, F, Y
DIV X, Y, X
共有5条三地址指令,每条指令需要4次访存,执行此程序共需要访存20次。
二地址双操作数指令有两个显地址,第一个操作数地址同时兼作结果存放地址。
执行一条二地址的加法指令同样需要访问4次主存。第一次从主存地址中取指令,第二、三次从主存地址中取操作数,第四次将加法结果存放到主存单元中。
课本源码分析
MOV X, A
MUL X, B
ADD X, C
SUB X, D
MOV Y, E
ADD Y, F
DIV X, Y
共有7条二地址指令,MOV指令执行一次3次访存(读指令,读一次操作数,写一次操作数),算术运算指令4次访存,执行此程序共访存2 * 3 + 5 * 4 = 26次。
一地址双操作数指令只有一个显地址,参加运算的另一个操作数来自累加器寄存器Acc。
执行一条一地址的加法指令只需要访问两次主存,第一次从主存单元中取指令,第二次从主存单元中取操作数。由于第一操作数和运算结果都放在累加器寄存器中,所以读取第一操作数和存放加法的结果都不需要访问主存。
课本源码分析
LOAD E
ADD F
STORE X
LOAD A
MUL B
ADD C
SUB D
DIV X
STORE X
共需要9条一地址指令,每条指令2次访存,执行此程序共访存9 * 2 = 18次。
零地址双操作数指令中只有操作码字段,操作数地址都是隐含的。操作数在堆栈的栈顶位置和次栈顶位置,它们分别从堆栈中弹出,送到运算器中进行运算,运算的结果再压入堆栈。执行一条零地址的加法指令访问主存的次数取决于堆栈的结构。
课本源码分析
PUSH A
PUSH B
MUL
PUSH C
ADD
PUSH D
SUB
PUSH E
PUSH F
ADD
DIV
POP X
共需要12条执行,其中7条一地址的进、出栈指令,5条零地址的算术运算指令。
进、出栈指令3次访存,算术逻辑指令4次访存,执行程序共访存7 * 3 + 5 * 4 = 41次。
课本源码分析
MOVE R1, A ; 2次
MUL R1, B ; 2次
ADD R1, C ; 2次
SUB R1, D ; 2次
MOVE R2, E ; 2次
ADD R2, F ; 2次
DIV R1, R2 ; 0次
MOVE X, R1 ; 3次
6 * 2 + 3 = 15次。